WordPressのREST API経由で記事を投稿したときに、SEO SIMPLE PACKで設定できるはずのメタディスクリプションが空のままになる。
原因は、SEO SIMPLE PACKが使っているカスタムフィールド(ssp_meta_で始まるメタキー)がREST APIに公開されていないためです。
register_post_meta()で登録し直せば、REST APIのmetaフィールドから読み書きできるようになります。
この記事では、そのためのPHPスニペットと動作確認の手順、実運用での注意点をまとめます。
結論:このスニペットを追加するだけ
先に完成形のコードを載せます。
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_title | titleタグ |
| ssp_meta_description | meta description |
| ssp_meta_keyword | meta keywords |
| ssp_meta_robots | meta robots(noindexなど) |
| ssp_meta_canonical | canonical URL |
| ssp_meta_image | og: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,metametaオブジェクトの中に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の使い方と初期設定にまとめています。


