カスタムフィールドをすべてのカスタム投稿タイプに追加する方法

30

WordPressには独自の情報(メタデータ)を追加できる「カスタムフィールド」という便利な機能があります。

例えば、SEOプラグインもその機能を利用したもので、説明文(ディスクリプション)やキーワードといった情報を投稿者が任意で追加できるようにしています。

このカスタムフィールド、投稿者が自分で「名前」を決めて値を設定することもできますが、先程のSEOプラグインのようにテーマやプラグイン側で用意することも多いです。

僕の自作テーマ「4536」でも、プラグインなしでSEO対策をできるようにしたり、301リダイレクトできるようにしたり、canonicalを設定できるようにしたり、このカスタムフィールドをけっこう活用しているんですが、中にはカスタムフィールドを追加できないケースがありました。

それは、プラグインで生成されたカスタム投稿タイプです。

プラグインで生成された場合の対応が難しい

なぜ、プラグインが生成したカスタム投稿タイプにカスタムフィールドを追加するのが難しいかというと、追加するにはカスタム投稿タイプの「名前」を指定しなければいけないからです。

例えば、bbpressのフォーラムページにカスタムフィールドを追加する場合は以下のようなコードになります。

function add_custom_fields() {
  add_meta_box( 'forum_setting', 'SEO対策', 'custom_box', 'forum', 'advanced' );
}
add_action('add_meta_boxes', 'add_custom_fields');

「forum」の部分が名前ですね。

ここを「custom_post_type」のように指定できれば話は簡単なんですが、それはできません。

つまり、テーマの開発者ができる対応は基本的に以下の2つになりますが、どちらも良い方法とは言えません。

  1. 親テーマのfunctions.phpに手作業で追加していく
  2. ユーザー(オリジナルテーマを使っている人)にやり方を教えて子テーマのfunctions.phpに追加してもらう

すべてのカスタム投稿タイプに一括で追加する方法

この問題を解決するために僕が考えたこと。

それは「すべてのカスタム投稿タイプの名前を配列で取得してループ処理させること」です。

そんな関数きっとあるよね!と思って探してみたんですが、案の定「get_post_types」という関数を発見しました。

get_post_types関数の使い方

すべてのカスタム投稿タイプに追加する場合は以下のようなコードになります。

function add_custom_fields() {
 $args = [
  'public' => true,
  '_builtin' => false
 ];
 $post_types = get_post_types( $args, 'names' );
 foreach ( $post_types as $post_type ) {
  add_meta_box( 'forum_setting', 'SEO対策', 'custom_box', $post_type, 'advanced' );
 }
}
add_action('add_meta_boxes', 'add_custom_fields');

テーマ側で作成したカスタム投稿タイプはもちろん、プラグインが生成したものにもすべてカスタムフィールドが追加されます。

利用シーン

「アーカイブページを含めてすべてのページをnoindexにしたい」なんて場合はrobots.txtを使った方が簡単ですが、「この投稿だけnoindexにしたい」みたいな場合は今回の方法を使うと便利です。

例えば、bbPressの特定のフォーラムだけnoindexにしたり、Download Managerのダウンロードページにリダイレクトを設定したり。

参考にしていただければ嬉しいです:)

カテゴリー WordPressカスタマイズ

この記事が良かったらいいね!最新情報が届きます!

この記事を書いた人 :

WEBメディア「MORIAWASE」の運営者。求人広告会社の元施設長で、趣味は音楽制作(DTM)。育児に奮闘中です!