【Advanced Custom fields】記事の投稿時に、カスタムフィールドの値を投稿済のフィールドから取得し更新する【WordPress】
カスタムフィールドをカスタム投稿を組み合わせた時に、通常の投稿というより決まったものをデータとして残すような使い方が多いのではないかと思います。
同じワードプレスの中で、すでに投稿したのと同じ値をもう一度入力するのもなんかなぁ。と思って、「投稿済のカスタムフィールドから値を取ってくる。」というのをやってみました。
「公開」時に特定のフィールドの値を更新したい
実現したい動作は、「記事を公開した時に、特定のカスタムフィールドの値が、投稿済みの記事のカスタムフィールドの値を参照して更新される」、という感じです。
回りくどい言い方になりますが、例えば投稿記事Aの記事タイトルである「これはTEST」とカスタムフィールドの「これはカスタムフィールド」を呼び出すにはどうするか?ということです。
記事タイトルであれば、フィールドタイプを「投稿オブジェクト」にして記事タイトルを取得すれば良いですが。
1 2 3 4 | <!--?php //投稿オブジェクトから投稿タイトルを呼び出す get_field( 'フィールド名', $post_id )->post_title; ?> |
カスタムフィールドは後付けのモノなので、通常の投稿の配列には入ってないだろうなと。
そこら辺の呼び出しをどうするかです。
あれこれ考えた結果、Advaned Custom Fields(以下、「ACF」と表記させて頂きます。)を使ってるので過去に書いた「投稿オブジェクト」と「タイトルの自動生成」を使えば見た目も分かりやすいかなと。
先にコード全文を載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <!--?php //ACFのアクションフックの利用 add_action( 'acf/save_post', 'auto_cf_value', 20 ); function auto_cf_value( $post_id ){ //投稿タイプで動作するように編集中の投稿タイプを取得 $post_type = get_post_type( $post_id ); if( $post_type == 'test' ){ //投稿タイプがtestなら動作 //自動生成する値を設定する $post_test_id = get_field( 'test-post' ); //フィールドタイプ「投稿オブジェクト」のフィールド値を取得 $test_field = get_field( 'test-field', $post_test_id->ID ); //IDを投稿オブジェクトから取得 $test_field_value = '(' . $test_field . ')'; //フィールドに埋め込む値を作成 $test_field_value_s = sanitize_text_field( $test_field_value ); //サニタイズ処理 //フィールドの値を更新する update_field( 'フィールドキー', $test_field_value_s, $post_id ); } } ?> |
ではなにをやってるかを書いて行きます。
ACFのアクションフック「acf/save_post」を使う
1 2 3 4 5 6 | <!--?php //ACFのアクションフックの利用 add_action( 'acf/save_post', 'auto_cf_value', 20 ); function auto_cf_value( $post_id ){ ?--> |
タイトル自動生成の記事でも使用したアクションフック「acf/save_post」を使用します。
ワードプレスの記事投稿の公開・更新のタイミングに合わせて動作して欲しいので。
このアクションフックで動作させる関数を定義していきます。
3つ目のパラメーターでは、関数が動作する優先順位を指定しています。
投稿(公開)時にも作動させる場合には、優先順位の設定が必要です。
一度記事を投稿した後の、更新のタイミングのみ動作して欲しい場合は、優先順位の設定は不要です。
コードの上から順番にの方が良いんだとは思いますが・・・ちょっと先のものから説明します。
カスタムフィールドの値を更新する「update_field()」
ACFで作成したカスタムフィールドなので、ACFで用意されているカスタムフィールドの値を更新するupdate_field()を使います。ちょうど良いものが用意されているものです。
1 2 3 4 | <?php //update_fieldのパラメーター update_field( 'フィールド名またはフィールドキー', '更新する値', 更新する投稿のID ); ?> |
update_field()の前ではこのパラメーターに入れる変数の処理をやってます。
第1引数は保存するフィールドが固定、第3引数も保存するのは現在の投稿なので良いとして。
第2引数の値が引っ張ってくる元のカスタムフィールドの値によって変わるので変動します。
せっかくなので、パラメーターを一つずつ書いてみます。
フィールド名またはフィールドキー
ここで、更新するカスタムフィールドを指定します。
使用できるのは、カスタムフィールドを作成した時に決めたフィールド名かフィールドキーです。
フィールド名はACFのフィールドグループ画面から確認できます。
フィールドキーは少し手間がかかりますが。
カスタムフィールド>ツール>フィールドグループをエクスポートで調べたいフィールドがあるグループを選択し、「Generate PHP」ボタンを押します。
すると、カスタムフィールドの設定コードが表示されるので、’key’の行にある’field_数字列’がフィールドキーとなります。
このキーを使えば、更新するフィールドを指定することができます。
フィールド名でも指定できるはずなんですが、自分が確認した限りでは動かなかったので。
フィールドキーで行う方が確実だと思います。フィールドキーの方が指定は強いですし。
新しい値
今回の一番の問題はここです。
他の投稿のカスタムフィールドの値を取ってくるので、get_field()を使用しますがそのパラメーターでIDを指定しなければなりません。
1 2 3 4 | <?php //get_fieldのパラメーター get_field( 'フィールド名', 呼び出すフィールドがある投稿のID ); ?> |
フィールド名は取得するカスタムフィールドの名前を指定するだけです。
IDをどうするかですが。
投稿に関わるデータを取得するので、フィールドタイプ「投稿オブジェクト」を使用すればIDが取れます。
クエリ―を作ってとも思ったんですが、カスタムフィールドを使っているのでこちらの方が分かりやすいなと。
投稿のタイトルも表示されるので、引っ張ってくる元の投稿にも間違いがないのかの確認にもなるので良いかと。
なので、
・投稿オブジェクトから取得したIDを変数に入れる。
・取得したIDで取得するカスタムフィールドの値を呼び出す
・更新する値を作成する
・第2引数に入れる
ということをやっています。
これが~行目の内容です。
1 2 3 4 5 6 7 8 | <?php if( $post_type == 'test' ){ //投稿タイプがtestなら動作 //自動生成する値を設定する $post_test_id = get_field( 'test-post' ); //フィールドタイプ「投稿オブジェクト」のフィールド値を取得 $test_field = get_field( 'test-field', $post_test_id->ID ); //IDを投稿オブジェクトから取得 $test_field_value = '(' . $test_field . ')'; //フィールドに埋め込む値を作成 $test_field_value_s = sanitize_text_field( $test_field_value ); //サニタイズ処理 ?> |
IDの取得は変数に入れなくても大丈夫です。
同じ投稿から複数のフィールドの値を取得する場合は、変数に入れた方が楽ですが。
保存するID
ここで使用するIDは、値を保存するカスタムフィールドがある投稿のID、つまり現在編集中の投稿なので、そのままで良いです。
分かりやすく、$post_idを入れておいてます。
以上です。これで他の投稿のカスタムフィールドの値を使って、現在の投稿のカスタムフィールドの値を自動で更新できます。
自動入力なのでreadonlyをつけたら親切
無事カスタムフィールドの値を自動入力できるようになりました。
が、自分以外の人にも編集させる場合は入力しなくて良い事が伝わらないと、二度手間となってしまいます。
投稿時に入力された値は、update_field()で指定した内容に上書きされるので、不具合にはなりませんが。
入力してくれた人が「せっかく入力したのに・・・」とならないように、入力できないようにして上げます。
入力不可と言えば「readonly」です。
これを入れるためには、カスタムフィールドの設定の中にあるreadonlyの内容を上書きする必要があります。
なので、こちらもACFのフィルターフック「acf/load_field/key=フィールドキー」を使用します。
1 2 3 4 5 6 7 8 | <?php //ACFで作成したカスタムフィールドにreadonlyを付ける add_filter( 'acf/load_field/key=フィールドキー', function ( $field ) { $field[ 'readonly' ] = 1; return $field; }); ?> |
フィールドキーの調べ方は先ほどと一緒です。update_field()で使ったものと同じだとは思います。
これが動作すると、指定したカスタムフィールドが入力できなくなってます。
あまり使わない方法かもしれませんね
今回は投稿をデータベースのように扱う制作をしている時に使用したコードの紹介となりました。
ACFで用意されている関数を使った内容なので、プラグインを使用する前提とはなってしまいますが。
便利はプラグインは使いこなしていきたいですからね。
同じようなことをやろうと考えている方の参考になればと思います。
※2022.9.29追記
acf/save_postのパラメーターで優先順位を指定しないと、公開時には動作しないことを見落としていましたので、追記しました。
株式会社東建工業-インターネット事業部-
イラスト制作例
当社はオリジナルイラストの制作を行っております。
制作例を一部掲載していますので、是非ご覧ください!
当社のデザイン作成について
当社はWEB制作に加え、デザイン作成と制作も行っております。
・チラシ、パンフレット等の紙媒体に使用するデザインと制作
・オリジナルデザインでのクリアホルダーの制作
・オリジナルデザインでのステッカー、シールの制作
・オリジナルデザインでのプリントTシャツの制作
などなど・・・
様々なデザインに関する制作をご依頼頂けます。
詳しくは当社のデザイン作成についてのブログ記事をご覧ください。
前の記事
【WordPress】Advanced Custom fields の投稿オブジェクトが便利だった
次の記事
【Advanced Custom fields】ユーザーフィールドを使ってユーザー情報を呼びだす【WordPress】
こちらも読まれています
お問い合せ
この記事の内容や当社についてのお問い合わせはこちらのフォームをご覧下さい。
ご利用前に当社のプライバシーポリシーと免責事項をお読み下さい。
送信ボタンを押された時点で、当社プライバシーポリシー又は、免責事項にご同意頂いたものとみなします。