Comparare meta_query în argumentele get_posts

13 nov. 2014, 13:04:26
Vizualizări: 33.7K
Voturi: 12

Vreau să exclud anumite postări cu un câmp personalizat. Deci dacă my_custom_field_ignore există ȘI este 1 să ignor această postare. Dacă nu este setat, să o includ.

Iată ce am până acum

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

Aceasta funcționează doar pentru postările unde my_custom_field_ignore este setat la altceva decât 1

Cum pot include toate postările (bineînțeles, nu cele cu my_custom_field_ignore = 1)?

Editare:

Așa funcționează pe WP 3.5+

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

Această căutare simplă verifică existența my_custom_field_ignore, astfel încât valoarea va fi ignorată. Deși acest lucru ar putea funcționa inițial, utilizatorii s-ar putea confuza când schimbă 1 în 0 și se așteaptă să fie incluși.

Se pare că versiunile 3.3 și 3.4 necesită o verificare condițională totuși.

Editare 2

Se pare că răspunsul verificat funcționează (cel puțin pentru 3.5+). Din motive necunoscute, ignoră prima postare "Hello World". După adăugarea my_custom_field_ignore și eliminarea acestuia ulterior, funcționează

0
Toate răspunsurile la întrebare 2
12
11

Dacă definim condițiile:

A: my_custom_field_ignore EXISTS
B: my_custom_field_ignore = 1

atunci NOT ( A && B ) este echivalent cu:

NOT ( A ) || NOT ( B )

ceea ce înseamnă în cazul nostru:

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

Am putea încerca următoarele pentru WP 3.5+ (netestat):

 $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',     #<-- doar o valoare ca remediere pentru o eroare din versiunile anterioare 3.9 (Codex)
        ),
    )
);
13 nov. 2014 13:19:08
Comentarii

Mulțumesc, voi verifica dar ar trebui să funcționeze cu 3.3+

Xaver Xaver
13 nov. 2014 13:20:12

Am actualizat răspunsul, NOT EXISTS este suportat doar pentru WP 3.5+ conform Codex.

birgire birgire
13 nov. 2014 13:24:34

îmi pare rău, dar acest lucru nu funcționează de la 3.3 până la 4.0

Xaver Xaver
13 nov. 2014 14:39:53

Tocmai am testat acest lucru pe o instalație simplă de WordPress 4.0, unde funcționează conform așteptărilor. Care este rezultatul tău? Cum arată interogarea SQL în cazul tău?

birgire birgire
13 nov. 2014 15:05:07

http://pastebin.com/bLSHErMH care este a ta? (Am și eu 'numberposts => 1' dar presupun că nu contează)

Xaver Xaver
13 nov. 2014 15:15:13

da, am aceeași interogare SQL, în afară de limită. Ai spații suplimentare în valorile meta? Obții vreun rezultat? Tipul tău de postare este corect? Testezi asta în WordPress 4.0?

birgire birgire
13 nov. 2014 15:31:16

nu, transmit argumentele funcției get_posts. Voi face câteva teste și te voi ține la curent. Îți mulțumesc între timp!

Xaver Xaver
13 nov. 2014 16:01:41

Am actualizat întrebările mele cu o posibilă soluție, dar are câteva contraargumente

Xaver Xaver
13 nov. 2014 16:17:50

Ciudat, nu sunt sigur de ce nu funcționează la tine. Asigură-te că valorile meta salvate nu conțin spații suplimentare. Pe instalarea mea vanilla de WP 4.0 am creat 10 articole. Apoi am actualizat 3 dintre ele cu câmpul personalizat my_custom_field_ignore, două cu valoarea 1 și unul singur cu valoarea 0. Apoi am rulat interogarea de mai sus cu posts_per_page=10 și am primit 8 articole în rezultat. Articolele cu valorile câmpului personalizat egale cu 1 au fost excluse cum era de așteptat.

birgire birgire
13 nov. 2014 18:58:08

ok, voi verifica din nou acest lucru - poate

Xaver Xaver
13 nov. 2014 20:01:56

Postarea care nu a fost afișată a fost cea "Hello World". Totul funcționează bine dacă adaug câmpul personalizat my_custom_field_ignore la această postare și îl elimin ulterior. Totuși, este ceva ciudat.

Xaver Xaver
13 nov. 2014 20:31:12

este ciudat, dar mă bucur că ai reușit să o faci să funcționeze ;-)

birgire birgire
13 nov. 2014 21:15:09
Arată celelalte 7 comentarii
0

trebuie să folosești funcția serialize în cazul în care lucrezi cu numere întregi:

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

și ești gata,

print_r($posts); 

și vezi rezultatele

15 iul. 2015 16:51:55