Ho modificato la ricerca WP integrata utilizzando il pre_get_posts
filtro, consentendo all'utente di ordinare i post (incluso un gruppo di tipi di post personalizzati) in base a campi diversi.
Il problema che sto riscontrando è che quando dico a WP di ordinare in base a un meta-valore, escluderà tutti i post che non hanno quel meta-valore impostato. Questo fa sì che il numero di risultati cambi se cambi l'ordinamento da "Prezzo" a "Data" perché "Post" non ha "Prezzo" impostato ma "Articoli".
Questo non è quello che voglio, quindi vorrei sapere se c'è un modo per includere TUTTI i post - anche quelli che non hanno il meta valore su cui sto ordinando - e mettere quello senza il valore ultimo.
So come ordinare su più di un campo ma questo non aiuta.
Grazie
Sembra che non sia l'unico con questa domanda: modo di includere post con e senza certe meta_key in args per wp_query? ma non c'è soluzione lì.
Aggiornare
Ho provato la risposta ma non sono sicuro di aver capito bene, ecco cosa ho adesso:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
Il meta valore è un numero (viene utilizzato per memorizzare un prezzo come suggerisce il nome)
Aggiornamento 2
Ho commentato le cose dell'ordine e tutto ciò che ho ora è questo:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Con questo codice la query sembra restituire tutti i post che non hanno la item_price
chiave e nessuno dei post che la hanno. Cioè il problema è ora invertito.
Se aggiungo anche il codice ordine ottengo 0 risultati.
Modifica: ... tre anni dopo ... : PI aveva di nuovo questo problema. Ho provato tutte le risposte fornite e nessuna funziona. Non sono sicuro del motivo per cui alcune persone sembrano pensare che funzionino ma almeno non funzionano per me.
La soluzione con cui ho finito è usare il save_post
filtro - assicurandomi che tutti i post abbiano il campo personalizzato su cui desidero ordinare. È un po 'fastidioso che io debba farlo, ma fintanto che lo fai presto non avrai probabilmente problemi.
In questo caso stavo costruendo un "contatore delle visualizzazioni" sui post e volevo che gli utenti potessero ordinare i post più letti. Ancora una volta, i post che non sono mai stati visualizzati (suppongo sia abbastanza improbabile - ma comunque) sono scomparsi durante l'ordinamento sul conteggio delle visualizzazioni. Ho aggiunto questo bit di codice per assicurarmi che tutti i post abbiano un conteggio visualizzazioni:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
e tax_query
sono sempre un array( array() )
dato che combinano più array. In secondo luogo, come indicato nella mia risposta, è necessario utilizzare meta_value_num
per i numeri. Potrebbe anche essere necessario definire effettivamente meta_value_num
(vedere la WP_Query
voce di pagina -Codex). Ultimo, ma non ha senso di order
in ASC
e DESC
direzione. Non e possibile. Il delimitatore di spazio funziona solo per orderby
e non puoi dirgli di ordinare il primo ASC
e il secondo DESC
. Ecco a cosa posts_clauses
serve il filtro.
meta_value_num
voci siano numeri reali . Ho visto troppo spesso che qualcuno afferma che è un numero, ma in realtà lo salva come stringa nel database.
ASC DESC
è che si ordina meta_value
in ASC
e date
in DESC
, per quanto posso dire che funziona.