Ordinare i post per campo personalizzato
Sto cercando di ordinare i miei post per il campo personalizzato artwork_title
. Quando uso il seguente codice, ottengo sempre solo una particolare categoria di post, indipendentemente dall'archivio categoria in cui mi trovo.
Inoltre la paginazione mostra il numero corretto di pagine, ma passando alla pagina successiva vengono sempre mostrati gli stessi post. Qualcuno riesce a capire cosa sto sbagliando?
<?php $query = new WP_Query(
array(
'posts_per_page' => 20,
'orderby' => 'meta_value',
'meta_key' => 'artwork_title',
'order' => 'ASC'
) ); ?>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<?php get_template_part( 'content', get_post_format() );
?>
<?php endwhile; ?>
@PieterGoosen ha suggerito di usare pre_get_posts
. Non ho esperienza con questa funzione ma ho provato a implementare questo codice, però non ottengo alcun risultato. Sono sicuro che sia qualcosa di banale.
<?php add_action( 'pre_get_posts', 'sort_artwork_title' );?>
function sort_artwork_title( $query )
{
if (is_admin()){
return;
}
if( $query->is_main_query() && is_post_type_archive() ) {
$query->set('orderby', 'artwork_title');
$query->set('posts_per_page', '20');
$query->set('order', 'ASC' );
}
return $query;
}

Per ampliare il commento di @pieter-goosen, è effettivamente consigliato utilizzare pre_get_posts
. Nel tuo esempio, usando WP_Query
, stai sovrascrivendo l'intera query e ripristinando la maggior parte delle impostazioni ai valori predefiniti. In realtà, probabilmente non stai visualizzando affatto una categoria specifica di articoli. Dovresti vedere tutti gli articoli poiché questo è il comportamento predefinito della classe WP_Query
.
Invece, utilizza pre_get_posts
che modifica una query esistente anziché crearne una completamente nuova. Ecco un frammento [non testato] che dovrebbe funzionare nel tuo file functions.php
:
add_action( 'pre_get_posts', 'wpse183601_filter_category_query' );
function wpse183601_filter_category_query( $query ) {
// modifica solo le pagine di archivio categoria nel front-end
if( is_category() && !is_admin() && $query->is_main_query() ) {
$query->set( 'posts_per_page','20' );
$query->set( 'orderby','meta_value' );
$query->set( 'meta_key','artwork_title' );
$query->set( 'order','ASC' );
}
}

Hai risposto mentre stavo modificando il mio post per chiedere informazioni su pre_get_posts. Grazie mille. Sembra che funzioni. Domanda, da dove viene quel nome di funzione? C'è qualche motivo per cui non potrebbe essere semplicemente artwork_title_filter_category_query o qualcosa di simile?

@ThomasMartin puoi chiamare la tua funzione come vuoi. Molti di noi usano semplicemente il prefisso wpse****
per avere un nome unico per le funzioni. wpse
sta per wordpress stackechange e i numeri sono il numero del post :-). Solo una nota, ricordati di rinominare di conseguenza il nome della funzione di callback

Devo aggiungere qualcosa alle mie pagine archive.php, index.php o search.php? Sembra funzionare bene nelle pagine di archivio ma dall'indice l'elenco dei post è casuale (o non vedo l'ordine).

Scordalo. Vedo che l'indice probabilmente sta solo ordinando i post più recenti (sono stati tutti creati contemporaneamente, ecco perché non riconosco l'ordine). Grazie ancora per il tuo aiuto.

La clausola if()
nello snippet determina a quali pagine (tecnicamente a quali query) si applica l'ordinamento. Avevi detto pagine di Categoria quindi ho usato quello. Puoi utilizzare la maggior parte degli altri condizionali lì senza problemi. Lascia stare le ultime due cose per evitare di incasinare altre parti di WordPress. Se vuoi davvero capire a fondo, leggi la pagina del Codex linkata e guarda anche il talk "You Don't Know Query" di Nacin su WordPress.tv.
