WordPress
カスタムフィールドに配列を格納、特定のキーのみ値を更新する方法(プラグインなし)
タイトルの件、調べても簡単に見つからない内容だったので手短ですがご紹介したいと思います。カスタムフィールドをプラグインなしで追加する方法と参照し取得する方法はそれぞれ以下のリンク先をご覧ください。
カスタムフィールドをプラグインなしで追加する方法
プラグインなしで追加したカスタムフィールドの値を参照し取得する方法
カスタムフィールドに配列を格納
カスタムフィールドに値を保存する方法について、詳細は次の記事を参照ください。
上記記事の内容は理解している前提でご説明すると、カスタムフィールドに配列を格納するケースとしては、チェックボックスがあります。
<input type="checkbox" id="demo-01" name="demo[]" value="選択肢A" <?php if(strpos($demo, '選択肢A') !== false ){ echo 'checked'; } ?> />
<label for="demo-01">選択肢A</label>
<input type="checkbox" id="demo-02" name="demo[]" 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 = [
'strawberry',
'orange',
'apple'
];
?>
上記配列をfruits
というキーでカスタムフィールドに格納しているとします。投稿ページにおいて、このうちapple
をgrape
に変える場合は次のように記述します。
<?php
$postID = get_the_ID();
update_post_meta( $postID, 'fruits', 'grape', [2] );
?>
4番目の引数はこのように配列の中の順番を指定することができます。配列は最初の値が[0]なので、3番目は[2]ですね。’apple’と指定しても同じですが、順番で指定できるということと、その場合の記述方法が見つけづらいと思われますので、この記事が助けになればと思いました。
まとめ
カスタムフィールドは項目数が多ければプラグインのAdvanced Custom Fieldsを使ってしまった方が得策かもしれませんが、私としては管理の効率の問題だけなので、10個以内くらいなら、こうしてプラグインなしで扱う方が良いかと思っています。プラグイン側で何か問題が起こった場合の対処も大変ですしね。自分で書いたコードであれば、何か起こった場合の対処もそれに比べて楽なはずです。