Intereting Posts
Почему эта проверка позволяет проверить, разрешено ли пользователю редактировать сообщение, для всех, кроме супер-администраторов? Интеграция Cubepoints / Достижения get_permalink вызывает белый экран Выполняет ли вызов AJAX на стороне администратора автоматическое включение пользовательских данных / возможностей? Как включить пользовательские типы сообщений на странице тегов? Вставка записи MySQL в таблицу с массивом имен полей и массивом значений Как сделать Post Custom Column Editable Проблема с коротким кодом внутри короткого кода Как изменить WP TinyMCE Button onClick Event В чем разница между бизнес-планом WordPress и самостоящим WordPress (перспектива разработчика WordPress)? Список активных терминов таксономии plugin_dir_url & plugin_basename не работает, когда плагин находится вне wordpress dir как получить варианты выбора формата публикации в добавить новое сообщение Предупреждение Javascript появляется перед тегом <! DOCTYPE> Несколько плагинов, взаимодействующих с меню

Пользовательский WP_Query не возвращает результаты при запросе пользовательского типа сообщения

Я создал настраиваемый тип сообщения под названием «award»:

function award_post_type() { $labels = array( 'name' => 'Awards', 'singular_name' => 'Award' ); $args = array( 'labels' => $labels, 'public' => true, 'has_archive' => true, 'supports' => array( 'title', 'editor', 'excerpt' ) ); register_post_type( 'award', $args ); } add_action( 'init', 'award_post_type' ); 

Теперь я нахожусь в архиве страниц типа награды, и я пытаюсь отобразить список вознаграждений, заказанных по срокам наград (которые хранятся в настраиваемом поле). Следующие сообщения должны быть загружены через AJAX по щелчку кнопки «Загрузить еще».

Первое, что я сделал, это изменить основной запрос, используя pre_get_posts :

 function order_by_deadline( $query ) { if ( ! is_admin() && is_post_type_archive( 'award' ) ) { if( $query->is_main_query() ) { $query->set( 'orderby', 'deadline' ); $query->set( 'meta_key', 'deadline' ); } } } add_action( 'pre_get_posts', 'order_by_deadline' ); 

Это работает нормально. Но когда я пытаюсь загрузить следующие сообщения с помощью AJAX, результаты не отображаются . Вот действие, которое я передаю на вызов AJAX, который включает настраиваемый WP_Query, который я создал для вызова новых сообщений:

 function load_next_awards() { // The number of the page is received from an attribute of the Load More button. I'm 100% sure this has nothing to do with the issues I'm having, so just ignore it. $page = $_POST[ 'page' ]; $args = array( 'paged' => $page, 'post_type' => 'award', 'post_status' => 'publish' 'post__not_in' => get_option( 'sticky_posts' ), 'orderby' => 'meta_value_num', 'meta_key' => 'deadline' ); $next_posts = new WP_Query( $args ); if( $next_posts->have_posts() ) : while( $next_posts->have_posts() ) : the_post(); get_template_part( 'views/post/content', get_post_format() ); endwhile; endif; wp_reset_postdata(); die(); } 

Я теряю идеи. Пользовательский WP_Query выглядит корректно для меня, но он не возвращает никаких результатов, когда я нажимаю «Загрузить больше». Если я изменил параметр post_type для post или page , он правильно отобразит мои сообщения и страницы.

Я нашел решение. Проблема заключалась в том, что у меня был другой набор posts_per_page параметра posts_per_page в исходном запросе и в пользовательском запросе, который я делаю через AJAX. В коде, который я предоставил posts_per_page даже не существует, потому что я использую несколько вложенных классов, поэтому я опубликовал укороченную версию кода для простоты. Я был уверен, что проблемы posts_per_page с пользовательскими типами сообщений, никогда не думал, что использование разных posts_per_page может вызвать проблему. Извиняюсь.

Так что да, если вы posts_per_page той же проблемой, убедитесь, что ваша posts_per_page одинакова для всех ваших запросов!

Попробуйте инициализировать сообщение с помощью $next_posts->the_post() вместо просто the_post() . the_post сам по себе попытается использовать основной запрос, и в этом контексте его нет.

Если вы используете AJAX, вы должны контролировать свой вывод, чтобы «переплевать» контекст только один раз. И всякий раз, когда вы используете часть шаблона или какие-либо другие функции, которые печатают контент, он, вероятно, будет выводиться несколько раз (либо с помощью echo , _e либо даже разметки HTML).

В таких случаях вы должны использовать выходной буфер. В принципе, вы помещаете весь свой контент в этот буфер, а не печатаете его и после всей обработки вы, наконец, выводите / печатаете его.

Здесь вы можете найти ссылку на нее и [здесь страницу руководства PHP] об этом. 2 .

Ваши функции будут примерно такими:

 function load_next_awards() { // The number of the page is received from an attribute of the Load More button. I'm 100% sure this has nothing to do with the issues I'm having, so just ignore it. $page = $_POST[ 'page' ]; $args = array( 'paged' => $page, 'post_type' => array( 'award' ), 'post_status' => 'publish' 'post__not_in' => get_option( 'sticky_posts' ), 'orderby' => 'meta_value_num', 'meta_key' => 'deadline' ); $next_posts = new WP_Query( $args ); if( $next_posts->have_posts() ) : //initiates output buffer ob_start(); while( $next_posts->have_posts() ) : $next_posts->the_post(); get_template_part( 'views/post/content', get_post_format() ); endwhile; // clean outbut buffer (ob) after assigning it's contents to a variable $html = ob_get_clean(); endif; wp_reset_postdata(); // echo cached html markup and leave function echo $html; die(); } 

Дайте мне знать, если это поможет.