¿Cómo mostrar una sola publicación en la página principal pero tener una paginación normal?

9

Me gustaría tener una sola publicación en mi página principal (siempre la última), pero dejar que funcione la paginación normal. Entonces, la página principal tiene la publicación 1, la siguiente página debe tener la publicación 2-11 (1-10 también está bien), luego 12-21 o 11-20, y así sucesivamente. Sé que puedo cambiar la cantidad de publicaciones según el contexto , pero establecer esto en "1" en la página de inicio significa que las páginas adicionales también muestran solo una publicación.

Mi principal problema es que /page/2/funciona, pero /page/1/siempre redirige a la página de inicio real /. Esto significa que las publicaciones 2-10 siempre se omiten, ya que la página 2 muestra 11-20. Yo actualmente solucionar esto mediante la vinculación a mi archivo, pero esto no es lo ideal cuando se llega a los primeros puestos del año y hay un menor número de mensajes y no hay manera obvia de continuar.

Jan Fabry
fuente

Respuestas:

7

Lo resolví usando el offsetparámetro de consulta . Esto me permitió editar la consulta en el pre_get_postsgancho, y parece ser la forma más limpia de hacerlo, sin una nueva consulta. Ahora la página de inicio muestra solo una publicación, y page/2/muestra las publicaciones 2-11. Todos los enlaces siguen funcionando, no se requiere ninguna otra modificación.

add_action('pre_get_posts', 'set_offset_on_front_page');
function _set_offset_on_front_page(&$query)
{
    if (is_front_page() && is_paged()) {
            $posts_per_page = isset($query->query_vars['posts_per_page']) ? $query->query_vars['posts_per_page'] : get_option('posts_per_page');
            // If you want to use 'offset', set it to something that passes empty()
            // 0 will not work, but adding 0.1 does (it gets normalized via absint())
            // I use + 1, so it ignores the first post that is already on the front page
            $query->query_vars['offset'] = (($query->query_vars['paged'] - 2) * $posts_per_page) + 1;
    }
}
Jan Fabry
fuente
Si esto funciona, entonces el OP debería usar esto.
john010117
Lo cual hago, porque escribí la pregunta y esta respuesta. Pero gracias por sus sugerencias, me llevaron por el buen camino.
Jan Fabry
¿Existe la posibilidad de que funcione en archive.php o category.php, mostrando solo las últimas 2 publicaciones en la página 1 mientras se mantiene la paginación correcta? ¡Gracias!
Amit
@Amit: si reemplazas is_front_page()con is_archive()o is_category(), creo que puedes llegar a donde necesitas estar.
Jan Fabry
3

Ok, tal vez esta es una forma extraña o complicada de hacer esto, pero tuve un problema similar (quería mostrar un texto de bienvenida y las tres publicaciones más recientes de una categoría específica en la página principal. Así que hice:

  1. Creé una nueva página llamada home y puse mi texto de bienvenida.
  2. Desactivé la página de inicio predeterminada y configuré mi página de inicio personalizada como página de inicio
  3. Creó una nueva plantilla de página (copió y modificó una existente)
    1. deja que muestre el cuerpo de la página
    2. cargar tres publicaciones más recientes de la categoría X y mostrarlas
    3. tiene un enlace "más" debajo que enlaza en / category / category-x /

se ve así: http://hinek.de (la página está en alemán, lo siento)

Si este podría ser el camino para usted y necesita más información o una muestra de código para la plantilla de página, comente y editaré esta publicación.

Hinek
fuente
Esto funciona porque solo muestra publicaciones en la categoría "Mensaje de ... lo que sea" y, por lo tanto, puede ir a esa página de categoría y utilizar la paginación normal. Quiero mostrar publicaciones de todas las categorías, por lo que este enfoque no funcionará para mí. ¿No tiene un lugar donde las personas puedan navegar por todas las publicaciones de todas las categorías?
Jan Fabry
1

¿Asumo que estás ejecutando Wordpress 3.0.x?

Mostrar una sola publicación (en cualquier categoría) en la página principal es fácil. Úselo query_posts('post_per_page=1')en su home.phparchivo en lugar de invocar get_template_part('loop').

Seguir los métodos de paginación normales después de eso es un poco complicado. En su loop.phparchivo, sugiero poner <?php global $paged; ?>antes de la <?php if (have_posts()) : ?>declaración y usar la $pagedvariable y la query_posts()función para modificar su consulta para que muestre las publicaciones correctas.

Su loop.phparchivo se vería así (nota: no probado):

<?php
global $paged;

if (!is_front_page() && $paged && $post->post_type == 'post') :
    query_posts('posts_per_page=10&paged=' . ($paged - 1));
    if (have_posts()) :
        while (have_posts()) : the_post();
        // Rest of the loop
        endwhile;
    endif;
endif;
?>

Solía $paged - 1simplemente porque la página 2 mostrará las publicaciones 1 - 10, y la página 3 mostrará las publicaciones 11 - 20, y así sucesivamente.

john010117
fuente
Cambiar el pagedparámetro no romperá nada más, como el next_posts_link?. ¿Quizás sea mejor modificar la consulta en el pre_get_postsgancho, para que no cree una nueva consulta? Y sí, esto es WP 3.
Jan Fabry
AFAIK, no debería afectar next_posts_link. La única forma de averiguarlo es probarlo, por supuesto.
john010117
1
Argh, si intento editar el pagedparámetro en el pre_get_postsgancho, redirect_canonicalentra y quiere reemplazar la url con el nuevo pagedparámetro. Puedo deshabilitar las redirecciones en este caso, pero next_posts_linkutiliza una $pagedvariable global que se establece en el nuevo valor, pero no sé por qué código, por lo que es incorrecto.
Jan Fabry
¿Realmente intentaste usar mi código y ver si funciona? No estoy muy familiarizado con el pre_get_postsgancho, así que no puedo ser de mucha ayuda allí. Además, intente modificar la $pagedvariable directamente (ej . $paged = $paged - 1):) si le preocupa next_posts_link().
john010117
0

Esta pregunta es un poco antigua, pero para quienes la encuentren en la era moderna, nunca deben llamar a query_posts . Desde el códice de Wordpress:

query_posts () es una forma excesivamente simplista y problemática de modificar la consulta principal de una página al reemplazarla con una nueva instancia de la consulta. Es ineficiente (vuelve a ejecutar consultas SQL) y fallará directamente en algunas circunstancias (especialmente a menudo cuando se trata de paginación de publicaciones).

...

TL; DR no utiliza query_posts () nunca;

En su lugar, debe usar el pre_get_postsgancho en functions.php de la siguiente manera:

function hwl_home_pagesize( $query ) {
    // Behave normally for secondary queries
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Display only 1 post for the home page
        $query->set( 'posts_per_page', 1 );
        return;
    }

    // Otherwise, use whatever is set in the Wordpress Admin screen
    $query->set( 'posts_per_page', get_option('posts_per_page'); );
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

Sin embargo, tenga en cuenta que, en algunos casos (como ajustar las compensaciones de las publicaciones), el uso de un pre_get_postsgancho puede alterar su paginación. Arreglar esto no es muy difícil, pero es algo a tener en cuenta. Hay un ejemplo de cómo solucionar esto aquí .

lfalin
fuente