
###追記2
DB未保存のカスタムフィールドの値を取得するのに、
$_POST["fields"]["フィールドキー"](フィールドキーは$_POST["fields"]をvar_dumpすると取れます)を使うことが分かりました。これを使えば投稿の新規作成時でもカスタムフィールドの値が取れます。
しかし、これを使うと、下記のように全ての値が
新規作成時の投稿のカスタムフィールドのものと同じになってしまいます。
array(2) { ["field_5a50f527cbddc"]=> string(3) "yes" ["field_5a52618c69f7f"]=> string(0) "" } array(2) { ["field_5a50f527cbddc"]=> string(3) "yes" ["field_5a52618c69f7f"]=> string(0) "" } array(2) { ["field_5a50f527cbddc"]=> string(3) "yes" ["field_5a52618c69f7f"]=> string(0) "" } array(2) { ["field_5a50f527cbddc"]=> string(3) "yes" ["field_5a52618c69f7f"]=> string(0) "" } array(2) { ["field_5a50f527cbddc"]=> string(3) "yes" ["field_5a52618c69f7f"]=> string(0) "" }
###追記
mizさんに教えていただきましたこちらのページ(そのページに載ってたリンクも含む)を見て、
カスタムフィールドの値を取得するタイミングとアクションを起こすタイミングが上手くいっていないということまでは分かりました。
(そこからが分かりません..)
■ACF | acf/save_post
https://www.advancedcustomfields.com/resources/acf-save_post/
■Why isn't acf/save_post firing? - ACF Support
https://support.advancedcustomfields.com/forums/topic/why-isnt-acfsave_post-firing/
###前提・実現したいこと
WordPressで投稿を新規作成したタイミング(投稿を更新したりしたタイミングも含む)で、
その投稿のタイトルや投稿時間をJSONファイルに突っ込むという実装をおこなっています。
投稿の新規作成時に
その内容にACFで作成したラジオボタンの値も含めたいというのが実現したいことです。
###発生している問題・エラーメッセージ
投稿を新規作成したタイミングだと、ラジオボタンの値が反映されません。
しかし、投稿を更新したりすると値が反映されるようになります。
######JSONの値(正しい形)
{ "title":"test", "start":"2018-01-08 03:53:31", "url":"http:test.jp/static_directory/archive/123", "value":ok }
値の一番下"value"にACFのget_fieldで取得した値が入ります。
ラジオボタンにはokとnoを設定しているのでそのどちらかが入るはずです。
######JSONの値(現状)
{ "title":"test", "start":"2018-01-08 03:53:31", "url":"http:test.jp/static_directory/archive/123", "value":false }
現状はfalseになっています。
###該当のソースコード
PHP
1<?php 2 3/** 4 * 投稿が行なわれたタイミングでJSONファイルを生成するフック 5 * 6 * @param string $new_status 新しいステータス 7 * @param string $old_status 以前のステータス 8 * @param object $post 該当する投稿オブジェクト 9 */ 10function makes_json($new_status, $old_status, $post) { 11 12 13if (function_exists('xdebug_disable')) { 14 xdebug_disable(); 15} 16 17 if($new_status == 'publish') { 18 switch($old_status) { 19 case 'draft': 20 case 'pending': 21 case 'auto-draft': 22 case 'future': 23 case 'publish': 24 case 'inherit': 25 // Get ALL Posts 26 $args = array( 27 'numberposts' => -1, 28 'orderby' => 'post_date', 29 'order' => 'DESC', 30 ); 31 $posts = get_posts($args); 32 $homeUrl = 'http:test.jp/static_directory'; 33 if (count($posts) == 0) { return; } 34 foreach ($posts as $post) { 35 $cal_fields = get_field("switch", $post->ID); 36 $output_json[date('Ym', strtotime($post->post_date))][] = array( 37 'title' => $post->post_title, 38 'start' => $post->post_date, 39 'url' => $homeUrl . '/archives/' . $post->ID, 40 'value' => $cal_fields, 41 ); 42 } 43 44 // Get Upload Directory 45 $upload_dir = wp_upload_dir(); 46 $upload_dir = $upload_dir['basedir'].'/json'; 47 48 // Create Directory 49 if (file_exists($upload_dir) == FALSE) { 50 mkdir($upload_dir, 0777); 51 } 52 53 // Delete All JSON Files 54 array_map('unlink', glob($upload_dir.'/*.json')); 55 56 // Create JSON Files 57 foreach ($output_json as $key => $value) { 58 file_put_contents($upload_dir . '/'.$key.'.json', json_encode($value)); 59 } 60 break; 61 } 62 } 63} 64add_action('transition_post_status', 'makes_json', 10, 3); 65
###試したこと
この自作関数内のコードの一部分(file_put_contentsなどファイルやディレクトリの作成を除く)を投稿一覧ページのPHPファイルに移してみると、
投稿の新規作成時の段階で、ラジオボタンの値をちゃんと取ることができました。
デバッグとして、get_field()
でラジオボタンの値を取得するタイミングをズラすために
sleep()
を指定しましたが、効果はありませんでした。
その他var_dump()
を使って投稿一覧ページでテストしたときの
$postの値と比較をしたりしましたが、
比較して異なる大きな部分としては、get_field()
が、
投稿の新規作成時に働くか否かという部分でした。
###補足情報(言語/FW/ツール等のバージョンなど)
PHP 7.1.9
WordPress 4.9


回答2件
あなたの回答
tips
プレビュー