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つになりますが、どちらも良い方法とは言えません。
- 親テーマのfunctions.phpに手作業で追加していく
- ユーザー(オリジナルテーマを使っている人)にやり方を教えて子テーマの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のダウンロードページにリダイレクトを設定したり。
参考にしていただければ嬉しいです:)