Query personalizzata con ordinamento per meta_value di un campo personalizzato
Come sapete, da WP3.0 ci sono opzioni per query personalizzate avanzate, il che è fantastico. Per questo motivo, alcuni parametri di query per i campi personalizzati come meta_key, meta_value sono stati deprecati in favore del nuovo parametro meta_query (vedi qui)
Sto cercando di realizzare una query piuttosto semplice con la nuova sintassi, interrogando i post di un certo post_type (services) che contengono una specifica meta_key (order_in_archive) - questo funziona come previsto. Tuttavia, voglio ordinare la query per meta_value, ma senza successo.
Questa è la mia query -
query_posts(
array( 'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_query' => array(
array('key' => 'order_in_archive'))
)
);
Ho provato a usare orderby anche con meta_value_numeric e meta_value, ma in ogni caso i risultati vengono ordinati per data di pubblicazione (come fanno i post normali). Qualcuno sa come si può fare?
Grazie

Puoi definire la meta key per il parametro orderby utilizzando il vecchio metodo (ho testato su WP 3.1.1)...
query_posts(
array( 'post_type' => 'services',
'order' => 'ASC',
'meta_key' => 'some_key',
'orderby' => 'meta_value', //oppure 'meta_value_num'
'meta_query' => array(
array('key' => 'order_in_archive',
'value' => 'some_value'
)
)
)
);

Questo problema in generale è stato risolto a partire da WordPress 4.2 utilizzando query con nomi. Ad esempio:
$args = array(
'post_type' => 'services',
'orderby' => 'order_clause',
'meta_query' => array(
'order_clause' => array(
'key' => 'order_in_archive',
'value' => 'some_value',
'type' => 'NUMERIC' // a meno che il campo non sia numerico
)));
Nel mio caso, volevo ordinare in base a un campo numerico e ho dovuto utilizzare 'type' => 'NUMERIC'
all'interno della meta query.

Il WP Codex risulta effettivamente confusionario quando affronta questo problema.
In realtà non è necessario il parametro meta_query per utilizzare orderby, invece utilizza il parametro meta_key, che sebbene secondo il WP Codex sia deprecato, è stato stabilito qui: Come si utilizza orderby con meta_query in Wordpress 3.1? che orderby ha ancora bisogno del meta_key.
quindi dovrebbe essere
query_posts( array(
'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_key' => 'order_in_archive'
) )

Beh, sì, questo è il vecchio metodo per eseguire questa query e sembra funzionare per quella specificata. Tuttavia, per query più complesse, non funzionerà. Ho scoperto che si tratta di un problema noto che è in fase di risoluzione, i dettagli possono essere trovati nei ticket trac #15031 e #17065

È semplice:
Ecco il mio codice:
query_posts(array(
'post_type' => 'directors',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'director_weight',
'meta_key' => 'director_weight'
) );
Il dettaglio principale è: includere meta_key
, il mio codice non ordinava a meno che meta_key
non fosse incluso, e questo è tutto:
Ecco il codice completo per una lista di immagini di directors
ordinate per director_weight
:
<?php
query_posts(array(
'post_type' => 'directors',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'director_weight',
'meta_key' => 'director_weight'
) );
while (have_posts()) : the_post();
?>
<li <?php echo get_field('director_weight') ?>>
<img src="<?php echo get_field('director_imagen') ?>" alt="Foto del direttore" title="Foto del direttore">
</li>
<?php
endwhile;
wp_reset_query();
?>

Non utilizzare query_posts.
$meta_query = new WP_Meta_Query( $meta_query_args );
$meta_query_args = array(
'post_type' => 'services',
'order' => 'ASC',
'meta_key' => 'your_key',
'orderby' => 'meta_value', // oppure 'meta_value_num'
'meta_query' => array(
array('key' => 'order_in_archive',
'value' => 'some_value'
)));
Utilizza i parametri WP_Meta_Query

Avevo una serie di date personalizzate di eventi che dovevo ordinare in ordine decrescente per data. Poiché la mia data personalizzata dell'evento era memorizzata nella tabella wp_postmeta e di solito era diversa dalle date post_date o modified, questa soluzione ha funzionato per me:
$args = array(
'post_type' => 'events', // il mio post type - il tuo può essere 'posts'
'post_status' => 'publish', // ottieni solo post con questo stato
'orderby' => 'meta_value', // ordina per il meta_value della seguente meta_key
'meta_key' => 'my_custom_eventdate', // il nome personalizzato della meta_key
'order'=> 'DESC' // ordina in modo decrescente
);
$posts = new WP_Query($args);
Puoi quindi scorrere i $posts in questo modo:
foreach($posts->posts as $p){
$post_id = $p->ID;
// e così via...
// # esempio di come recupero la data del mio evento
$event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

La seguente soluzione funziona:
$args = array(
'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'order_clause',
'meta_query' => array(
'order_clause' => array(
'key' => 'order_in_archive'
)
)
);
È necessario fornire la chiave del sotto-array meta_query
chiamato order_clause
come valore per orderby
.

La domanda riguarda il parametro relativamente nuovo meta_query
e il far funzionare un orderby
con esso, e non riguarda i parametri più vecchi ma ancora funzionanti meta_key
/meta_value
. Inoltre, non incoraggiamo l'uso di query_posts
.
