プラグインなしで投稿タイプにカスタムフィールドを追加する


WordPressでは投稿タイプに用意されたブロックのフィールドの他に、独自にカスタムフィールドを用意して利用していきたいことがあります。
多くの方はWordPressのプラグインを使って、手軽にカスタムフィールドを追加していくことでしょう。

しかし、プラグイン等で作成されたカスタム投稿タイプでは、プラグインを使ったカスタムフィールドの作成に対応していない場合もあります。
そうした場合は独自でプログラムを書いて、対象のカスタム投稿にカスタムフィールドを追加していくことになります。

ここでは、プラグインなしで投稿タイプにカスタムフィールドを追加する方法についてご紹介します。

カスタムフィールドの追加


独自でカスタムフィールドを追加するには、functions.phpにプログラムを書いていくことになります。
そして、WordPressのadd_meta_box関数を使っていきます。
以下、基本となるプログラムになります。

function 関数名(){
  add_meta_box(
    'cf_01', // メタボックスのdivに付与されるID
    'メタボックスのタイトル', //タイトル
    'form_custom_fields', //フィールドを指定する関数
    'post', //投稿タイプ
    'normal', //セクションの表示場所
    'default'  //優先度
  );
}
add_action('admin_menu', '関数名');


カスタムフィールドのメタボックスに付与されるIDや、メタボックスのタイトルわかりやすい名前で定義していきます。
投稿タイプは、ワードプレスの投稿でしたら「post」になります。
他、セクションの表示場所や優先度など。

では、独自で作成したカスタム投稿や、プラグイン等を使って追加したカスタム投稿ではどうなるのか。
以下のサンプルコードでご紹介します。

サンプルでは、WordPress Download Managerのプラグインで作成された投稿タイプを例に見ていきます。
関数「set_custom_fields」を作成しまして、add_action関数でadmin_menuのアクションフックします。関数内ではadd_meta_box関数を使い、管理画面にmeta boxを追加します。

functions.php

//カスタムフィールドの定義
function set_custom_fields() {
  add_meta_box( 'meta_num', '管理番号', 'form_custom_fields', 'wpdmpro', 'normal');
}
add_action('admin_menu', 'set_custom_fields');

//管理画面にHTMLを出力
function form_custom_fields() {
  global $post;
  echo '<p>管理番号 <input type="text" name="contents_num" value="'.get_post_meta($post->ID, 'contents_num', true).'" size="30"></p>';
}

//カスタムフィールドの値を保存
function save_custom_fields( $post_id ) {
  if(!empty($_POST['contents_num'])) {
    update_post_meta($post_id, 'contents_num', $_POST['contents_num'] );
  } else {
    delete_post_meta($post_id, 'contents_num');
  }
}
add_action('save_post', 'save_custom_fields');


管理画面にHTMLを出力するプログラムでは、カスタムフィールドの定義のadd_meta_box関数で定義した、フィールドを指定する関数を指定する関数「form_custom_fields」で関数のプログラムを実行します。
グローバル変数の$postから「$post->ID」を管理できるようにしながら、echoでHTMLを出力します。
ポイントはinputタグのname属性やvalue属性です。「contents_num」で値を送受をします。

最後は、カスタムフィールドの値を保存するプログラムになります。
if文にて、スーパーグローバル変数「$_POST」でカスタムフィールドの値「contents_num」がある場合は、update_post_meta関数でカスタムフィールドの値を更新します。
カスタムフィールドの値がなければ、delete_post_meta関数でカスタムフィールド情報を削除します。
最後にadd_action関数でsave_postのアクションフックします。

functions.phpを保存しますと、対象のカスタム投稿にてカスタムフィールドが確認できます。

カスタムフィールドの追加

カスタムフィールドの値を取得する


カスタムフィールドが作成できたところで、続いてはカスタムフィールドの値を取得する方法について見ていきます。

通常はループ内での値の取得することでしょう。
get_post_meta関数を使って、記事ID(投稿ID)「$post->ID」やカスタムフィールドの値「contents_num」を引数にとります。

get_post_meta関数の構文

get_post_meta( $post_id, $key, $single );



以下のプログラムを、表示させるテンプレートファイルに記述します。

<?php
$value = get_post_meta( $post->ID, 'contents_num', true );
echo $value;
?>


get_post_meta関数で取得した値は、変数で管理していくと汎用性が高くなるでしょう。

また、if文でカスタムフィールドの値がある場合とない場合で、処理を切り分けてもいいでしょう。

<?php
$value = get_post_meta( $post->ID, 'contents_num', true );
if( $value ){ 
  echo $value; // カスタムフィールドの値がある場合
} else {
  // カスタムフィールドの値がない場合
}
?>



WordPressでは投稿タイプのループ内でカスタムフィールドの値を取得していくことがほとんどですが、場合によってはループ外でカスタムフィールドの値が必要な時もあります。

ループ外での値の取得


特殊な場合ですが、ループ外での値の取得する場合は、上記のループ内のプログラムでは動作しません。ループ内での記事IDが取得できないためです。
ループ外での処理では、記事IDが分かればループ内と同じように、get_post_meta関数を使うことで値が取得できます。

以下は記事IDが「72」である場合になります。

<?php
// カスタムフィールドの値を取得
$value = get_post_meta( 72, 'contents_num', true );
// カスタムフィールドの値がある場合
if( $value ){ 
  echo $value;
}
?>



ループ内の処理とループ外の処理の違いは、記事IDを取得するか直接指定するかの違いになります。

まとめ


投稿タイプもカスタムフィールドも、手軽に追加できるプラグインを利用することが多いかと思いますが、便利なカスタムフィールドがうまく追加できないこともありますので、プラグインなしでカスタムフィールドを追加する方法を知っておくと良いでしょう。

あまりプラグインを利用したくない方も、add_meta_box関数を使って簡単なカスタムフィールドを作成してみてください。