web-dev-qa-db-fra.com

Vérifier l'existence d'un champ personnalisé

J'utilise le plugin Advanced Custom Fields et je souhaite effectuer une requête pour afficher toutes les publications où un champ "date" est avant aujourd'hui et où un autre champ personnalisé (un rapport) a une valeur.

Pour l'instant, j'ai ceci, mais je reçois toujours tous les événements passés.

       '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

Selon la chaîne de commentaires de la question, le problème semble être que la clé activiteit_verslag est définie pour un grand nombre ou toutes les publications, même si la valeur est vide/NULL. EXISTS vérifie uniquement la présence dekey. La valeur n'est pas prise en compte, donc trop est renvoyée.

Je peux voir quelque chose à faire pour vous.

La première consiste à utiliser != au lieu de EXISTS.

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

Cela devrait fonctionner, maisseulementsi vos valeurs sont systématiquement définies sur une chaîne vide etseulementsi lecléest défini pour tous les messages.

WP_Query/WP_Meta_Query n'est pas capable d'une logique complexe comme vous auriez besoin de vérifier si la clé n'est pas définie ou si elle est vide, bien que vous puissiez écrire des filtres pour la faire fonctionner ... mais ne le faites pas. Le SQL résultant deviendra de moins en moins efficace au fur et à mesure que la logique deviendra plus compliquée.

La bonne solution consiste à sauvegarder et à modifier la façon dont vos données sont sauvegardées. Si vous avez une valeur vide pour cette clé activiteit_verslag, alorssupprimez la clé. Si vous faites cela, alors votre requête ci-dessus devrait fonctionner (évidemment non testée mais je suis assez sûr) et vous obtiendrez probablement la requête la plus efficace possible pour cette circonstance.

Je me rends compte que vous utilisez Advanced Custom Fields pour effectuer votre travail à votre place, mais @ialocin pense que le plug-in peut comporter des filtres vous permettant de modifier son comportement. Je n'utilise pas ACF (ni beaucoup d'autres plugins parce que d'autres personnes ne pensent pas comme moi et ont donc tort :)), donc je ne sais pas ce que vous pouvez ou ne pouvez pas faire avec ses hooks, mais le hook Core save_post devrait faire dans un pincement.

Preuve de concept:

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