Как показать один пост на первой странице, но с обычной подкачкой?


Я хотел бы, чтобы на моей первой странице была одна запись (всегда последняя), но пусть работает обычная подкачка. Таким образом, на первой странице есть сообщение 1, на следующей странице должно быть сообщение 2-11 (1-10 тоже хорошо), затем 12-21 или 11-20 и так далее. Я знаю, что могу изменить количество сообщений в зависимости от контекста , но установка этого значения на "1" на главной странице означает, что на последующих страницах также отображается только одно сообщение.

Моя главная проблема в том, что /page/2/ и так далее работает, но /page/1/ всегда перенаправляет на настоящую домашнюю страницу, /. Это означает, что сообщения 2-10 всегда пропускаются, так как на странице 2 показано 11-20. Я в настоящее время решаю эту проблему, связываясь с моим архивом, но это не идеально, когда вы переходите к первым публикациям года, и там меньше сообщений и нет очевидного способа продолжения.

Author: Community, 2010-08-12

4 answers

Я решил ее с помощью параметра запроса offset . Это позволило мне отредактировать запрос в крючке pre_get_posts, и, похоже, это самый чистый способ сделать это без нового запроса. Теперь на домашней странице отображается только одно сообщение, а page/2/ показывает сообщения 2-11. Все ссылки продолжают работать, никаких других изменений не требуется.

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;
    }
}
 8
Author: Jan Fabry, 2010-08-12 18:21:23

Хорошо, может быть, это странный или сложный способ сделать это, но у меня была похожая проблема (я хотел отобразить текст приветствия и три новых сообщения определенной категории на первой странице. Так я и сделал:

  1. Создал новую страницу под названием главная и разместил на ней мой приветственный текст.
  2. Деактивировал домашнюю страницу по умолчанию и установил мою пользовательскую домашнюю страницу в качестве начальной страницы
  3. Создал новый (скопировал и изменил существующий) шаблон страницы
    1. пусть он отобразит страницу тело
    2. загрузите три новейших сообщения категории X и отобразите их
    3. под ним есть ссылка "больше", которая ссылается на /категория/категория-x/

Выглядит так: http://hinek.de (страница на немецком, извините)

Если это может быть для вас, и вам нужно больше информации или образец кода для шаблона страницы, прокомментируйте, и я отредактирую это сообщение.

 3
Author: Hinek, 2010-08-12 10:18:05

Я предполагаю, что вы используете Wordpress 3.0.x?

Легко показать только один пост (в любой категории) на первой странице. Использовать query_posts('post_per_page=1') в вашем файле home.php вместо вызова get_template_part('loop').

Следовать обычным методам подкачки после этого немного сложнее. В вашем файле loop.php я предлагаю поместить <?php global $paged; ?> перед оператором <?php if (have_posts()) : ?> и использовать переменную $paged и функцию query_posts() для изменения вашего запроса, чтобы он отображал правильные сообщения.

Ваш loop.php файл будет выглядит примерно так (примечание: не проверено):

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

Я использовал $paged - 1 просто потому, что на странице 2 будут показаны сообщения 1-10, а на странице 3 будут показаны сообщения 11-20 и так далее.

 1
Author: john010117, 2010-08-12 14:41:26

Этот вопрос немного устарел, но для тех, кто находит это в современную эпоху, вы никогда не должны вызывать query_posts. Из кодекса Wordpress:

Query_posts() - чрезмерно упрощенный и проблематичный способ изменения основного запрос страницы путем замены ее новым экземпляром запроса. Это неэффективно (повторные запуски SQL-запросов) и в некоторых случаях приведет к полному сбою (особенно часто при разбиении сообщений на страницы).

...

TL;DR не используйте query_posts() когда-либо;

Вместо этого вы должны использовать крючок pre_get_posts в functions.php следующим образом:

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

Однако имейте в виду, что в некоторых случаях (например, при корректировке смещений записей) использование крючка pre_get_posts может исказить вашу разбивку на страницы. Исправить это не очень сложно, но об этом нужно знать. Вот пример того, как это исправить здесь.

 0
Author: lfalin, 2020-06-15 08:21:38