web-dev-qa-db-fra.com

compare meta_query dans les arguments de get_posts

J'aime exclure certains messages avec un champ personnalisé. Donc, si my_custom_field_ignore isset AND 1 ignore ce message. Si ce n'est pas défini, incluez-le.

C'est ce que j'ai

    $args = array(
        'post_type' => $post_type,
        'offset' => $offset,
        'meta_query' => array(
            array(
                'key' => 'my_custom_field_ignore',
                'value' => '1',
                'compare' => '!=',
            )
        )
    );

Cela ne fonctionne que pour les publications pour lesquelles my_custom_field_ignore est défini sur autre chose que 1.

Comment puis-je inclure tous les messages (bien sûr pas ceux avec my_custom_field_ignore = 1)?

Modifier:

Voici comment cela fonctionne sur WP 3.5+

    'meta_query' => array(
        array(
            'key' => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
        )
    )

Cette simple recherche de l'apparence de my_custom_field_ignore va donc ignorer la valeur. Bien que cela puisse fonctionner en premier lieu, les utilisateurs peuvent être désorientés en changeant 1 en 0 et s’attendent à être inclus.

Il semble que les versions 3.3 et 3.4 nécessitent une vérification conditionnelle.

Modifier 2

Il semble que la réponse cochée fasse l'affaire (au moins pour 3.5+). Pour une raison quelconque, il ignore le tout premier message "Hello World". Après avoir ajouté my_custom_field_ignore et après l'avoir supprimé, tout fonctionne

7
Xaver

Si on définit les conditions:

A: my_custom_field_ignore EXISTS
B: my_custom_field_ignore = 1

alors NOT ( A && B ) est équivalent à:

NOT ( A ) || NOT ( B )

ce qui signifie dans notre cas:

( my_custom_field_ignore NOT EXISTS ) ||  ( my_custom_field_ignore != 1 ) 

Nous pourrions donc essayer ce qui suit pour WP 3.5+ (non testé):

 $args = array(
    'post_type'  => $post_type,
    'offset'     => $offset,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'my_custom_field_ignore',
            'value'   => '1',
            'compare' => '!=',
        ),
        array(
            'key'     => 'my_custom_field_ignore',
            'compare' => 'NOT EXISTS',
            'value'   => '1',     #<-- just some value as a pre 3.9 bugfix (Codex)
        ),
    )
);
9
birgire

vous devez utiliser la fonction sérialiser si vous utilisez des entiers:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'my_meta_key',
            'value' => serialize(strval($my_vale)),
            'compare' => 'LIKE'
        )
    )
);
$posts = get_posts( $args );

et vous êtes prêt

print_r($posts); 

et voir les résultats

1