Ordinare i post per campo personalizzato

8 apr 2015, 16:59:51
Visualizzazioni: 16.8K
Voti: 2

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;
}
1
Commenti

Non utilizzare una query personalizzata, usa pre_get_posts

Pieter Goosen Pieter Goosen
8 apr 2015 17:04:45
Tutte le risposte alla domanda 1
6

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' );
    }
}
8 apr 2015 18:14:43
Commenti

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?

Thomas Martin Thomas Martin
8 apr 2015 18:28:11

@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

Pieter Goosen Pieter Goosen
8 apr 2015 18:36:06

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).

Thomas Martin Thomas Martin
8 apr 2015 19:12:51

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.

Thomas Martin Thomas Martin
8 apr 2015 19:35:11

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.

mrwweb mrwweb
8 apr 2015 19:37:43

Un avvertimento è che se il campo personalizzato non è assegnato, il post non viene mostrato. Hai suggerimenti su come fare in modo che i post senza il campo personalizzato vengano aggiunti alla fine?

Wes Modes Wes Modes
12 nov 2019 01:54:32
Mostra i restanti 1 commenti