Вопрос или проблема
У меня есть пользовательский тип записи, jobs, который отображается на внешней странице с помощью WP_Query() – сам запрос работает отлично.
Однако, когда я пытаюсь разбить результаты на страницы, ссылки “предыдущий/следующий” появляются, но когда я на них нажимаю, контент не изменяется – т.е. номер страницы в URL меняется и страница перезагружается, но записи не переключаются.
Я пробовал использовать стандартные функции WordPress next_posts_link и previous_posts_link, а также плагин wp_pagenavi. В коде ниже я использую wp_pagenavi.
Вот мой код:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$params =
array( 'post_type' => 'job',
'post_status' => 'publish',
'posts_per_page' => 3,
'paged'=>$paged
);
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query($params); ?>
<?php if (function_exists('wp_pagenavi')){ wp_pagenavi(); } ?>
<?php if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
// делаем что-то с записью
<?php endwhile; endif ?>
<?php $wp_query = null; $wp_query = $temp; wp_reset_query() ?>
Любая помощь будет очень полезна – это сводит меня с ума! ^_^
Проблема может быть в том, как вы используете глобальную переменную. Ваш код манипулирует глобальной переменной $wp_query, что может вызвать непредвиденное поведение. Вместо того, чтобы перезаписывать $wp_query, рассмотрите возможность использования пользовательской переменной запроса.
-ИЛИ-
Реализуйте пользовательский запрос для постраничной навигации:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$params = array(
'post_type' => 'job',
'post_status' => 'publish',
'posts_per_page' => 3,
'paged' => $paged
);
$job_query = new WP_Query($params);
if ($job_query->have_posts()) :
while ($job_query->have_posts()) : $job_query->the_post();
// Отобразите ваши записи здесь
endwhile;
// Постраничная навигация
if (function_exists('wp_pagenavi')) {
wp_pagenavi(array('query' => $job_query));
}
wp_reset_postdata(); // Сброс данных записи после пользовательского запроса
else :
echo 'Работа не найдена';
endif;
?>
Проблема с пользовательским запросом заключается в том, что количество записей на странице сбрасывается перед загрузкой страницы. Если у вас 10 записей, то у вас только одна страница, потому что значение по умолчанию для posts_per_page – 10. Если у вас 11 записей, то вы увидите вторую страницу, но не больше.
Решение этой проблемы – изменить настройки posts_per_page в админке: Настройки > Чтение > Страницы блога показывать не более > 3. Но это изменит настройки всех архивных страниц. Быстрым решением этой проблемы является добавление
<?php global $query_string; query_posts($query_string . '&posts_per_page=10'); ?>
в верхней части ваших архивных шаблонов, где вы хотите, чтобы количество записей на странице было по умолчанию.
Попробуйте использовать <?php wp_pagenavi(); ?>
вместо <?php if (function_exists('wp_pagenavi')){ wp_pagenavi(); } ?>
и если это не сработает, попробуйте добавить этот фрагмент кода
/**
* Пользовательская постраничная навигация
*/
function custom_pagination($numpages="", $pagerange="", $paged='') {
if (empty($pagerange)) {
$pagerange = 5;
}
/**
* Эта первая часть нашей функции - это резервный вариант
* для пользовательской постраничной навигации внутри обычного цикла, который
* использует глобальные переменные $paged и $wp_query.
*
* Это хорошо, потому что теперь мы можем переопределить стандартную постраничную навигацию
* в нашей теме и использовать эту функцию как в стандартных запросах,
* так и в пользовательских запросах.
*/
global $paged;
if (empty($paged)) {
$paged = 1;
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
global $wp_query;
$big = 999999999; // нужно маловероятное целое число
$pages = paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $numpages,
'prev_next' => false,
'type' => 'array',
'prev_next' => TRUE,
'prev_text' => __('<i class="fa fa-long-arrow-left"></i>'),
'next_text' => __('<i class="fa fa-long-arrow-right"></i>'),
) );
if( is_array( $pages ) ) {
$paged = ( get_query_var('paged') == 0 ) ? 1 : get_query_var('paged');
echo '<ul>';
foreach ( $pages as $page ) {
echo "<li>$page</li>";
}
echo '</ul>';
}
}
в вашем function.php
и этот код
<?php
if (function_exists(custom_pagination)) {
custom_pagination($the_query->max_num_pages,"",$paged);
}
?>
в шаблонном файле, где вы хотите иметь постраничную навигацию.
Ответ или решение
Проблема с пагинацией пользовательских типов записей в WordPress
Когда вы работаете с пользовательскими типами записей в WordPress, такими как «jobs», и пытаетесь реализовать пагинацию, могут возникнуть проблемы, когда ссылки на старые/новые записи не работают должным образом. Ваша ситуация, когда URL меняется, но содержимое не обновляется, указывает на то, что ваш код может нуждаться в некоторой оптимизации.
1. Изменение глобальной переменной $wp_query
Исходный код, который вы предоставили, манипулирует глобальной переменной $wp_query
, что может вызвать неожиданные результаты при пагинации. Вместо того чтобы переписывать $wp_query
, лучше использовать отдельный экземпляр класса WP_Query
. Это предотвратит конфликт с основной петлей WordPress и обеспечит корректное отображение постов.
Вот ваш модифицированный код:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$params = array(
'post_type' => 'job',
'post_status' => 'publish',
'posts_per_page' => 3,
'paged' => $paged
);
$job_query = new WP_Query($params);
if ($job_query->have_posts()) :
while ($job_query->have_posts()) : $job_query->the_post();
// Отображение ваших постов
endwhile;
// Пагинация
if (function_exists('wp_pagenavi')) {
wp_pagenavi(array('query' => $job_query));
}
wp_reset_postdata(); // Сброс данных поста после пользовательского запроса
else :
echo 'Записи не найдены';
endif;
?>
2. Настройки по умолчанию для отображения постов
Проблема может быть связана и с тем, как настроены параметры отображения постов. WordPress по умолчанию использует параметры, заданные в админке. Если у вас, например, установлено отображение 10 постов на страницах, но в вашем коде вы указываете 3, конфликты могут приводить к неправильному отображению в пагинации.
Для того чтобы задать параметры отображения постов, вы можете использовать следующий код:
<?php
global $query_string;
query_posts($query_string . '&posts_per_page=3');
?>
Однако этот подход не рекомендуется, поскольку он затрагивает глобальный запрос. Использование отдельных экземпляров WP_Query
(как показано ранее) считается более безопасным и гибким.
3. Альтернативная функция пагинации
Вы также можете создать свою собственную функцию пагинации. Вот пример реализации:
function custom_pagination($numpages="", $pagerange="", $paged='') {
if (empty($pagerange)) {
$pagerange = 5;
}
global $paged;
if (empty($paged)) {
$paged = 1;
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
$big = 999999999; // need an unlikely integer
$pages = paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $numpages,
'prev_next' => true,
'prev_text' => __('«'),
'next_text' => __('»'),
) );
if (is_array($pages)) {
echo '<ul class="custom-pagination">';
foreach ($pages as $page) {
echo "<li>$page</li>";
}
echo '</ul>';
}
}
Вы можете добавить эту функцию в файл functions.php
. Она позволит вам выводить пагинацию таким образом:
<?php
if (function_exists('custom_pagination')) {
custom_pagination($job_query->max_num_pages, "", $paged);
}
?>
Заключение
При работе с пагинацией для пользовательских типов записей в WordPress важно правильно управлять объектами WP_Query
и избегать манипуляций с глобальными переменными, чтобы избежать конфликтов и непредсказуемого поведения. Используя предложенные выше методы, вы сможете реализовать корректную пагинацию на вашем сайте. Убедитесь, что вы проверяете настройки отображения постов и исключения, чтобы избежать дальнейших проблем с пагинацией.