it-swarm.com.de

vergleiche meta_query in get_posts Argumenten

Ich möchte bestimmte Posts mit einem benutzerdefinierten Feld ausschließen. Wenn also my_custom_field_ignore gesetzt UND 1 ist, ignoriere diesen Beitrag. Wenn es nicht gesetzt ist, schließe es ein.

Das habe ich

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

Dies funktioniert nur für Posts, bei denen der my_custom_field_ignore auf einen anderen Wert als 1 festgelegt ist.

Wie kann ich alle Posts einschließen (natürlich nicht die mit my_custom_field_ignore = 1)?

Bearbeiten:

So funktioniert es bei WP 3.5+

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

Bei dieser einfachen Suche nach dem Erscheinungsbild von my_custom_field_ignore wird der Wert ignoriert. Dies könnte in erster Linie funktionieren. Benutzer können jedoch verwirrt sein, wenn sie 1 in 0 ändern und damit rechnen, einbezogen zu werden.

Scheint jedoch, dass 3.3 und 3.4 eine bedingte Prüfung benötigen.

Edit 2

Scheint, dass die überprüfte Antwort den Trick macht (mindestens für 3.5+). Aus irgendeinem Grund wird der allererste Beitrag "Hello World" ignoriert. Nach dem Hinzufügen und Entfernen von my_custom_field_ignore funktioniert es

7
Xaver

Wenn wir die Bedingungen definieren:

A: my_custom_field_ignore EXISTS
B: my_custom_field_ignore = 1

dann ist NOT ( A && B ) äquivalent zu:

NOT ( A ) || NOT ( B )

bedeutung in unserem Fall:

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

Wir könnten daher Folgendes für WP 3.5+ (ungetestet) versuchen:

 $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

sie müssen die Serialisierungsfunktion verwenden, wenn Sie Ganzzahlen verwenden:

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

und du bist bereit,

print_r($posts); 

und sehen Sie die Ergebnisse