Вопрос или проблема
Привет! Я разрабатываю тему, где нужно загружать некоторые посты с помощью ajax. На моей главной странице всё работает правильно, проблема возникает, когда мне нужно использовать это для пользовательского типа поста. Я передаю значения для jQuery файла с помощью wp_localize_script, он передаёт правильное значение, когда у меня обычные посты, но всегда передаёт 0, когда у меня пользовательский тип поста. Можете помочь мне? Большое спасибо.
Код для передачи аргументов в мой скрипт jQuery
function core_ajax_init() {
global $wp_query;
// Добавляем код для индексных страниц.
if( !is_admin() ) { //!is_singular()
// Подключаем скрипт jQuery для обработки Ajax
wp_enqueue_script(
'core_custom',
get_template_directory_uri(). '/core/js/ajax-load-posts.js',
array('jquery'),
'1.0',
true
);
// На какой странице мы находимся? И каков предел страниц?
$max = $wp_query->max_num_pages;
$paged = ( get_query_var('paged') > 1 ) ? get_query_var('paged') : 1;
//echo $max;
// Добавляем некоторые параметры для JS.
wp_localize_script(
'core_custom',
'core',
array(
'startPage' => $paged,
'maxPages' => $max,
'nextLink' => next_posts($max, false)
)
);
}
}
add_action('template_redirect', 'core_ajax_init');
Следующий шаблон показывает кнопку для загрузки дополнительных постов
<?php
global $wp_query;
$found_posts = $wp_query->found_posts;
$per_page = get_option('posts_per_page');
$post_count = $found_posts - $per_page;
if($found_posts > $per_page) :
?>
<div class="row" id="load-more" data-order="999">
<div class="col-md-12">
<div class="load-more-btn">
<a id="load-more-btn" href="#">
<span id="detail-holder">
<div id="loader" data-perpage="<?php echo $per_page; ?>"></div>
<div class="load-more-text"><?php _e('Нажмите здесь, чтобы загрузить больше', CORE_THEME_NAME); ?></div>
</span>
</a>
</div>
</div> <!-- /.col-md-12 -->
</div> <!-- /.row -->
<?php endif; ?>
А здесь у меня есть фрагмент, где я делаю пользовательский запрос для конкретного типа поста
global $wp_query;
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$wp_query = new WP_Query(array( 'post_type' => 'course', 'order' => 'DESC', 'orderby' => 'date', 'paged' => $paged ));
if($wp_query->have_posts()): ?>
Проблема здесь в том, что, похоже, независимо от того, сколько страниц у меня есть, переменная wp_query всегда возвращает 0 в мою функцию core_ajax_init(). Если у меня обычные посты, она возвращает правильное число страниц, но для пользовательского типа поста она всегда возвращает 0. Почему? Спасибо за ваши ответы.
Вы также можете сделать это следующим образом: посчитайте опубликованные посты, получите настройки постов на странице, затем разделите.
$published_posts = wp_count_posts()->publish;
$posts_per_page = get_option('posts_per_page');
$page_number_max = ceil($published_posts / $posts_per_page);
Ответ или решение
Проблема с wp_query->max_num_pages, который всегда возвращает 0 для настраиваемого типа постов
Введение
При разработке тем для WordPress часто возникает необходимость загружать записи с использованием AJAX, особенно когда речь идет о настраиваемых типах постов. В данном документе мы рассмотрим распространенную проблему, связанную с тем, что wp_query->max_num_pages
возвращает 0 для настраиваемых типов постов, в отличие от стандартных записей.
Описание Проблемы
Вы описали ситуацию, когда при использовании AJAX для загрузки постов настраиваемого типа, переменная max_num_pages
всегда равна 0. Это происходит независимо от того, сколько фактически записей существует для данного типа поста.
Код, который вы предоставили, показывает правильную структуру использования wp_localize_script
, однако, вы обращаетесь к переменной $wp_query
, которая была обновлена вашими запросами к настраиваемым типам постов. Как только вы используете new WP_Query()
, информация о max_num_pages
больше не будет корректно возвращаться от глобального $wp_query
, так как она была перезаписана.
Причины
-
Переопределение глобального WP_Query: Когда вы создаете новый объект
WP_Query
, он замещает глобальный$wp_query
, при этом, значения, которые вы ожидаете получить, являются локальными для данного объекта и не отражают состояние глобального запроса. -
Необработанные параметры: Хотя WordPress автоматически обрабатывает запросы для стандартных типов постов, для настраиваемых типов постов вам может потребоваться переопределить или убедиться, что аргументы передаются правильно.
Решение
Чтобы решить вашу проблему, вам нужно использовать отдельный экземпляр WP_Query
, не затрагивая глобальный $wp_query
. Таким образом, вы можете получить правильное количество страниц. Рассмотрим следующий вариант:
Измените функцию core_ajax_init следующим образом:
function core_ajax_init() {
// Проверяем, не находимся ли в админке
if (!is_admin()) {
// Подключаем скрипт для обработки AJAX
wp_enqueue_script(
'core_custom',
get_template_directory_uri(). '/core/js/ajax-load-posts.js',
array('jquery'),
'1.0',
true
);
// Получаем текущую страницу
$paged = (get_query_var('paged') > 1) ? get_query_var('paged') : 1;
// Создаем новый запрос для настраиваемого типа поста
$custom_query = new WP_Query(array(
'post_type' => 'course', // Замените 'course' на ваш пост тип
'paged' => $paged,
'posts_per_page' => get_option('posts_per_page'),
));
// Установите максимальное количество страниц
$max = $custom_query->max_num_pages;
// Передаем параметры в JS
wp_localize_script(
'core_custom',
'core',
array(
'startPage' => $paged,
'maxPages' => $max,
'nextLink' => next_posts($max, false)
)
);
// Не забывайте очищать запрос после использования!
wp_reset_postdata();
}
}
add_action('template_redirect', 'core_ajax_init');
Заключение
С помощью вышеописанных изменений вы сможете корректно получить max_num_pages
для вашего настраиваемого типа записи. Не забывайте, что любой новый экземпляр WP_Query
не должен изменять глобальный $wp_query
, поэтому важно использовать wp_reset_postdata()
для возврата к исходной переменной после выполнения запросов.
Если причина все еще остается неясной, обязательно проверьте, правильно ли вы настроили параметры вашего пользовательского типа записи и правильно ли указываете необходимые аргументы запроса.
Надеюсь, это решение будет полезно и поможет вам успешно реализовать функцию AJAX загрузки постов для ваших настраиваемых типов записей.