Mostrar un número diferente de publicaciones por página según el contexto (ej. página de inicio, búsqueda, archivo)
En los Ajustes de Lectura, hay un lugar para establecer el número de publicaciones mostradas que afecta a todas las páginas. Me gustaría mostrar una cantidad específica de publicaciones en la página de inicio y un número diferente en páginas como archivos, resultados de búsqueda, etc.
Sé que podría hacer esto editando los archivos del tema y cambiando los parámetros de la consulta, pero preferiría tener acceso fácil a una página de ajustes simple. Hace tiempo encontré un plugin que hacía esto, pero ahora no lo encuentro.
¿Alguien conoce algún plugin para hacer esto, o incluso una función que pueda añadir a functions.php para lograr lo mismo?

Creo que la mejor manera de hacer esto en un plugin es ejecutar la siguiente función de ejemplo cuando se encuentre el hook de acción pre_get_posts
. El objeto $wp_query
está disponible, lo que significa que tus etiquetas condicionales están disponibles, pero antes de que WordPress obtenga los posts, lo que significa que estás cambiando las variables de consulta antes de que se ejecute la primera consulta, en lugar de agregar una segunda consulta como cuando se usa query_posts() en un archivo de tema.
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
// esto agrega la función anterior a la acción 'pre_get_posts'
add_action('pre_get_posts', 'custom_posts_per_page');

Sí, mencioné eso en mi pregunta. Estoy buscando una forma de hacerlo para no tener que editar múltiples archivos del tema para cambiar los ajustes. Gracias.

Para agregar a esta pregunta. ¿Alguien sabe cómo determinar post_per_page para esta función function custom_posts_per_page($query) si se agrega una nueva página a index.php de esta manera:
<?php
if ($_GET['new'] == 1)
{
include ( TEMPLATEPATH . '/newpage.php' );
exit;
}
?>

Me doy cuenta de que podría hacer esto editando los archivos del tema y cambiando los parámetros de consulta allí, pero preferiría tener un acceso más fácil a una página de configuración simple.
En aras de la exhaustividad, descubrí que query_posts
combinado con la concatenación de $query_string
funciona bien.
Coloqué este código en index.php
(mi tema no tiene category.php) ...
<?php
if (!is_front_page()) {
query_posts($query_string . "&posts_per_page=20");
}
?>
Por supuesto, lo que estamos haciendo aquí es modificar la cadena de consulta interna del bucle, anulando el número predeterminado de publicaciones por página.
Funciona de maravilla para proporcionar una lista más pequeña de publicaciones en la página de inicio donde muestro publicaciones completas, y una lista mucho más grande de publicaciones en otros lugares (categorías, por fecha, etc.) donde solo muestro resúmenes de publicaciones.
Sin embargo, ten en cuenta que, a diferencia de la respuesta aceptada, esto ejecutará la consulta dos veces, por lo que no es una solución tan óptima.

Jeff, estaba buscando un lugar centralizado para controlar el número de publicaciones devueltas en diferentes contextos. Tu respuesta solo hace eso si usas index.php para manejar TODOS los contextos, lo cual la mayoría de los temas no hacen. Además de aumentar las llamadas a la base de datos (lo que afecta el rendimiento), tu técnica también puede cambiar la respuesta a etiquetas condicionales (por ejemplo, is_home() o is_front_page) de maneras inesperadas. Finalmente, si deseas agregar bucles secundarios a una página, NO deberías usar query_posts, sino usar "new WP_Query" en su lugar (o get_posts).

@doug esto no es un bucle secundario, está sobrescribiendo el bucle principal — y sí, este tema en particular usa index.php para renderizar todo, es bastante minimalista. Sentí que esto tenía más sentido aquí como respuesta, pero si lo prefieres puedo hacer mi propia pregunta y responderla si esta respuesta te ofende de alguna manera.

En realidad malinterpreté tu penúltimo párrafo y pensé que las listas de publicaciones "más grandes" y "más pequeñas" estaban en la misma página, así que mi última oración anterior era irrelevante. Y sí, es perfectamente legítimo poner todo tu código en index.php si así lo deseas. Y si ese es el caso, entonces tu método es una forma rápida y fácil de hacer esto, así que eliminaré mi voto negativo después de que termine el bloqueo de 20 horas. Aun así, enviar una nueva consulta en lugar de modificar la consulta original como en la respuesta de kevtrout es menos deseable por las razones ya mencionadas (por ti, por mí y por el WP Codex).
