ZATYのBLOG

お問い合わせする

【テーマ開発】WordPressのカスタムフィールドを使って投稿別でデータを紐付ける

WordPressには、カスタムフィールドという機能が用意されています。カスタムフィールドを使うことで投稿に対してデータを紐付けてPHPでデータを利用することができる用になります。

今回は、カスタムフィールドの使い方と仕様、使い道について掘り下げて解説します。

カスタムフィールドの使い方

カスタムフィールドは、WordPress管理画面の投稿編集から個別に設定することができます。投稿のコンテンツ編集部分下部にカスタムフィールドのフォームがあります。

WordPress投稿編集ページにカスタムフィールドのフォームが表示されます。

もしこのカスタムフィールドのフォームがない場合は、投稿編集ページの一番上表示オプションをクリックするとチェックボックスが表示されるので、「カスタムフィールド」のチェックボックスをオンにすることで上記のフォームが表示されます。

もし、「カスタムフィールド」のチェックボックスが表示されていない場合は、その投稿タイプがカスタムフィールドを利用しない設定になっている可能性があります。固定ページ(投稿タイプ: page)にカスタムフィールドを有効化するためには、functions.phpの下部に以下のコードを追記してください。

function add_custom_field_support () {
  add_post_type_support( 'page', 'custom-fields' );
}
add_action( 'init', 'add_custom_field_support' );

これでカスタムフィールドが有効化され、表示オプション内にカスタムフィールドのチェックボックスが表示されます。

投稿のカスタムフィールドフォームの「新規追加」をクリックすることで新たにカスタムフィールドを設定することができます。

名前の部分に入力する方を“メタキー(meta key)”と呼び、値の方を“メタバリュー(meta value)”と呼びます。メタキーは日本語にも対応していますが、予期しない動作を考慮して英数字とアンダースコア(_)を利用することをおすすめします。

テーマ内でカスタムフィールドを使う

投稿で作成したカスタムフィールドは、WordPress関数のget_post_meta関数を使うことで取得できます。

例えば投稿のカスタムフィールドに、メタキー"work_area"、メタバリュー"東京"と設定します。このデータをテーマ内で利用します。

<?php
$area_data = get_post_meta( get_the_ID(), 'work_area', true );
if ( $area_data ) :
?>
<p>対応地域:<?php echo $area_data; ?></p>
<?php
endif;
?>

get_post_metaの第一引数に投稿のIDを指定して、第二引数にメタキーを指定します。第三引数はBooleanを指定します。trueを指定することで、入力した内容がそのまま返されます。投稿に"work_area"のカスタムフィールドが登録されていない場合は、“対応地域:”という部分も表示されないようにするため、if文を利用します。

これによって投稿に登録されている東京が取得され、<p>対応地域:東京</p>が表示されます。

一度作成したメタキーはカスタムフィールドのメタキー選択のドロップダウンメニューに表示されるので、ほかの投稿ではここから選択することでメタキーの入力ミスの防止に繋がります。

カスタムフィールドの仕様

カスタムフィールドに設定したデータをget_post_meta関数で取得できると紹介しました。このほかに、カスタムフィールドを操作する一般的なWordPress関数として、update_post_meta関数とdelete_post_meta関数、add_post_meta関数があります。

これらの関数についての仕様をまとめます。

add_post_meta関数

<?php add_post_meta( $post_id, $meta_key, $meta_value, $unique = false ); ?>

この関数は、プログラムからカスタムフィールドを設定する関数です。

$post_idは投稿ID、$meta_keyはカスタムフィールドのメタキー、$meta_valueはカスタムフィールドのメタバリューです。

カスタム投稿タイプは、add_post_meta関数によって追加する場合は、メタバリューに配列を指定することができます。

<?php // 例
// 文字列の指定
$name = '配達サービス';
add_post_meta( get_the_ID(), 'service_name', $name, true );

// 配列の指定
$pricing = array( 'tokyo' => 1000, 'osaka' => 800 );
add_post_meta( get_the_ID(), 'area_pricing', $pricing, true );

文字列で指定したデータは、投稿編集画面のカスタムフィールドに表示されるようになりますが、配列で指定したものは表示されないため、注意です。

また、カスタムフィールドは、同じ投稿に同じメタキーのカスタムフィールドを設定することができます。add_post_metaの4つ目の引数にfalseを指定した場合は新しくデータを追加し、trueを指定した場合は投稿同じメタキーがあるかどうか調べて、ない場合に新しくデータを追加します。

get_post_meta関数

<?php get_post_meta( $post_id, $meta_key = '', $single = false ); ?>

この関数は、1つの必須引数と2つの任意引数を利用します。$post_idは投稿ID、$meta_keyはカスタムフィールドのメタキーを指定します。$meta_keyは初期状態で、空文字になっていて空文字を指定すると、その投稿に設定されているすべてのカスタムフィールドの情報を返します。

$singleの引数は、戻り値の形式を変更させます。この引数は、同じメタキーのカスタムフィールドが複数ある投稿を想定するかどうかで判断します。

上記した通り、カスタムフィールドは、同じ投稿に同じメタキーのデータを複数設定できます。例えば、同じ投稿にメタキー“fruit”メタバリュー“スイカ”とメタキー“fruit”メタバリュー“メロン”が設定されているとします。この時、$single = falseでカスタムフィードを取得すると以下のようになります。

<?php // 例
$meta_data = get_post_meta( get_the_ID(), 'fruit', false ); // falseはデフォルト値なので省略可
var_dump( $meta_data );
/**
 * array(2) {
 *   [0] => string(9) "スイカ"
 *   [1] => string(9) "メロン"
 * }
*/

順番は、登録した順番です。$single = trueで取得すると、falseで取得するときの最初のデータが返されます。(上記例だと“スイカ”)

falseまたは省略して取得した値の[0]を使用することは仕様上全く問題ないですが、メタキーがユニークキー(同じ投稿で1つしか使われていない)とわかっている場合は、明示的に$single=trueと設定しておくことで、コードの可読性が上がります。

update_post_meta関数

<?php update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ); ?>

この関数は、既存のカスタムフィールドを更新する際に使う関数です。$post_id(投稿ID)の$meta_key(メタキー)のカスタムフィールドのメタバリューを$meta_valueに指定したデータに置き換えます。

もし、$meta_keyに指定したメタキーが指定した投稿に設定されていない場合は、新しいカスタムフィールドとして追加されます。

$prev_valueは、更新するカスタムフィールドの以前のメタバリューを指定する引数です。これは、同じ投稿に複数の同じメタキーを持つカスタムフィールドがあるときに役に立ちます。

get_post_metaの時、サンプルに挙げた“fruit”メタキーに“スイカ”と“メロン”の2つのデータが設定されているときの場合、$prev_value = "スイカ"と指定することで、メタキーが“fruit”メタバリューが“スイカ”のカスタムフィールドを$meta_valueに指定したデータに更新することができます。

<?php // 例
update_post_meta( get_the_ID(), 'fruit', 'レモン' );
$meta_data = get_post_meta( get_the_ID(), 'fruit' );
var_dump( $meta_data );
/**
 * array(2) {
 *   [0] => string(9) "レモン"
 *   [1] => string(9) "メロン"
 * }
*/

ここで注意するのが、同じ投稿に複数の同じメタキーを持つカスタムデータがある状態で、4つ目の引数である$prev_valueを指定せずに関数を実行すると、エラーなどは起こらず指定したメタキーのメタバリューが全て更新されます。

delete_post_meta関数

<?php delete_post_meta( $post_id, $meta_key, $meta_value = '' ); ?>

登録済みのカスタムフィールドを削除する関数です。$post_idと、$meta_keyはどの投稿のどのメタキーを削除するか指定するための引数です。$meta_valueは、update_post_meta関数の時と同様、投稿に同じメタキーが複数あるときのための引数です。

隠しカスタムフィールド

メタバリューが配列ではないカスタムフィールドは、投稿編集画面のフォームに表示されると説明しました。しかし、プログラム上のみ使用したいカスタムフィールドもあります。カスタムフィールドのメタキーの先頭に_をつけることで、投稿編集画面に表示されないカスタムフィールドのデータにすることができます。

<?php // 例
add_post_meta( get_the_ID(), '_secret_meta_key', '非表示データ', true );

カスタムフィールドの使い道

カスタムフィールドは、さまざまな場面で活用できますが、ここでは特によく使う場面を紹介します。

エリアページの店舗情報

カスタム投稿タイプで作成された投稿に対して、コンテンツ以外のデータを表示したい場合にカスタムフィールドがよく使われます。

特に、店舗を複数持つサービスは“対応エリア”というカスタム投稿タイプがよく作成されています。SEOの観点からも店舗毎の住所や電話番号、営業時間などは重要なコンテンツなため、これらをそれぞれカスタムフィールドにして入力を簡略されます。

<?php // 例 ?>
<dl>
  <dt>店舗名</dt>
  <dd><?php echo esc_html( get_the_title() ); ?>
<?php
$meta_keys = array(
  '住所'     => 'area_address',
  '電話番号' => 'area_tel',
  '営業時間' => 'area_time'
);
foreach ( $meta_key as $key => $value ) :
  $meta_value = get_post_meta( get_the_ID(), $value, true );
  if ( $meta_value ) :
?>
  <dt><?php echo $key; ?></dt>
  <dd><?php echo $meta_value; ?></dd>
<?php
  endif;
endforeach;
?>
</dl>

投稿の閲覧数

投稿の閲覧数をカスタムフィールドに記録し、update_post_meta関数で記録値を更新することで投稿の閲覧数を計測することができます。

投稿のいいね数

投稿の閲覧数の計測と同様にいいね数の計測に活用することもできます。

<?php // 例
$post_id = get_the_ID();
$meta_key = '_favorite_count';
$before_value = get_post_meta( $post_id, $meta_key, true );
if( $before_value ) {
  $after_value = (int) $before_value + 1;
  update_post_meta( $post_id, $meta_key, $after_value );
}else {
  add_post_meta( $post_id, $meta_key, 1, true );
}

まとめ

今回は、WordPressのカスタムフィールドについてまとめました。

カスタムフィールドを使うことで、投稿別にデータを結びつけることができます。WEBサイトの運用やメンテナンスがしやすくなるほか、プログラミング知識ない人が投稿の作成が簡単になるメリットがあります。

プログラミングスキルが少ない人がメンテナンスしやすいように、カスタムフィールドのフォームをカスタマイズすることも可能です。一般的にこれには、post_meta関数などの知識とセキュリティ関連のプログラミング知識が必要ですが、プラグインで簡単に作成することもできます。

プラグインを使う時は、更新頻度や開発者の情報を精査した上で活用するようにしましょう。