J'essaie de rechercher un type de publication personnalisé pour un système de galerie. J'ai une case à cocher pour définir une galerie en tant que galerie "sélectionnée" (configurée via le plugin More Fields) - si cette case est cochée, la méta-valeur devient 1 et, si elle n'est pas cochée, elle devient 0. Tout va bien. Cependant, si la case n'a jamais été cochée, la clé méta n'est jamais créée, ce qui signifie que je ne peux pas interroger NOT LIKE 1 car elle n'existe pas.
La requête que je veux, c'est extraire 4 galeries qui ne sont pas marquées "1" dans cette méta-valeur, mais aussi celles qui n'ont pas cette valeur du tout. Existe-t-il un moyen de toujours donner aux publications nouvellement ajoutées une valeur par défaut pour cette clé méta (c’est-à-dire, leur attribuer toujours la valeur 0 par défaut si la case n'est pas cochée) ou existe-t-il un moyen de rechercher la clé non encore définie?
Ma requête actuelle est:
$args = array(
'post_type' => 'gallery',
'showposts' => 4,
'meta_key' => 'gal-ID',
'order_by' => 'meta_value',
'order' => 'ASC',
'meta_query' => array( array(
'key' => 'main-gal',
'value' => false,
) ),
) );
Et j'ai essayé plusieurs fois avec 'compare' => 'NOT LIKE', '! =' Etc. etc.
Des idées? Ce billet semble impliquer que c'est quelque chose qui devrait être réglé:
http://core.trac.wordpress.org/ticket/18158
Merci!
Cette fonction massive était un peu effrayante, j'ai eu ce travail comme suit - avec deux arguments (qui excluent les fonctionnalités)
$args = array(
'meta_query' => array(
'relation' => 'OR',
array( // new and edited posts
'key' => 'Set as Featured Post',
'compare' => '!=',
'value' => 1
),
array( // get old posts w/out custom field
'key' => 'Set as Featured Post',
'value' => '1',
'compare' => 'NOT EXISTS'
)
),
'posts_per_page' => 30
);
Selon Paramètres de champ personnalisés dans le Codex, la comparaison spéciale NOT EXISTS
est disponible depuis WP version 3.5
Techniquement, il produit quelque chose comme une requête SQL suivante dans les demandes de publication:
$posts = get_posts( array(
'meta_query' => array(
array(
'key' => 'wrong',
'compare' => 'NOT EXISTS',
),
),
) );
SELECT *,wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'wrong')
WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.post_id IS NULL)
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5
Cela fonctionne en rejoignant la méta-table sur la clé fournie et en ne sélectionnant que les enregistrements pour lesquels aucune donnée significative n’a abouti (IS NULL
). Donc, cela ne fonctionne que dans le cas où la clé n'existe pas du tout et ne fonctionnera pas pour les clés qui existent avec falsy .
Comme le billet l’a souligné, il n’est pas pris en charge. Jusque-là, vous devrez vous fier à une solution personnalisée.
Quelques utilisateurs l'ont déjà demandé, ou du moins ont demandé comment le faire sur les forums WordPress.org. J'ai donc écrit une fonction permettant de faire le travail que je n'avais jamais gardé (pâle), heureusement j'ai trouvé le sujet initial. où j'ai fourni le lien Pastebin (qui ne devrait pas expirer).
J'ai écrit cela il y a 8 mois et je ne l'ai pas testé (depuis), alors laissez-moi au courant.
J'espère que cela pourra aider..
La méthode la plus simple, mais pas la plus propre:
$args = array(
'post_type' => 'gallery',
'posts_per_page' => -1,
'meta_key' => 'gal-ID',
'order_by' => 'meta_value',
'order' => 'ASC',
'meta_key' => 'main-gal',
) );
Cela vous donnera toutes vos galeries triées par la clé méta. L'étape suivante consiste à déterminer si les galeries de valeur 1 viennent après ou avant les autres publications. De cette façon, vous pouvez soit:
Autres méthodes ne nécessitant pas d'instruction SQL personnalisée: