Comparare meta_query în argumentele get_posts
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ă

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)
),
)
);

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

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?

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

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?

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

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

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.

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.

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
