it-swarm.xyz

Как отобразить один пост на главной странице, но при нормальном пейджинге?

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

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

8
Jan Fabry

Я решил это, используя параметр запроса 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;
    }
}
6
Jan Fabry

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

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

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

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

3
Hinek

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

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