[eccube2]商品情報用構造化データマークアップの構築

地味に大変。

環境

ECCUBE2.11.4

やりたいこととか前提

ヘッダー部に挿入ができない

手を入れるサイトがそういう組み方だから仕方がない。<head>以外に書いても通用するらしいので、商品詳細の中に記述する。そうなってくると逆に楽な話で、商品名とか価格とかは普通に出力してるから該当する項目に足していけばいいじゃん、ってことになる。

こうする

<script type="application/ld+json">
{
  "@context" : "http://schema.org",
  "@type" : "Product",
  "name" : "<!--{$arrProduct.name|h}-->",
  <!--{if $smarty.const.SHOP_DETAIL_IMGMETHOD == '1'}-->
      <!--{assign var=key value="main_image"}-->
  "image" : "<!--{$arrFile[$key].filepath|h}-->",
  <!--{elseif $smarty.const.SHOP_DETAIL_IMGMETHOD == '2'}-->
  "image" : [
<!--{assign var=key value="main_image"}-->
        "<!--{$arrFile[$key].filepath|h}-->"
        <!--{section name=cnt loop=$smarty.const.PRODUCTSUB_MAX}-->
<!--{assign var=key value="sub_title`$smarty.section.cnt.index+1`"}-->
<!--{assign var=ckey value="sub_comment`$smarty.section.cnt.index+1`"}-->
<!--{assign var=key value="sub_image`$smarty.section.cnt.index+1`"}-->
<!--{assign var=lkey value="sub_large_image`$smarty.section.cnt.index+1`"}-->
            <!--{if $arrProduct[$key]|strlen >= 1}-->
            ,"<!--{$arrFile[$key].filepath}-->" 
            <!--{/if}-->
        <!--{/section}-->
  ],
  <!--{/if}-->
  "description" : "【抜粋文】",
  "sku" : "<!--{$arrProduct.product_code_min|h}-->",
  "brand" : {
    "@type" : "Brand",
    "name" : "【ブランド名】",
    "logo" : "【ロゴ画像URL】"
  },
  "offers" : {
    "@type" : "Offer",
    "price" : "<!--{$arrProduct.price02_min|sfCalcIncTax:$arrSiteInfo.tax:$arrSiteInfo.tax_rule}-->",
    "priceCurrency" : "JPY",
    "itemCondition": "NewCondition",
    "availability": "<!--{if $arrErr.quantity == ""}-->InStock<!--{else}-->OutOfStock<!--{/if}-->",
    "url" : "<!--{$smarty.const.P_DETAIL_URLPATH}--><!--{$arrProduct.product_id|u}-->"
  }
}
</script>

【】のところをいい感じに変えて、管理画面から商品詳細の中に突っ込む。最低限は揃えたつもり。空欄だったらどう処理されるのかわからないので無記入になるところは削る。とはいえ、必須項目もあるので注意。そのへんは別の記事で書くので割愛。

むしろこれで良かった気がする

<head>に入れられないのはモヤモヤしたけど条件分岐が入ってくると商品詳細上でいじった方が楽だわって思う。そうでなくとも変数化すればソースコードがゴチャ付かない良さもあるんだけどね。

更に手をいれるなら

商品によっては検索避けしたいやつも出てくるわけで、こんな作り込みは不要になる。カテゴリとか商品のIDで条件分岐を被せたら挿入を回避できる。

特定カテゴリ商品の除外(最下層)

「このカテゴリのやつには入れない」のルールは地味に面倒で、何でかって言えば指定するカテゴリがどの階層にあるかとか、商品に複数カテゴリを指定していてちゃんと拾えるのかとか、色んな意味で手間がかかる。

今回は「最下層のカテゴリを指定する、カテゴリの複数登録対応」を前提に条件分岐を構築。

<!--{if count($arrRelativeCat) > 0}-->
  <!--{section name=cnt loop=$arrRelativeCat}-->
    <!--{assign var="num" value=$arrRelativeCat[cnt]|@count}-->
    <!--{assign var="num2" value=`$num-1`}-->
    <!--{if $arrRelativeCat[cnt].$num2.category_id == 【除外カテゴリ1】}-->
        <!--{assign var="productJson" value="false"}-->
    <!--{/if}-->
    <!--{if $arrRelativeCat[cnt].$num2.category_id == 【除外カテゴリ2】}-->
        <!--{assign var="productJson" value="false"}-->
    <!--{/if}-->
    <!--{if $arrRelativeCat[cnt].$num2.category_id == 【除外カテゴリ3】}-->
        <!--{assign var="productJson" value="false"}-->
    <!--{/if}-->
  <!--{/section}-->
<!--{/if}-->

<!--{if $productJson != "false"}-->
上記の内容
<!--{/if}-->

Smartyに不慣れすぎて非常に手間取った。とりあえずは該当カテゴリだと変数に特定の値(false)を指定する条件分岐からはじまって、変数の値が一致しなければ表示するって感じに。elseifで対応できない内容なのでメチャクチャ行数がかかるのは仕方がない。でも、それで設定された変数は他で使いまわしが効くのでそこまで悪いものでもない。みたいな。

条件分岐の参考はここ。

[EC-CUBE 2.11.4] 商品詳細ページで、所属カテゴリごとに表示画像やテキストを変えたい | NAKWEB × EC-CUBE
EC-CUBEのネットショップ構築からEC-CUBEカスタマイズはお任せください。規模に応じた料金プランをご用意しております。カスタマイズブログも運営中。お見積もりは無料!お気軽にお問い合わせください

振り返り

ECCUBEはやればやるほど手間がかかる。マジで。

2系は古いけどニーズがありすぎて今なお使われてる感じだけど、それはそれで良いことだと思うんだけど、システムにかかわるレベルでのカスタマイズを各々でやらなきゃいけないのはキツいなーって。自社ECが持てるってのに脱モールしたはずなのに似たりよったりのサイトばっかりだったのはここらへんがエグいからだろうねって。めんどくさすぎる。一度組んでしまえば財産になるからやる気のある制作会社は伸びまくったんだろうけどね。どうなんでしょう。まあ、全くいじれないのは嫌だけど、いじれるにしてもしんどいですねこれ。

項目について

上記内容で最低限は賄えてるのでクロールされたら有効になる。

だけど「有効(警告あり)」になる。警告は以下のあたり。

  • 項目「priceValidUntil」がありません(「offers」に含まれる)
  • 項目「aggregateRating」がありません
  • 項目「review」がありません
  • グローバル ID が指定されていません(例: gtin、mpn、isbn)

推奨項目が未記入状態だってことなので問題ないっちゃない。

警告で項目「priceValidUntil」「aggregateRating」「review」がありません、グローバル ID が指定されていません(例: gtin、mpn、isbn)と出ます - Google 検索セントラル コミュニティ

無いものは無いんだから無理だよ。あれば足したらいいです。

反映について

SEOってのはWEBサイト側による能動的な反映作業はできなくて、サーチコンソールでサイトマップを読み込ませてGoogleが早く対応してくれることを祈るしかない。数百の商品ページを申請して、1週間そこらで処理されたのは40件とか。毎日徐々に増えてるのでまだるっこしいやら歯がゆいやら。

とりあえずクロールからの反映はページ単位になるので、ページ内に商品情報とパンくずを仕込んであれば両方とも処理される。段階的に進めるのが効率は良いけど、できれば登録内容はさっさと揃えて待つだけにしておきたい。

コメント

タイトルとURLをコピーしました