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

8

Me gustaría tener una sola publicación en mi página principal (siempre la última), pero dejar que funcione la paginación normal. Así que la primera página tiene la publicación 1, la siguiente página debería tener la publicación 2-11 (1-10 también está bien), luego 12-21 u 11-20, y así sucesivamente. Sé que puedo cambie el número de publicaciones según el contexto , pero si lo configura como "1" en la página de inicio, las demás páginas también mostrarán solo una publicación.

Mi problema principal es que /page/2/ y así sucesivamente funcionan, 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. Actualmente, soluciono esto enlazando a mi archivo, pero esto no es ideal cuando se llega a las primeras publicaciones del año y hay menos publicaciones y no hay una forma obvia de continuar.

    
pregunta Jan Fabry 12.08.2010 - 11:46

4 respuestas

6

Lo resolví utilizando el parámetro de consulta offset . Esto me permitió editar la consulta en el gancho pre_get_posts , 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 requieren otras modificaciones.

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;
    }
}
    
respondido por el Jan Fabry 12.08.2010 - 18:17
3

Bien, quizás 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 nuevas de una categoría específica en la página principal. Así lo hice:

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

se ve así: enlace (la página está en alemán, lo siento)

Si esta podría ser la forma para usted y necesita más información o un ejemplo de código para la plantilla de la página, comente y editaré esta publicación.

    
respondido por el Hinek 12.08.2010 - 12:18
1

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

Para mostrar solo una publicación (en cualquier categoría) en la página principal es fácil. Use query_posts('post_per_page=1') en su archivo home.php 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 archivo loop.php , sugiero poner <?php global $paged; ?> antes de la declaración <?php if (have_posts()) : ?> , y usar la variable $paged y la función query_posts() para modificar su consulta para que muestre las publicaciones correctas.

Su archivo loop.php 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;
?>

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

    
respondido por el john010117 12.08.2010 - 16:26
0

Esta pregunta es un poco antigua, pero para aquellos que encuentran esto en la era moderna, nunca debes llamar a query_posts . Desde el codex de Wordpress:

  

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

     

...

     

TL; DR no usa query_posts () nunca;

En su lugar, debe usar el enganche pre_get_posts 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 posteriores), usar un gancho pre_get_posts puede dañar su paginación. Arreglar esto no es súper difícil, pero es algo que hay que tener en cuenta. Hay un ejemplo de cómo solucionar este aquí .

    
respondido por el lfalin 10.12.2013 - 19:47

Lea otras preguntas en las etiquetas