Mostrare un numero diverso di post per pagina a seconda del contesto (es. homepage, ricerca, archivio)
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.
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?
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');

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.

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;
}
?>

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.

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

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