お知らせ内容をここに入力してください。 ボタン

SEO SIMPLE PACK│メタ情報をREST APIから設定する方法

WordPressのREST API経由で記事を投稿したときに、SEO SIMPLE PACKで設定できるはずのメタディスクリプションが空のままになる。

原因は、SEO SIMPLE PACKが使っているカスタムフィールド(ssp_meta_で始まるメタキー)がREST APIに公開されていないためです。

register_post_meta()で登録し直せば、REST APIのmetaフィールドから読み書きできるようになります。

この記事では、そのためのPHPスニペットと動作確認の手順、実運用での注意点をまとめます。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

結論:このスニペットを追加するだけ

先に完成形のコードを載せます。

add_action( 'init', function () {
	$keys = array( 'ssp_meta_description', 'ssp_meta_title', 'ssp_meta_robots',
	               'ssp_meta_canonical', 'ssp_meta_image', 'ssp_meta_keyword' );
	foreach ( array( 'post', 'page' ) as $post_type ) {
		foreach ( $keys as $key ) {
			register_post_meta( $post_type, $key, array(
				'type'          => 'string',
				'single'        => true,
				'show_in_rest'  => true,
				'auth_callback' => function () { return current_user_can( 'edit_posts' ); },
			) );
		}
	}
} );

子テーマのfunctions.phpか、スニペット管理プラグイン(Code Snippetsなど)に貼り付けます。

これだけで、REST APIのレスポンスにmetaフィールドが現れ、更新もできるようになります。

なぜREST APIから設定できないのか

WordPressのカスタムフィールドは、登録されていない限りREST APIに出てきません。

register_post_meta()(もしくはregister_meta())でshow_in_restをtrueにして初めて、wp/v2/postsのmetaオブジェクトに含まれるようになります。

SEO SIMPLE PACKは管理画面のメタボックスから直接update_post_meta()で保存する実装になっているため、REST APIへの公開登録は行われていません。

そのため管理画面からは問題なく編集できるのに、APIからは触れないという状態になります。

この挙動が問題になるのは、たとえば次のようなケースです。

  • Google Apps Scriptやn8nから記事を自動投稿している
  • AIで生成した本文とメタディスクリプションをまとめて下書き投稿したい
  • 既存記事のディスクリプションを一括で書き換えたい
  • ヘッドレス構成でフロント側からSEO情報を取得したい

対象となるメタキー

スニペットで登録している6つのキーは、それぞれ管理画面の入力欄に対応しています。

メタキー対応する項目
ssp_meta_titletitleタグ
ssp_meta_descriptionmeta description
ssp_meta_keywordmeta keywords
ssp_meta_robotsmeta robots(noindexなど)
ssp_meta_canonicalcanonical URL
ssp_meta_imageog:image

キー名はプラグインのバージョンによって変わる可能性があります。

自分の環境で確実に確認したい場合は、SEO SIMPLE PACKで実際にディスクリプションを入力した記事を1本用意して、wp_postmetaテーブルを覗くのが早いです。

SELECT meta_key, meta_value FROM wp_postmeta WHERE post_id = 123;

WP-CLIが使えるならこちらのほうが手軽です。

wp post meta list 123

コードの解説

initフックで登録する

register_post_meta()はinit以降で呼ぶのが定石です。

initは管理画面・フロント・REST APIリクエストのいずれでも実行されるので、これひとつで全経路をカバーできます。

rest_api_initで登録すると管理画面側で参照できず、逆に早すぎるタイミングだと投稿タイプがまだ登録されていない可能性があります。

singleをtrueにする

singleをtrueにすると、metaフィールドの値が配列ではなく文字列で返ってきます。

falseのままだと配列扱いになり、APIから渡す値も配列にしなければならず面倒です。

SEO SIMPLE PACK側の保存も単一値なので、trueが正解です。

show_in_restがこのスニペットの本体

show_in_restをtrueにすることで、REST APIのスキーマにメタキーが追加されます。

ここがfalse(デフォルト)だと、いくら値を渡してもAPI側で無視されます。

auth_callbackで書き込み権限を制御する

auth_callbackは、そのメタキーを編集してよいかを判定するコールバックです。

上のコードではcurrent_user_can( ‘edit_posts’ )としており、投稿者以上の権限を持つユーザーだけが書き込めます。

より厳密にしたい場合は、記事単位で判定する形に変えられます。

'auth_callback' => function ( $allowed, $meta_key, $post_id ) {
	return current_user_can( 'edit_post', $post_id );
},

実際にはREST API側で投稿そのものの編集権限チェックが先に走るため、edit_postsのままでも他人の記事を勝手に書き換えられるわけではありません。

とはいえ多人数運用のサイトなら、記事単位の判定にしておくほうが安全です。

動作確認する

読み取りを確認する

ブラウザで次のURLを開きます。

https://example.com/wp-json/wp/v2/posts/123?_fields=id,meta

metaオブジェクトの中にssp_meta_descriptionなどが並んでいれば登録成功です。

{
  "id": 123,
  "meta": {
    "ssp_meta_description": "この記事の説明文です",
    "ssp_meta_title": "",
    "ssp_meta_robots": "",
    "ssp_meta_canonical": "",
    "ssp_meta_image": "",
    "ssp_meta_keyword": ""
  }
}

metaフィールド自体が空のオブジェクトなら、スニペットが読み込まれていないかキー名が違っています。

書き込みを確認する

書き込みには認証が必要なので、WordPressのアプリケーションパスワードを発行しておきます。

ユーザープロフィール画面の「アプリケーションパスワード」から発行できます。

curl -X POST "https://example.com/wp-json/wp/v2/posts/123" \
  -u "user:xxxx xxxx xxxx xxxx xxxx xxxx" \
  -H "Content-Type: application/json" \
  -d '{"meta":{"ssp_meta_description":"APIから設定したディスクリプション"}}'

実行後、管理画面の投稿編集画面にあるSEO SIMPLE PACKのメタボックスを開くと、値が反映されているはずです。

実際のページソースでmeta descriptionタグを確認できれば完璧です。

カスタム投稿タイプにも対応させる

上のコードはpostとpageだけを対象にしています。

カスタム投稿タイプも使っているなら、REST API対応の投稿タイプを自動で拾う形にすると管理が楽になります。

add_action( 'init', function () {
	$keys = array( 'ssp_meta_description', 'ssp_meta_title', 'ssp_meta_robots',
	               'ssp_meta_canonical', 'ssp_meta_image', 'ssp_meta_keyword' );

	$post_types = get_post_types( array( 'show_in_rest' => true ), 'names' );
	unset( $post_types['attachment'] );

	foreach ( $post_types as $post_type ) {
		foreach ( $keys as $key ) {
			register_post_meta( $post_type, $key, array(
				'type'          => 'string',
				'single'        => true,
				'show_in_rest'  => true,
				'auth_callback' => function ( $allowed, $meta_key, $post_id ) {
					return current_user_can( 'edit_post', $post_id );
				},
			) );
		}
	}
}, 20 );

優先度を20にしているのは、カスタム投稿タイプの登録がinitで行われるためです。

デフォルトの優先度10だと、投稿タイプの登録より先に走ってしまうことがあります。

注意点

metaの値は誰でも読める

show_in_restをtrueにすると、公開記事のGETレスポンスに未ログインでも値が含まれます。

SEOメタ情報はもともとHTMLソースに出力されるものなので実害はありませんが、同じ発想で他のカスタムフィールドを開放するときは中身を確認してください。

プラグイン更新でキー名が変わる可能性がある

ssp_meta_という接頭辞はプラグイン内部の実装であり、公式に保証されたAPIではありません。

メジャーアップデート後に自動投稿のディスクリプションが入らなくなったら、まずキー名の変更を疑ってください。

二重登録にはならない

プラグイン側がすでに同じキーを登録していた場合でも、register_post_meta()は上書き登録されるだけです。

管理画面のメタボックスは従来どおり動作するので、既存の運用を壊す心配はありません。

robotsの値は決まった文字列で渡す

ssp_meta_robotsは自由入力ではなく、noindexやnofollowといった決まった選択肢を保存しています。

APIから設定する前に、管理画面で一度選択して実際にどんな文字列が入るかを確認しておくと確実です。

まとめ

register_post_meta()にshow_in_restを付けて登録し直すだけで、SEO SIMPLE PACKのメタ情報をREST APIから読み書きできるようになります。

自動投稿の仕組みを作っている場合、本文と一緒にディスクリプションまで入れられるようになるので、後から手作業で埋める工程がまるごと消えます。

同じ考え方は他のプラグインのカスタムフィールドにも応用できるので、APIから触れないメタ情報に出会ったらまず登録状況を疑ってみてください。

プラグインの基本的な設定は、SEO SIMPLE PACKの使い方と初期設定にまとめています。

  • URLをコピーしました!

プラグインの設定でお困りなら

プラグインの導入・カスタマイズ代行

プラグインの選定から設定、競合の解消、動作に合わせた追加実装まで承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次