2017-02-16 13 views
0

わかりました。私たち(私のチーム)は、アドバンストカスタムフィールドとポストエンバイロメントを組み合わせたクライアント用のカスタム機能を構築しました。投稿が公開または期限切れになる予定の場合、ACFで作成されたリレーションシップアレイに追加/削除されます。投稿を公開するプロセスは、次のとおりです。Wordpress、ACF関係配列&ポストエクスビリエータープラグイン奇妙な振る舞い - 配列内の項目が何とか失われる

クライアントは投稿を作成し、公開して期限を切る時間をスケジュールします。これは、WordpressとPost Expiratorプラグインのデフォルトの機能であるため、問題なく動作します。次に、ポストエディタにチェックボックスがあります。チェックボックスをオンにすると、 'true'が関係配列からそのポストを追加して削除する関数にフックします(ポストをホームページカルーセルに挿入するために使用されます)。これをローカルでテストすると素晴らしい結果が得られますが、クライアントはポストの有効期限より前に、関係配列からランダムに消えていくポストに問題が発生し続けることがあります。

私たちのローカルテストインストールではこのようなことは起こりませんが、私たちはいかなるデータも管理しておらず、コンテンツを更新していないので、私たちとクライアントのインストールの最大の違いです。

私たちはあらゆる種類のトラブルシューティングと調整を試みましたが、ローカルビルドを意図的に制動しようとしましたが、バグを再現できませんでした。だから、私はこれらの投稿がなぜ無作為に消えているのかについて、いくつかの新鮮なアイデアを手に入れています。

ありがとうございます!ここで

は、ACF関係配列を処理し、PHPの:

//Add post to homepage carousel on post update if posts ACF is checked true 
function add_post_to_homepage_carousel() { 
    $homepage_id  = get_option('page_on_front'); 
    $post_to_add  = get_post(); 
    $post_checked  = get_field('add_to_homepage_carousel', $post_to_add->ID); 
    $carray   = get_field('carousel_post_selection', $homepage_id); 

    if (!is_array($carray)) { 
    $carray = array(); 
    } 

    if ($post_checked === 'true' && !in_array($post_to_add, $carray, true)) { 
    array_unshift($carray, $post_to_add); 
    update_field('carousel_post_selection', $carray, $homepage_id); 
    } 
} 
add_action('save_post', 'add_post_to_homepage_carousel', 10, 2); 
add_action('publish_future_post', 'add_post_to_homepage_carousel', 10, 2); 

//clean carousel array if post expired or unset from wp editor 
function clear_carousel_array() { 
    $homepage_id  = get_option('page_on_front'); 
    $carray   = get_field('carousel_post_selection', $homepage_id); 
    $post_to_remove = get_post(); 
    $post_checked  = get_field('add_to_homepage_carousel', $post_to_remove->ID); 

    if (!is_array($carray)) { 
    $carray = array(); 
    } 

    if ($post_checked === 'false') { 
    if (($key = array_search($post_to_remove, $carray, true)) !== NULL) { 
     unset($carray[$key]); 
    } 
    update_field('carousel_post_selection', $carray, $homepage_id); 
    } 
} 
add_action('save_post', 'clear_carousel_array'); 

答えて

0

コードをいじりいくつかの時間を過ごした後、このいずれかが解決してしまった、最終的には、ので、ここで問題を修正するに短い書き込みアップです。

最初にまずOPを書いた後にバグが再現されました。問題は次のようなものでした。リレーションシップ配列に細かいポストが追加され、削除機能も働いていましたが、再度同じ投稿を表示すると、配列の最初の投稿が上書きされます。

比較機能in_arrayと私が使用していたアクションフックの両方に問題がありました。仕事をしたフックは、最終的にacf/save_postになり、ACF値$post_checkedがデフォルトのsave_postよりも良くなっています。

in_arrayは厳密に設定されていても、ポストオブジェクト全体を比較するとtrueを返すため、配列の比較には問題がありました。単純なforループがこのトリックを行い、完全なポストオブジェクトの代わりにポストIDに対して比較が行われました。

ここに改訂コードがあります。いくつかのものは少し冗長であり、機能はよりエレガントにすることができますが、それはうまく機能します。

function add_remove_carousel($post_ID) { 
    $current_post  = get_post(); 
    $homepage_id  = get_option('page_on_front'); 
    $carray   = get_field('carousel_post_selection', $homepage_id); 
    $post_checked  = get_field('add_to_homepage_carousel', $post_ID); 

    if($post_checked) { 
    if ($post_checked === 'Yes') { 
     $post_in_array = false; 
     foreach ($carray as $key => $post_obj) { 
     if($post_obj->ID == $post_ID) { 
      $post_in_array = true; 
      break; 
     }  
     } 
     if(!$post_in_array) { 
     $carray_n = array_merge(array($current_post), $carray); 
     $carray_n = array_values($carray_n); 
     update_field('carousel_post_selection', $carray_n, $homepage_id); 
     } 
    } 
    elseif ($post_checked === 'No') { 
     $post_in_array = false; 
     $post_key; 
     foreach ($carray as $key => $post_obj) { 
     if($post_obj->ID == $post_ID) { 
      $post_in_array = true; 
      $post_key = $key; 
      break; 
     }  
     } 
     if($post_in_array) { 
     $carray_n = array_diff_key($carray, array($post_key)); 
     $carray_n = array_values($carray_n); 
     update_field('carousel_post_selection', $carray_n, $homepage_id); 
     } 
    } 
    } 
} 

add_action('acf/save_post', 'add_remove_carousel', 11, 1);