web-dev-qa-db-ja.com

カスタムフィールドの存在を確認

Advanced Custom Fieldsプラグインを使用しています。 "date"フィールドが今日より前で、別のカスタムフィールド(レポート)に値があるすべての投稿を表示するクエリを実行したいと思います。

今のところ私はこれを持っていますが、私はいつも過去のイベントをすべて手に入れています。

       'post_type' => 'activiteit',
   'meta_key' => 'activiteit_datum',
   'post_status' => 'publish',
   'orderby' => 'meta_value',
   'order' => 'DESC',
   'meta_query' => array(
      'relation' => 'AND',
      array( 'key' => 'activiteit_verslag','compare'=>'EXISTS'),
      array( 'key' => 'activiteit_datum', 'compare' => '<', 'value' => $fullDate,'type' => 'DATE')

   )
);

$pastActivities=query_posts($arg);
1
Mister Melotte

問題のコメントの文字列によると、値が空/ NULLであっても、activiteit_verslagキーが多数、またはすべての投稿に設定されているようです。 EXISTSキーの存在をチェックするだけです。値は考慮されないため、返される値が多すぎます。

あなたがやるべきことがいくつかあります。

1つ目はEXISTSの代わりに!=を使うことです。

array( 
  'key' => 'activiteit_verslag',
  'value' => '',
  'compare' => '!='
),

これはうまくいくはずですが、値が常に空の文字列に設定されている場合はonlyキー - の場合はonlyはすべての投稿に設定されています。

WP_Query/WP_Meta_Queryは、キーが設定されていないか設定されているが空であるかどうかをチェックする必要があるような複雑なロジックには対応していません。結果のSQLは、ロジックが複雑になるにつれて効率が低下します。

正しい解決策は、データの保存方法をバックアップして変更することです。そのactiviteit_verslagキーに空の値がある場合は、キーを削除します。あなたがそうするならば、上記のあなたの質問は(明らかにテストされていないが私はかなり確信している)うまくいくはずで、あなたはおそらくこの状況のた​​めの最も効率的な可能な質問を持つでしょう。

私はあなたがあなたのためにあなたの仕事をするために高度なカスタムフィールドを使っていることを認識します、しかし@ialocinはプラグインがあなたがその振る舞いを変えることを可能にするフィルタを持つかもしれないと思います。私はACF(または他の人が私のことを考えていないので間違っているので他の多くのプラグイン)を使用しないので、私はあなたがそのフックでできること、できないことを知りませんが、Coreフックsave_postはつまんでやるべきです。

コンセプトの証明:

add_action(
  'save_post',
  function($pid) {
    $empty = get_post_meta($pid,'delete_me',true);
    if (empty($empty)) {
      delete_post_meta($pid,'delete_me','');
    }
  }
);
4
s_ha_dum