Vergleiche meta_query in get_posts Argumenten

7

Ich möchte bestimmte Beiträge mit einem benutzerdefinierten Feld ausschließen. Also wenn my_custom_field_ignoreisset UND 1ignoriere diesen Beitrag. Wenn es nicht eingestellt ist, schließen Sie 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 das my_custom_field_ignoreauf etwas anderes als eingestellt ist1

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

Bearbeiten:

So funktioniert es unter WP 3.5+

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

Diese einfache Suche nach dem Erscheinungsbild des my_custom_field_ignoreWerts wird ignoriert. Während dies in erster Linie Anwender arbeiten könnte möglicherweise verwirrt, wenn sie geändert 1zu 0und erwarten , einbezogen werden.

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

Bearbeiten 2

Scheint, dass die überprüfte Antwort den Trick macht (zumindest für 3.5+). Aus irgendeinem Grund wird der allererste Beitrag "Hallo Welt" ignoriert. Nach dem Hinzufügen my_custom_field_ignoreund Entfernen funktioniert es

Xaver
quelle

Antworten:

9

Wenn wir die Bedingungen definieren:

A: my_custom_field_ignore EXISTS
B: my_custom_field_ignore = 1

dann NOT ( A && B )ist gleichbedeutend mit:

NOT ( A ) || NOT ( B )

Bedeutung in unserem Fall:

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

Wir könnten daher für WP 3.5+ (ungetestet) Folgendes 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)
        ),
    )
);
Birgire
quelle
Danke, ich werde es überprüfen, sollte aber mit 3.3+
Xaver
Ich habe die Antwort aktualisiert, die NOT EXISTSlaut Codex nur für WP 3.5+ unterstützt wird.
Birgire
Entschuldigung, das funktioniert nicht von 3.3 bis 4.0
Xaver
Ich habe dies gerade auf einer Vanilla WP 4.0-Installation getestet, bei der es wie erwartet funktioniert. Was ist Ihre Ausgabe? Wie sieht die SQL-Abfrage in Ihrem Fall aus?
Birgire
pastebin.com/bLSHErMH was gehört dir? (Ich habe auch 'numberposts => 1', aber ich denke, das spielt keine Rolle)
Xaver
1

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

yunieski dieguez garcia
quelle