先日書いたWelcartとGoogle ショッピングの連動のフィードですが、Googleにエラーを表示されるのが嫌で更にいじって複数SKUに対応してみました。
もうバイクとは程遠いネタばかりでスイマセンm(uu)m
Welcartの複数SKUにも対応させたxml商品フィード
前回のフィードは、上位にあるSKUからデータを出力していて複数SKUには対応出来ないフィードでしたが、Googleショッピングはバリエーション事の登録を推奨しているようでエラーメッセージを出されてしまいます。
そこで、シングルSKUと複数SKUで異なる出力をするようにしてみました。
<?php /** * RSS2 Feed Template for displaying RSS2 Posts feed. * * @package WordPress */ header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true); $more = 1; echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'; ?> <rss version='2.0' xmlns:g='http://base.google.com/ns/1.0'> <channel> <title><?php bloginfo_rss('name'); wp_title_rss(); ?></title> <description><?php bloginfo_rss("description") ?></description> <link><?php echo get_option('home'); ?></link> <?php do_action('rss2_head'); ?> <?php while( have_posts()) : the_post(); usces_the_item();?> <?php if(usces_sku_num() === 1) : usces_have_skus(); ?> <item> <title><?php the_title(); ?></title> <g:brand><?php echo get_post_meta($post->ID , 'ブランド' ,true); ?></g:brand> <g:condition>new</g:condition> <description><?php echo get_post_meta($post->ID , '説明' ,true); ?></description> <g:id><?php the_ID(); ?></g:id> <g:availability><?php if(usces_the_itemZaiko('return') =='在庫有り'){echo 'in stock';}else{$zaiko='out of stock'; echo $zaiko; } ?></g:availability> <g:image_link><?php usces_the_itemImageURL(0); ?></g:image_link> <link><?php the_permalink_rss() ?></link> <g:mpn><?php usces_the_itemCode(); ?></g:mpn> <g:price><?php usces_the_firstPrice(); ?></g:price> <g:material><?php echo get_post_meta($post->ID , '素材' ,true); ?></g:material> <g:google_product_category><?php echo get_post_meta($post->ID , 'googleカテゴリ' ,true); ?></g:google_product_category> <g:product_type><?php echo get_post_meta($post->ID , 'ショップカテゴリ' ,true); ?></g:product_type> <g:gender><?php echo get_post_meta($post->ID , '性別' ,true); ?></g:gender> <g:age_group>年齢(直接の書いたほうが良い)</g:age_group> <g:color><?php echo get_post_meta($post->ID , '色' ,true); ?></g:color> <?php do_action('rss2_item'); ?> </item> <?php elseif(usces_sku_num() > 1) : usces_have_skus(); ?> <?php do { ?> <item> <title><?php the_title(); ?></title> <g:brand><?php echo get_post_meta($post->ID , 'ブランド' ,true); ?></g:brand> <g:condition>new</g:condition> <description><?php echo get_post_meta($post->ID , '説明' ,true); ?></description> <g:id><?php usces_the_itemSku(); ?></g:id> <g:item_group_id><?php the_ID(); ?></g:item_group_id> <g:availability><?php if(usces_the_itemZaiko('return') =='在庫有り'){echo 'in stock';}else{$zaiko='out of stock'; echo $zaiko; } ?></g:availability> <g:image_link><?php usces_the_itemImageURL(0); ?></g:image_link> <link><?php the_permalink_rss() ?></link> <g:mpn><?php usces_the_itemCode(); ?></g:mpn> <g:price><?php usces_the_firstPrice(); ?></g:price> <g:material><?php echo get_post_meta($post->ID , '素材' ,true); ?></g:material> <g:google_product_category><?php echo get_post_meta($post->ID , 'googleカテゴリ' ,true); ?></g:google_product_category> <g:product_type><?php echo get_post_meta($post->ID , 'ショップカテゴリ' ,true); ?></g:product_type> <g:gender><?php echo get_post_meta($post->ID , '性別' ,true); ?></g:gender> <g:age_group>年齢(直接の書いたほうが良い)</g:age_group> <?php if(usces_the_itemSkuDisp('return') =='Sサイズ'){echo '<g:size>S</g:size>';} if(usces_the_itemSkuDisp('return') =='Mサイズ'){echo '<g:size>M</g:size>';} if(usces_the_itemSkuDisp('return') =='Lサイズ'){echo '<g:size>L</g:size>';} if(usces_the_itemSkuDisp('return') =='LLサイズ'){echo '<g:size>LL</g:size>';}?> <g:color><?php $SkuDisp = usces_the_itemSkuDisp('return'); if(preg_match("/[SML]/", $SkuDisp)){ echo get_post_meta($post->ID , '色' ,true); }else{ echo usces_the_itemSkuDisp(); } ?></g:color> <?php do_action('rss2_item'); ?> </item> <?php } while (usces_have_skus()); ?> <?php endif; ?> <?php endwhile; ?> </channel> </rss>
こんな感じですが、僕PHPって触り始めて3ヶ月位の超独学人間なので、面倒なphpにしてしまった事は分かってます。なんか上手くいかなかったんだもん(汗)
ひとまず、サイズはあるものはGoogleで推奨の通りに出せるように変換。それ以外の複数SKUはカラー属性のアイテムになるでしょうからそうしています。サイズ属性でSKUを出力したものはカスタムフィールド値で出力。
グループIDなるものも必要なので、それをページIDにしました。個別の独自IDはSKUコードになる設定です。
シングルSKUの場合は前回のフィードと同様。
ちなみにこれ、そのままディレクトリに入れてもあんまり機能しないです。それぞれカスタムフィールドを設定する必要がありますし、コピペだけじゃ動きませんのであしからず・・・・。
ついでに、昨日少し調べたらGoogle ショッピングって去年アタリから有料のサービスになってしまったようですね・・・。非常に残念ですがビジネスですから仕方無い事でしょう。
有料に伴い、正直利用するのかは分かりませんが、どうにもエラーを表示されるのが気に入らなくて作り変えてしまったワケです。歳と共に妙な拘りが身に付いて邪魔で仕方ありません。
とは言え非常に勉強になりました。しかし時間も大量に浪費してしまいましたので、少しぐらいは使ってみようかなー・・・。せっかく作ったphpだし。
更についでに、このコード使ってもエラーが出ます。ショップのほうの構造化もチェックするようですので、エラーメッセージを嫌う僕のような人はショップの構造化(スキーマーが推奨っぽい)をやる必要があるようです。
もう一つついでに、どこかにエラーがあるようで、たまに商品を重複して出力させてしまいます。340アイテム分出力して、9アイテムの重複が出てしまいました。
どこが間違ってるのか分かる方、教えて頂けたら嬉しいなぁー 重複自体は破棄されるから別に良いけど(こーゆのは完璧を求めませんw)
もしも、こんな事でWelcartのご発展に役立つならと思って恥ずかしながら公開です。
ではでは・・・
それにしても、僕はどこに向かっているのでしょうか・・・