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

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

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Этот вопрос немного старый, но для тех, кто находится в современной эпохе, вы никогда не должны звонить Query_posts. Анкет От кодекса WordPress:

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

...

Tl; dr Не используйте Query_posts () Ever;

Вместо этого вы должны использовать pre_get_posts крючок в функциях. 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 );

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top