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

wordpress.stackexchange https://wordpress.stackexchange.com/questions/194

  •  16-10-2019
  •  | 
  •  

Pregunta

Me gustaría tener una sola publicación en mi página principal (siempre en la última), pero deje que la paginación normal funcione. Entonces, la página principal tiene la publicación 1, la página siguiente 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 el número de publicaciones dependiendo del 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/ y así en obras, 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 corrientemente Resuelve esto vinculando a mi archivo, pero esto no es ideal cuando llegas a Las primeras publicaciones del año Y hay menos publicaciones y no hay forma obvia de continuar.

¿Fue útil?

Solución

Lo resolví usando la offset parámetro de consulta. Esto me permitió editar la consulta en el pre_get_posts Hook, y parece ser la forma más limpia de hacer esto, sin una nueva consulta. Ahora la página de inicio muestra solo una publicación, y page/2/ Muestra publicaciones 2-11. Todos los enlaces siguen funcionando, no se requiere 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;
    }
}

Otros consejos

Ok, tal vez esta sea una forma extraña o complicada de hacer esto, pero tenía 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 lo hice:

  1. Creó una nueva página llamada Home y puse mi mensaje de texto de bienvenida.
  2. Desactivó la página de inicio predeterminada y configure mi página de inicio personalizada como la página de inicio
  3. Creó una plantilla de página nueva (copiada y modificada de una existencia)
    1. Déjelo mostrar el cuerpo de la página
    2. Cargue tres publicaciones más nuevas de la categoría X y muestrelas
    3. Tenga un enlace "más" debajo de él que enlaza en/categoría/categoría-x/

Se ve como esto: 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 Infos o una muestra de código para la plantilla de página, comente y editaré esta publicación.

¿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. Usar query_posts('post_per_page=1') en tus home.php archivo 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 tus loop.php archivo, sugiero poner <?php global $paged; ?> antes de <?php if (have_posts()) : ?> declaración, y usando el $paged variable y query_posts() Funcione para modificar su consulta para que muestre las publicaciones correctas.

Su loop.php El archivo se vería algo 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 - 1 Simplemente porque la página 2 mostrará las publicaciones 1 - 10, y la página 3 mostrará las publicaciones de 11 a 20, y así sucesivamente.

Esta pregunta es un poco antigua, pero para aquellos que encuentran esto en la era moderna, nunca debes llamar consulta_posts. Desde el códice de WordPress:

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

...

Tl; dr no usa query_posts () nunca;

En su lugar, debe usar el pre_get_posts gancho en funciones.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 cuidado con que en algunos casos (como ajustar las compensaciones posteriores), utilizando un pre_get_posts El gancho puede destrozar tu paginación. Arreglar esto no es súper duro, pero es algo a tener en cuenta. Hay un ejemplo de cómo solucionar esto aquí.

Licenciado bajo: CC-BY-SA con atribución
scroll top