スウェーデン人からの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のこれまた不具合の修正をしました(というか一部の表示されていない項目に気づかず…(。_。) )。アウトプットすると色々な気づきがあって勉強になるなぁ。