Mostrare un numero diverso di post per pagina a seconda del contesto (es. homepage, ricerca, archivio)

11 ago 2010, 19:52:23
Visualizzazioni: 12.5K
Voti: 22

Nelle Impostazioni di lettura, c'è un'opzione per impostare il numero di post visualizzati che influisce su tutti i contesti. Vorrei invece mostrare un certo numero di post sulla homepage e un numero diverso di post su pagine come archivio, risultati di ricerca, ecc.

Impostazioni di lettura - Numero di post per pagina sul blog

Sono consapevole che potrei farlo modificando i file del tema e cambiando i parametri della query, ma preferirei avere un accesso più semplice a una pagina di impostazioni. Tempo fa ho trovato un plugin che faceva questo, ma ora non riesco a trovarlo.

Qualcuno conosce un plugin per fare questo, o anche una funzione che potrei inserire in functions.php per ottenere lo stesso risultato?

1
Commenti

Probabilmente stavi pensando al plugin 'Different Posts Per Page' di @chip-bennett: http://www.chipbennett.net/plugins/cbnet-different-posts-per-page/ che fa ciò che desideri in modo grafico.

Tom Auger Tom Auger
28 ott 2011 18:09:39
Tutte le risposte alla domanda 4
1
25

Credo che il modo migliore per farlo in un plugin sia eseguire la seguente funzione di esempio quando viene rilevato l'hook di azione pre_get_posts. L'oggetto $wp_query è disponibile, il che significa che i tuoi tag condizionali sono disponibili, ma prima che WordPress recuperi i post, il che significa che stai modificando le variabili di query prima che venga eseguita la prima query, piuttosto che aggiungere una seconda query come quando viene utilizzato query_posts() in un file del tema.

function custom_posts_per_page($query) {
    if (is_home()) {
        $query->set('posts_per_page', 8); // Imposta 8 post per pagina nella homepage
    }
    if (is_search()) {
        $query->set('posts_per_page', -1); // Mostra tutti i post nei risultati di ricerca
    }
    if (is_archive()) {
        $query->set('posts_per_page', 25); // Imposta 25 post per pagina negli archivi
    } //endif
} //function

// Aggiunge la funzione sopra all'azione 'pre_get_posts'     
add_action('pre_get_posts', 'custom_posts_per_page');
11 ago 2010 21:08:21
Commenti

Uso questa funzione sul mio sito personale. È stato facile copiarla e incollarla qui per te.

kevtrout kevtrout
12 ago 2010 19:11:04
2

potresti creare un loop personalizzato utilizzando query_posts e specificare il numero di post in base a is_home, is_archive, ecc.

basta un semplice if statement insieme a query_posts

11 ago 2010 20:07:58
Commenti

Sì, l'ho menzionato nella mia domanda. Sto cercando un modo per farlo in modo da non dover modificare più file del tema per cambiare le impostazioni. Grazie.

Doug Doug
12 ago 2010 18:21:07

È piuttosto una cattiva idea farlo in questo modo. WordPress esegue già una query. Se inserisci query_posts nel tuo tema, ignorerai la query originale e ne creerai un'altra ridondante.

Krzysiek Dróżdż Krzysiek Dróżdż
11 dic 2013 20:45:07
0
-1

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

<?php
if ($_GET['new'] == 1) 
{
    include ( TEMPLATEPATH . '/newpage.php' );
    exit;
}
?>
20 gen 2011 08:56:50
3
-1

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

Per completezza, ho scoperto che query_posts combinato con la concatenazione di $query_string 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 query string interna del loop, sovrascrivendo il numero predefinito di post per pagina.

Funziona perfettamente per fornire un elenco più breve di post nella homepage dove mostro i post completi, e un elenco molto più lungo di post ovunque altro (categorie, per data, ecc.) dove mostro solo i riassunti dei post.

Tuttavia, tieni presente che, a differenza della risposta accettata, questo eseguirà la query due volte, quindi non è una soluzione altrettanto elegante.

6 lug 2011 23:25:12
Commenti

Jeff, stavo cercando un posto centralizzato per controllare il numero di post restituiti in diversi contesti. La tua risposta funziona 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 influiscono sulle prestazioni), la tua tecnica può anche modificare la risposta ai tag condizionali (ad esempio is_home() o is_front_page) in modi imprevisti. Infine, se vuoi aggiungere loop secondari a una pagina, NON dovresti usare query_posts, ma usare invece "new WP_Query" (o get_posts).

Doug Doug
7 lug 2011 19:26:45

@doug questo non è un loop secondario, sta sovrascrivendo il loop principale - e sì, questo tema specifico utilizza index.php per renderizzare tutto, è piuttosto minimalista. Ho pensato che avesse più senso come risposta qui, ma se preferisci posso fare una nuova domanda e rispondere da solo se questa risposta ti offende in qualche modo.

Jeff Atwood Jeff Atwood
7 lug 2011 21:51:10

In realtà ho letto male il tuo penultimo paragrafo e pensavo che le liste di post "più grandi" e "più piccole" 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 lo desideri. E se è così, allora il tuo metodo è un modo rapido e semplice per farlo, quindi rimuoverò il mio voto negativo dopo che il blocco di 20 ore sarà terminato. Tuttavia, 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 Doug
8 lug 2011 16:24:40