Пагинация не работает на главной странице

25 апр. 2013 г., 04:23:04
Просмотры: 15.4K
Голосов: 4

У меня есть страница с названием "share" со сложным циклом, которая работает идеально. Эта страница расположена по адресу domain.com/share. Теперь мне нужно использовать эту страницу как главную, поэтому я зашел в "Настройки -> Чтение" и выбрал эту страницу как статическую.

Теперь проблема в том, что пагинация перестала работать. На самой странице ссылки выглядят как domain.com/share/page/2, но теперь отображаются как domain.com/page/2 и просто загружают то же содержимое с первой страницы снова и снова, независимо от того, на какой странице вы находитесь.

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

Я использую WP Pagenavi, если это имеет значение.

Вот мой шаблон page.php:

<?
$paged = get_query_var('paged') ? get_query_var('paged') : 1;

if (is_page('join')) $post_types = array('articles');
if (is_page('learn')) $post_types = array('actions');
if (is_page('share')) $post_types = array('articles', 'actions');

$category = get_query_var('category');
$type = get_query_var('type');

$args = array(
  'post_type' => $post_types,
  'paged' => $paged,
  'tax_query' => array('relation' => 'AND')
);

$taxonomies = array();
foreach ($post_types as $post_type) {
  foreach (get_object_taxonomies($post_type) as $tax) {
    if (array_search($tax, $taxonomies) === false) $taxonomies[] = $tax;
  }
}

foreach ($taxonomies as $taxonomy) {

  $all_terms = get_terms($taxonomy, array('fields' => 'names'));
  $query_terms = array(ucfirst($category), ucwords(str_replace('-', ' ', $type)));
  $cur_terms = array_values(array_filter(array_intersect($all_terms, $query_terms)));

  if (! empty($cur_terms)) {
    $args['tax_query'][] = array(
      'taxonomy' => $taxonomy,
      'terms' => empty($cur_terms) ? $all_terms : $cur_terms,
      'field' => 'slug'
    );
  }
}

if (is_page('join')) $args['posts_per_page'] = 36;

$query = new WP_Query($args);

get_header();
Theme::toolbar();
?>

<div class="center">
  <div id="content">
    <? if ($query->have_posts()): ?>
      <? while ($query->have_posts()): $query->the_post() ?>
        <? get_template_part('content') ?>
      <? endwhile ?>
    <? else: ?>
    <? endif ?>
  </div>
</div>

<?
wp_reset_query();
Theme::pagination($query);
get_footer();
?>

А вот код пагинации в классе Theme:

function pagination($query = null)
{
  global $wp_query;
  if (empty($query)) $query = $wp_query;
  $is_paged = $query->max_num_pages > 1;
  ?>

  <? if ($is_paged): ?>
    <div class="center"><div id="pagination"><? wp_pagenavi(array('query' => $query)) ?></div></div>
  <? endif ?>

  <?
}
8
Комментарии

Возможно, я что-то упускаю, но есть ли особая причина, по которой вы вызываете wp_reset_query(); перед вызовом пагинации?

netfreak netfreak
25 апр. 2013 г. 14:49:58

Есть ли в вашей теме шаблон front-page.php? Если да, то он будет иметь приоритет над шаблоном page.php.

mrwweb mrwweb
25 апр. 2013 г. 18:08:17

@mrwweb: Нет, нет front-page.php. Контент отображается нормально, как и в share. Пагинация отображается, но все страницы загружают контент с первой. У меня бесконечная прокрутка, поэтому она зацикливается и бесконечно загружает один и тот же контент.

elclanrs elclanrs
25 апр. 2013 г. 22:39:28

Можешь включить WP_DEBUG и, возможно, дампить твой $query, особенно когда переходишь на следующую страницу?

netfreak netfreak
26 апр. 2013 г. 01:49:36

@netfreak: У меня включен WP_DEBUG. Я только что снова внимательно проверил запрос, и в page/2 он показывает paged=>1?! Но в share/page/2 он показывает paged=>2... Я не понимаю.

elclanrs elclanrs
26 апр. 2013 г. 02:09:41

is_page('share') больше не возвращает true, когда это главная страница, не уверен, влияет ли это на проблему.

Milo Milo
26 апр. 2013 г. 02:23:14

@Milo: Я попробовал использовать is_front_page(), но это не дало результата, проблема остаётся...

elclanrs elclanrs
26 апр. 2013 г. 03:26:15

Пожалуйста, избегайте длинных обсуждений в комментариях. @elclanrs добавляйте дополнительную информацию через [редактирование], а не через комментарии.

kaiser kaiser
25 апр. 2014 г. 09:41:03
Показать остальные 3 комментариев
Все ответы на вопрос 4
1
11

Я столкнулся с такой же проблемой. И в итоге решил её.
Получение текущего номера пагинации

<?php  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  ?>

Для получения текущего номера пагинации на статической главной странице (шаблон Page) необходимо использовать переменную запроса 'page'.

<?php  $paged = (get_query_var('page')) ? get_query_var('page') : 1;  ?>

Таким образом, следует использовать get_query_var('page') вместо get_query_var('paged').
Можно использовать функцию is_front_page() в условии if для запроса главной страницы. Например:

<?php
if(is_front_page()) {
    $paged = (get_query_var('page')) ? get_query_var('page') : 1;
}else {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
}

Источник: здесь

31 июл. 2017 г. 18:25:00
Комментарии

Блестяще! Спасибо!!

tillinberlin tillinberlin
15 апр. 2024 г. 15:56:31
0

Я не проверял это, но на странице WP Query сказано:

Примечание о пагинации: Используйте get_query_var('page');, если хотите, чтобы ваш запрос работал в шаблоне Страницы, который вы установили как статическую главную страницу.

Возможно, вам нужно это:

$page_number = get_query_var('page') ? get_query_var('page') : 1;

[ ... ]

$args = array(
    'post_type' => $post_types,
    'page'      => $page_number,
    'tax_query' => array( 'relation' => 'AND' ),
);
10 мая 2013 г. 21:21:03
0

Я использую этот код для пагинации в файле index.php внутри цикла:

<?php if ( have_posts() ) :  while ( have_posts() ) : the_post(); ?>
    // добавляем заголовок, краткое описание или постоянные ссылки 
<?php endwhile; ?>
    <?php pagination(); ?>
<?php else : ?>
        <?php // здесь сообщение об отсутствии записей ?>
<?php endif; ?>

Затем добавляем следующие строки в functions.php:

function pagination() {

    if( is_singular() )
        return;

    global $wp_query;

    /** Останавливаем выполнение, если всего 1 страница */
    if( $wp_query->max_num_pages <= 1 )
        return;

    $paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
    $max   = intval( $wp_query->max_num_pages );

    /** Добавляем текущую страницу в массив */
    if ( $paged >= 1 )
        $links[] = $paged;

    /** Добавляем страницы вокруг текущей в массив */
    if ( $paged >= 3 ) {
        $links[] = $paged - 1;
        $links[] = $paged - 2;
    }

    if ( ( $paged + 2 ) <= $max ) {
        $links[] = $paged + 2;
        $links[] = $paged + 1;
    }

    echo '<div class="navigation"><ul>' . "\n";

    /** Ссылка на предыдущие записи */
    if ( get_previous_posts_link() )
        printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

    /** Ссылка на первую страницу и многоточие при необходимости */
    if ( ! in_array( 1, $links ) ) {
        $class = 1 == $paged ? ' class="active"' : '';

        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );

        if ( ! in_array( 2, $links ) )
            echo '<li>…</li>';
    }

    /** Ссылка на текущую страницу и +-2 страницы при необходимости */
    sort( $links );
    foreach ( (array) $links as $link ) {
        $class = $paged == $link ? ' class="active"' : '';
        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
    }

    /** Ссылка на последнюю страницу и многоточие при необходимости */
    if ( ! in_array( $max, $links ) ) {
        if ( ! in_array( $max - 1, $links ) )
            echo '<li>…</li>' . "\n";

        $class = $paged == $max ? ' class="active"' : '';
        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
    }

    /** Ссылка на следующие записи */
    if ( get_next_posts_link() )
        printf( '<li>%s</li>' . "\n", get_next_posts_link() );

    echo '</ul></div>' . "\n";

}
3 сент. 2013 г. 10:26:22
0

Вы сбрасываете запрос перед генерацией пагинации, посмотрите на эти строки вашего кода:

wp_reset_query();
Theme::pagination($query);
get_footer();

Я не стал смотреть дальше из-за этого. Исправьте это и сообщите, решило ли это проблему.

3 сент. 2013 г. 10:49:59