Intereting Posts
Использование выбора цвета в плагине, имеет ли значение атрибута атрибута ввода? Rewrite Rule for Post «Subpage», с разбивкой на страницы отображать сообщения из категории в рамках пользовательской таксономии Проблема с символами иврита в имени пользователя Показать тип персонализированного типа категории X на странице архива категории X? Увеличивает ли auto_load значение «нет» в wp_options Как получить и сохранить содержимое WordPress (html, css, images, videos) из Java-программы? Получение WordPress для хранения 0 значений для персонализированных метаданных типа сообщения Если на term-page -> получить текущий термин? Могу ли я определить несколько папок на одной странице? Канонические URL ресурсов через многоуровневую сеть 2012? Удаление полей с страницы профиля темы My Login Plugin Вытягивание в категории сообщений и детей в пределах категории Навигация по отдельным сообщениям как я могу начать создание панели мониторинга в разделе сообщений wordpress admin

Функциональность Sticky Post по умолчанию с WP_Query игнорируется при использовании AJAX

Я пишу пользовательскую ajax pagination для страницы архива блога, и у меня возникает проблема с липкими сообщениями.

Стандартная функциональность липких сообщений при использовании вызова WP_Query заключается в сортировке всех липких сообщений сверху, если явно не указано иное.

Мой AJAX работает корректно без ошибок и корректно отображает запрошенные сообщения без необходимости и может сортироваться по категориям и разбиению на страницы (используя posts_per_page и offset).

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

Мой аргумент:

$args = array( 'posts_per_page' => 10, 'order' => 'DESC', 'cat' => (php value retrieved from AJAX, so it changes based on user input), 'offset' => (determined via data attributes to calculate page number. $offset = ( current_page_number - 1 ) * posts_per_page ) ) $blog_posts = new WP_Query( $args ); 

Если I print_r $ blog_posts, порядок сообщений находится в порядке по умолчанию (так же, как если бы вы использовали get_posts вместо WP_Query)

Если я использую этот точный запрос на любой странице (или пост, пользовательский пост пост, архив и т. Д.), Функция WP_Query вернется в правильном порядке с липкими сообщениями сверху. Это ошибка, с которой столкнулся любой другой? Код работает нормально, мне интересно, является ли это основной ошибкой WordPress?

Я не могу сделать 2 отдельных запроса – один с только липкими сообщениями, а затем остальные, исключая липкие сообщения из-за пользовательской разбивки на страницы.

благодаря


Редактировать с помощью своего рода решения:

После того, как я сделал много поисковых запросов без успеха, следующий пост дал мне идею:

WP_Query: Почему липкий пост не первый элемент в цикле?

В нем упоминается, что WP_Query проверяет следующее, прежде чем сортировать липкие сообщения вверху:

 if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['ignore_sticky_posts'] ) { 

Поскольку я выполнял свой запрос в функции, независимо вызванной AJAX, не было никаких сообщений или идентификаторов страниц, связанных с этим конкретным фрагментом кода. Поэтому WP_Query не смог выполнить свой условный код, чтобы выполнить свою функцию sticky_post по умолчанию.

«get_posts» не позволяет показывать липкие сообщения сверху, поскольку он автоматически устанавливает «ignore_sticky_posts» в true.

Ознакомьтесь с страницей разработчиков WP для get_posts ( https://developer.wordpress.org/reference/functions/get_posts/ ). В строке 1591 фрагмента кода вы увидите:

 $r['ignore_sticky_posts'] = true; 

явно заданный непосредственно перед возвратом запроса.

Таким образом, мы не можем использовать WP_Query и get_posts в этом конкретном экземпляре.

Мое решение состояло в том, чтобы сделать следующее:

 // get_posts of all the possible posts, with your desired parameters and post-per-page set to -1 $all_posts = get_posts( $args ); // check if there are any sticky posts $sticky = get_option( 'sticky_posts' ); // there are sticky posts, do this psuedo-code if ( is_array($sticky) && !empty($sticky) ) { // do a get_post query for ONLY the sticky posts posts that are in your desired $args array $args['post__in'] = $sticky; $sticky_posts = get_posts( $args ); // merge $total_stories_id into the end of $sticky $merged = array_merge( $sticky_posts, $all_posts ); // remove duplicates and re-indexes $array = array_values( array_unique( $merged ) ); // return a slice of X elements, starting at the $offset location $return_array = array_slice( $array , [calculated post offset], [your desired post-per-page] ); } else { // else, do wordpress default (wp_query or get_posts, it doesn't matter) $return_array = get_posts( $args ); } 

Для сокращения размеров массивов, которые были переданы, я сделал:

 wp_list_pluck( [array], 'ID' ); 

на 2 массивах get_posts. Вам не обязательно это делать, это действительно зависит от того, какие данные вы передаете через AJAX.

Надеюсь, это поможет кому угодно!

Solutions Collecting From Web of "Функциональность Sticky Post по умолчанию с WP_Query игнорируется при использовании AJAX"