Welcartの商品情報を一括登録するためのCSVインポート機能から予め把握しているカスタムフィールドのフィールド名(例:sc_number など)に値を保存した後にフロントで “get_field(‘sc_number’)” のように保存された値の取得しようとしても取得することが出来ません。
Advanced Custom Fields(以下、ACF)が用意している関数( get_field() )から取得するには、以下のようにフィールド名の前にアンダーバーがついた meta_key(_sc_number)とmeta_value(field_5e8abbee31fe9)のフィールドキーをセットでもっている必要がありますが、インポート直後は存在しないためACFの関数経由で取得出来ません。
ACFフィールド名からACFフィールド情報を取得する
ACFの設定情報は wp_posts テーブルに保存されていますので、$wpdb で直接データベースから取得する関数を追加します。
/**
* ACFフィールド名からACFフィールド情報を取得する
* 例)
* $post->post_name field_5e75b311f4c5a
* $post->post_title 枚数
* $post->post_excerpt sc_number
*/
function ag_get_acf_field_ByFieldName($field_name)
{
global $wpdb;
$table = $wpdb->prefix.'posts';
$query = "SELECT * FROM $table WHERE post_type='acf-field' AND post_status='publish' AND post_excerpt= %s";
$result = $wpdb->get_row( $wpdb->prepare( $query, $field_name) );
return $result;
}
ラベルや選択肢など取得
post_content フィールドにシリアライズされた状態でデータが格納されていますので、以下のように上記で追加した関数を実行したあと、post_contentの値を取得します。
$acf_post = ag_get_acf_field_ByFieldName('sc_number');
var_dump($acf_post->post_content)
post_contentフィールドの値
a:13:{s:4:"type";s:6:"select";s:12:"instructions";s:0:"";s:8:"required";i:0;s:17:"conditional_logic";i:0;s:7:"wrapper";a:3:{s:5:"width";s:2:"20";s:5:"class";s:0:"";s:2:"id";s:0:"";}s:7:"choices";a:10:{i:0;s:27:"▼選択してください";i:1;s:4:"1枚";i:2;s:4:"2枚";i:5;s:4:"5枚";i:6;s:4:"6枚";i:10;s:5:"10枚";i:12;s:5:"12枚";i:20;s:5:"20枚";i:30;s:5:"30枚";i:35;s:5:"35枚";}s:13:"default_value";a:0:{}s:10:"allow_null";i:0;s:8:"multiple";i:0;s:2:"ui";i:0;s:13:"return_format";s:5:"array";s:4:"ajax";i:0;s:11:"placeholder";s:0:"";}
ACFの関数経由 get_field() で取得出来るにする方法
CSVからインポートした時点で、wp_postmeta テーブルに値は格納されていますので、対象が商品数(投稿数)それほど多くなければ管理画面から更新ボタンをポチっとすれば取得出来るようになりますし、対象が多ければ一括で更新するためのバッチをつくり “update_field()” を使い更新します。
update_field() で更新
第一引数にACFのフィールドキー(field_5e8abbee31fe9)、第二引数に保存したい値、第三引数に投稿IDを指定して実行します。
update_field( $acf_post->post_name, 10, $post_id );
動作環境情報
エックスサーバー(x10) PHP 7.3.14 MySQL 5.7 WordPress 5.4.1
コメント
この記事が非常に参考になりました。ありがとうございます。
ただ1点コメント残しておきます。ag_get_acf_field_ByFieldName関数のSQLだと条件が1つ足りないようでした。
というのも、post_excerpt は別のフィールドグループ(または繰り返しフィールドを複数設置するなど)で同じ値がセットできるようなので、このSQLだと最初の1件目がヒットして別のpost_nameが取れてしまいます。
条件にpost_parentを含めて、グループの投稿IDを設定する必要があると思います。
コメントいただき有り難うございます!!
また、ご指摘いただき有り難うございます。m(_ _)m
まだ確認できておりませんが、改めて確認したいと存じます!