web-dev-qa-db-fra.com

meta_query pour les clés qui ne sont pas encore définies

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!

8
artparks

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

);
7
ArleyM

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 .

3
Rarst

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).

http://Pastebin.com/kgLt1RrG

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..

2
t31os

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:

  • Traitez les éléments jusqu'à ce que vous ayez traité 4 éléments de la galerie ou atteint un message avec une méta valeur de 1
  • Ignorer les posts avec une méta-valeur 1 puis commencer le traitement lorsque vous atteignez la première valeur non-1

Autres méthodes ne nécessitant pas d'instruction SQL personnalisée:

  • Faire une requête pour trouver les galeries que vous ne voulez pas, l'utiliser pour remplir un tableau d'identifiants de post, puis faire une seconde requête, en passant ce tableau sous forme de posts à exclure
  • Utiliser une taxonomie au lieu de champs personnalisés (le résout assez bien et met gratuitement beaucoup d’autres améliorations de Nice afin de vous faire gagner du temps)
1
Tom J Nowell