Вопрос или проблема
Я искал ответ на этот вопрос, но безуспешно. У меня есть WP-запрос, заключенный в шорткод. Я настроил функцию пагинации, которая выводит ссылки на странице. Однако URL страницы не изменяется при нажатии (href правильный — /page/2). Я понимаю, что проблема в основном запросе, когда он выполняется в шорткоде. Любая помощь будет очень appreciated.
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
'post_type' => $type,
'posts_per_page' => -1,
'orderby' => 'rand',
'paged' => $paged
);
$the_query = new WP_Query($args);
// Помещаем объект по умолчанию в временную переменную
$tmp_query = $wp_query;
// Теперь полностью очищаем его
$wp_query = null;
// Снова заполняем глобальную переменную нашим пользовательским запросом
$wp_query = $the_query;
?>
<div class="row">
<?php if ( $the_query->have_posts() ) : $i=0; ?>
<!-- цикл -->
<?php while ( $the_query->have_posts() ) : $the_query->the_post();
$sphere = get_post_meta(get_the_id(),'testimonial_profession', true);
if ($i == 2) {
$i = 0;
?>
</div>
<div class="row">
<?php
}
?>
<div class="col-md-6 col-sm-12 col-xs-12">
<div class="testimonial_inner_wrapper">
<?php if(!has_post_thumbnail()): ?>
<h4 class="testimonials-inner-title"><?php the_title(); ?></h4>
<?php if(!empty($sphere)): ?>
<div class="testimonial_sphere"><?php echo($sphere); ?></div>
<?php endif; ?>
<div class="short_separator"></div>
<?php else: ?>
<div class="media">
<div class="media-left media-top">
<div class="testimonial-media-unit">
<?php the_post_thumbnail('img-69-69', array('class'=>'testimonial-media-unit-rounded')); ?>
</div>
</div>
<div class="media-body">
<h4 class="testimonials-inner-title"><?php the_title(); ?></h4>
<?php if(!empty($sphere)): ?>
<div class="testimonial_sphere"><?php echo($sphere); ?></div>
<?php endif; ?>
<div class="short_separator"></div>
</div>
</div>
<?php endif; ?>
<div class="testimonial_inner_content" style="color:#aaaaaa"><p><?php the_excerpt(); ?></p>
</div>
</div> <!-- внутренний обертка -->
</div>
<?php $i++; endwhile; ?>
<!-- конец цикла -->
</div><div class="poNav">
<?php
$big = 999999999; // нужно маловероятное целое число
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $the_query->max_num_pages
) );
$wp_query = NULL;
$wp_query = $temp_query;
?></div>
<?php wp_reset_postdata(); ?>
<?php
$myvariable = ob_get_clean();
return $myvariable; ?>
<?php else : ?>
<p><?php _e( 'Извините, ни один пост не соответствует вашим критериям.' ); ?></p>
<?php endif;
}
Ваша переменная $args
будет полезна.
Как я вижу, вы создаете пользовательский WP_QUERY, поэтому get_query_var('paged')
не имеет отношения к вашему $the_query = new WP_QUERY
, а к global $wp_query
.
Возможное решение:
объявите global $paged
и добавьте его в $args = array( /* ваши параметры здесь*/, 'paged' => $paged );
, также измените get_query_var('paged')
на $paged
.
Ответ или решение
Конечно! Давайте рассмотрим вашу проблему с пагинацией в шорткоде WP_Query и предоставим решение.
Ваша проблема связана с тем, что вы создаёте собственный запрос с помощью WP_Query
, и, соответственно, get_query_var('paged')
не будет работать так, как вы ожидаете, поскольку он привязан к основному запросу. Для правильной работы пагинации внутри шорткода необходимо использовать собственную переменную $paged
и убедиться, что эта переменная корректно обрабатывается.
Вот шаги для исправления:
- Измените способ получения текущей страницы, используя переменную
$paged
, а неget_query_var('paged')
. - Объявите глобальную переменную
$paged
, чтобы WP_Query мог корректно отслеживать номера страниц. - Обновите ваш массив аргументов
$args
, чтобы он использовал переменную$paged
.
Вот пример исправленного кода:
function your_shortcode_function($atts) {
ob_start();
// Декларация глобальной переменной
global $paged;
$paged = (get_query_var('paged')) ? absint(get_query_var('paged')) : 1;
$args = array(
'post_type' => 'your_post_type', // укажите ваш тип поста
'posts_per_page' => 10, // измените на нужное число постов на странице
'orderby' => 'rand',
'paged' => $paged
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) : ?>
<div class="row">
<?php
$i = 0;
while ($the_query->have_posts()) : $the_query->the_post();
// Ваша логика отображения постов
?>
<div class="col-md-6 col-sm-12 col-xs-12">
<div class="testimonial_inner_wrapper">
<h4 class="testimonials-inner-title"><?php the_title(); ?></h4>
<div class="short_separator"></div>
<div class="testimonial_inner_content" style="color:#aaaaaa">
<p><?php the_excerpt(); ?></p>
</div>
</div>
</div>
<?php
$i++;
endwhile; ?>
</div>
<div class="poNav">
<?php
$big = 999999999; // Необходимое маловероятное число
echo paginate_links(array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $the_query->max_num_pages,
));
?>
</div>
<?php
else :
echo '<p>' . __('Извините, никаких записей не найдено.') . '</p>';
endif;
wp_reset_postdata(); // Сбрасываем данные постов
return ob_get_clean(); // Возвращаем весь вывод шорткода
}
Примечания:
- Имейте в виду, что значение
posts_per_page
в$args
следует установить, чтобы обеспечить количество постов на странице, а не-1
, которое показывает все записи сразу. - Убедитесь, что используется правильное имя для вашего типа поста в
post_type
. - Проверьте, чтобы ваше правило перезаписи URL было настроено правильно, чтобы поддерживать пагинацию.
С помощью этих изменений, ваша пагинация должна работать корректно, и URL страницы будет изменяться при клике на номера страниц.