WordPress

カスタムフィールドに配列を格納、特定のキーのみ値を更新する方法(プラグインなし)

タイトルの件、調べても簡単に見つからない内容だったので手短ですがご紹介したいと思います。カスタムフィールドをプラグインなしで追加する方法と参照し取得する方法はそれぞれ以下のリンク先をご覧ください。

カスタムフィールドをプラグインなしで追加する方法
プラグインなしで追加したカスタムフィールドの値を参照し取得する方法

カスタムフィールドに配列を格納

カスタムフィールドに値を保存する方法について、詳細は次の記事を参照ください。

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

上記記事の内容は理解している前提でご説明すると、カスタムフィールドに配列を格納するケースとしては、チェックボックスがあります。

<input type="checkbox" id="demo-01" name="demo&#91;&#93;" value="選択肢A" <?php if(strpos($demo, '選択肢A') !== false ){ echo 'checked'; } ?> />
<label for="demo-01">選択肢A</label>
<input type="checkbox" id="demo-02" name="demo&#91;&#93;" value="選択肢B" <?php if(strpos($demo, '選択肢B') !== false ){ echo 'checked'; } ?> />
<label for="demo-02">選択肢B</label>

name属性の値をdemo[]のようにすることで、demoをキーとしたカスタムフィールドを配列として値を入力していくことができます。

ちなみにこのコードでは、$demoという変数に次のように値を入れて、該当すればチェックを入れるということをしています。

<?php
//配列を分割して文字列変数に格納
$demo = esc_html(get_post_meta($post->ID, 'demo', true));
if($demo):
   $demo = implode(", ", get_post_meta($post->ID, 'demo', true));
endif;
?>

カスタムフィールドの値を更新する

update_post_metaの関数でカスタムフィールドの値を更新します。
カスタムフィールドを追加する場合はadd_post_metaの関数が別に用意されてますが、update_post_metaは追加も兼ねます。つまり、add_post_metaを実行してない状態でupdate_post_metaを使っても新規にカスタムフィールドの値が追加されます。

<?php
update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );
?>
$post_id
投稿ID、ページIDです。
$meta_key
カスタムフィールドのキー。これはadd_meta_boxを使って追加した場合はその時に決まりますし、update_post_metaで初めて追加する場合はこの時点で初めて決まります。
$meta_value
更新する値です。ここに配列を指定すれば、カスタムフィールドに配列が格納されます。
$prev_value
更新したいカスタムフィールドの値。ここが今回のポイントです。省略可能ですが、省略すれば配列の場合はすべての値が更新されますし、配列の特定の値のみ更新する場合は、指定が必要です。

add_post_metaでカスタムフィールドを追加する場合は、3つ目の引数がカスタムフィールドの値なので、そこに配列を指定すれば配列が格納されます。

配列の特定の値のみ更新する方法

<?php
$fruits_array = &#91;
   'strawberry',
   'orange',
   'apple'
&#93;;
?>

上記配列をfruitsというキーでカスタムフィールドに格納しているとします。投稿ページにおいて、このうちapplegrapeに変える場合は次のように記述します。

<?php
$postID = get_the_ID();
update_post_meta( $postID, 'fruits', 'grape', &#91;2&#93; );
?>

4番目の引数はこのように配列の中の順番を指定することができます。配列は最初の値が[0]なので、3番目は[2]ですね。’apple’と指定しても同じですが、順番で指定できるということと、その場合の記述方法が見つけづらいと思われますので、この記事が助けになればと思いました。

まとめ

カスタムフィールドは項目数が多ければプラグインのAdvanced Custom Fieldsを使ってしまった方が得策かもしれませんが、私としては管理の効率の問題だけなので、10個以内くらいなら、こうしてプラグインなしで扱う方が良いかと思っています。プラグイン側で何か問題が起こった場合の対処も大変ですしね。自分で書いたコードであれば、何か起こった場合の対処もそれに比べて楽なはずです。

著者のイメージ画像

株式会社BringFlower
稲田 高洋(Takahiro Inada)

2003年から大手総合電機メーカーでUXデザインプロセスの研究、実践。UXデザイン専門家の育成プログラム開発。SEOにおいても重要なW3Cが定めるWeb標準仕様策定にウェブアクセシビリティの専門家として関わる。2010~2018年に人間中心設計専門家を保有、数年間ウェブアクセシビリティ基盤委員も務める。その後、不動産会社向けにSaaSを提供する企業の事業開発部で複数サービスを企画、ローンチ。CMSを提供し1000以上のサイトを分析。顧客サポート、サイト運営にも関わる。
2022年3月にBringFlowerを開業し、SEOコンサル、デザイン、ウェブ制作を一手に受ける。グッドデザイン賞4件、ドイツユニバーサルデザイン賞2件、米国IDEA賞1件の受賞歴あり。