先日書いた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のご発展に役立つならと思って恥ずかしながら公開です。
ではでは・・・
それにしても、僕はどこに向かっているのでしょうか・・・
