Mostra un numero diverso di post per pagina a seconda del contesto (ad es. Homepage, ricerca, archivio)


21

Nelle Impostazioni di lettura, c'è posto per impostare il numero di post mostrati che influenza il numero di post mostrati in tutti i contesti. Vorrei mostrare invece un certo numero di post sulla home page e un diverso numero di post su pagine come archivio, risultati di ricerca, ecc.

lettura-settings-blog-pagine-show-at-pagina più-per-

Mi rendo conto che potrei farlo modificando i file dei temi e modificando lì i parametri della query, ma preferirei avere un accesso più semplice a una semplice pagina delle impostazioni. Molto tempo fa, mi sono imbattuto in un plugin che ha fatto questo, ma non riesco a individuarlo ora.

Qualcuno sa di un plugin per fare questo, o anche di una funzione che potrei mettere in Functions.php per realizzare la stessa cosa?


Probabilmente stavi pensando al plug-in 'Different Posts Per Page' di @ chip-bennett: chipbennett.net/plugins/cbnet-different-posts-per-page che fa quello che vuoi in modo grafico.
Tom Auger,

Risposte:


23

Credo che il modo migliore per farlo in un plugin sia eseguire la seguente funzione di esempio quando pre_get_postssi incontra l' hook di azione. L' $wp_queryoggetto è disponibile, il che significa che sono disponibili i tag condizionali, ma prima che WordPress ottenga i post, il che significa che stai modificando le query prima della prima esecuzione della query, piuttosto che aggiungere una seconda query come quando query_posts () viene utilizzata in un tema file.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8);
    }
    if (is_search()) {
        $query->set('posts_per_page', -1);
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25);
    } //endif
} //function

//this adds the function above to the 'pre_get_posts' action     
add_action('pre_get_posts', 'custom_posts_per_page');

Uso questa funzione sul mio sito. È stato facile tagliarlo e incollarlo qui per te.
kevtrout,

0

potresti fare un ciclo personalizzato usando query_posts e specificare il numero di post di is_home, is_archive, ecc.

solo una semplice istruzione if insieme a query_posts


Sì, l'ho menzionato nella mia domanda. Sto cercando un modo per farlo, quindi non devo modificare più file di temi per cambiare le impostazioni. Grazie.
Doug,

1
È una cattiva idea farlo in questo modo. WordPress esegue già query. Se inserisci query_postsil tema, ignorerai la query originale e ne creerai un'altra ridondante.
Krzysiek Dróżdż

-1

Per aggiungere a questa domanda. Qualcuno sa come determinare post_per_page per questa funzione custom_posts_per_page ($ query) se aggiungi la nuova pagina a index.php in questo modo:

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>

-1

Mi rendo conto che potrei farlo modificando i file dei temi e modificando lì i parametri della query, ma preferirei avere un accesso più semplice a una semplice pagina delle impostazioni.

Nell'interesse della completezza, ho scoperto che query_postscombinato con la $query_stringconcatenazione funziona bene.

Ho inserito questo codice in index.php(il mio tema non ha category.php) ...

<?php 
if (!is_front_page()) { 
    query_posts($query_string . "&posts_per_page=20"); 
}
?>

Ovviamente quello che stiamo facendo qui è modificare la stringa di query interna del loop, sovrascrivendo il numero predefinito di post per pagina .

Funziona a meraviglia per fornire un elenco più piccolo di post sulla home page in cui sto mostrando post completi e un elenco molto più ampio di post ovunque (categorie, data, ecc.) In cui sto solo mostrando i riepiloghi dei post.

Tuttavia, tieni presente che, diversamente dalla risposta accettata, la query verrà eseguita due volte , quindi non è una soluzione altrettanto piacevole.


Jeff, stavo cercando un posto centralizzato per controllare il numero di post restituiti in contesti diversi. La tua risposta lo fa solo se usi index.php per gestire TUTTI i contesti, cosa che la maggior parte dei temi non fa. Oltre ad aumentare le chiamate al database (che influisce sulle prestazioni), la tua tecnica può anche modificare la risposta ai tag condizionali (ad es. Is_home () o is_front_page) in modi imprevisti. Infine, se vuoi aggiungere loop secondari a una pagina, NON dovresti usare query_posts, ma invece usa "new WP_Query" (o get_posts).
Doug

@doug questo non è un ciclo secondario, sta sovrascrivendo il ciclo principale - e sì, questo tema particolare usa index.php per rendere tutto, è abbastanza minimalista. Ho sentito che questo aveva più senso qui come risposta, ma se vuoi posso fare la mia domanda e rispondere se questa risposta ti offende in qualche modo.
Jeff Atwood,

In realtà ho letto male il tuo penultimo paragrafo e ho pensato che gli elenchi di post "più grandi" e "più piccoli" fossero sulla stessa pagina, quindi la mia ultima frase sopra era irrilevante. E sì, è perfettamente legittimo mettere tutto il tuo codice in index.php se vuoi. E in tal caso, il tuo metodo è un modo semplice e veloce per farlo, quindi rimuoverò il mio voto negativo dopo che il blocco di 20 ore è terminato. Anche così, inviare una nuova query piuttosto che modificare la query originale come nella risposta di kevtrout è meno desiderabile per i motivi già menzionati (da te, da me e dal WP Codex).
Doug
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.