スウェーデン人からのissue
公開しているWordPressのプラグイン、Markup (JSON-LD) structured in schema.orgを管理しているGithubのリポジトリにスウェーデンの方からissueが。
Invalid markup is generated when a post type is using a URL path that doesn’t contain a post in the parent path.
In my case I have a custom post type Menu which generates it’s URLs in the format of domain.com/menus/<post-name> but nothing exists for domain.com/menus.
何々?「投稿タイプが親パスを含んでいない場合、無効なマークアップが生成されます。私の場合は、domain.com/menus/<postname>
という形式でURLを生成するカスタム投稿タイプ「Menu」がありますが、domain.com/menus
は存在しません。」て言ってる。発生したソースコードもらいました。
{ "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": { "@id": "https://www.domain.com", "name": "Home" } }, { "@type": "ListItem", "position": 2, "item": { "@id": false, "name": "Menus" } }, { "@type": "ListItem", "position": 3, "item": { "@id": "https://www.domain.com/menu/dinner-menu/", "name": "Dinner Menu" } } ] }
あ、本当だ。2つ目の要素がfalseになっている。どういう組み方をしたら発生するのかな?と思ってカスタム投稿タイプを作ってみる。
function create_post_type() { register_post_type( 'menus', array( 'labels' => array( 'name' => 'menus', 'singular_name' => 'menus' ), 'public' => true, 'has_archive' => false ) ); } add_action( 'init', 'create_post_type' );
うわ、発生した!問題は、register_post_type()
関数の引数にある、has_archive
をfalseにすると発生する。そうか、archiveを持たなくてもスウェーデンの方がいうようにURLはdomain.com/menus/<postname>
になるのか。パーマリンクの設定にもよるとは思うけど。いずれにしろバグなので修正開始。
get_post_type_archive_link()関数を制御
カスタム投稿ページのパンくずリストを作る際にget_post_type_archive_link()関数
を使ってアーカイブページのリンクを作成しています。has_archive
をfalseにしているとアーカイブが作られないので、投稿タイプオブジェクトでhas_archive
の判断をしても良いのですが、 get_post_type_archive_link()
内でカスタム投稿オブジェクトを取得して判断しているので、それをそのまま使いたいと思います。
if ( get_post_type_archive_link( get_post_type() ) ) { $item_array[] = $this->set_schema_breadcrumb_item( get_post_type_archive_link( get_post_type() ), post_type_archive_title( '', false) ); }
分岐処理を入れていなかったため、アーカイブを持たないカスタム投稿タイプの場合、falseが返ってきてそのまま@idにfalseがセットされていていたようです。分岐処理を入れたのでアーカイブを持たないカスタム投稿タイプの場合、出力されないようになりました。
{ "@context": "http://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": { "@id": "https://www.domain.com", "name": "Home" } }, { "@type": "ListItem", "position": 2, "item": { "@id": "https://www.domain.com/menu/dinner-menu/", "name": "Dinner Menu" } } ] }
詳しい修正内容はGithubにissueを立てているので、差分を参考に。連絡いただいたスウェーデン人の方からもテストOK!もらいました\(^o^)/
Markup (JSON-LD) structured in schema.org version 3.2.0 Release.
今回のバグ修正を含めたversion3.2.0のリリースをしました。WordPress4.7.2での動作チェックとOrganization Schemaのこれまた不具合の修正をしました(というか一部の表示されていない項目に気づかず…(。_。) )。アウトプットすると色々な気づきがあって勉強になるなぁ。