hinek
  • 0
Новичок

Как сделать так, чтобы один пост отображался на главной странице, но при этом сохранялся нормальный пейджинг?

  • 0

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

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

Share
  1. Я решил это, используя параметр 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;
        }
    }
    
    • 0
  2. Хорошо, может быть, это странный или сложный способ сделать это, но у меня была похожая проблема (я хотел отобразить текст приветствия и три последних сообщения определенной категории на первой странице. Так я сделал:

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

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

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

    • 0
  3. Я предполагаю, что вы используете 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 и так далее.

    • 0
  4. Этот вопрос немного устарел, но для тех, кто находит это в современную эпоху, вам никогда не следует вызывать 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

Оставить ответ

You must login to add an answer.