Intereting Posts
Как показать популярный пост в WordPress за последние 24 часа? Разработка плагина API-интерфейса WordPress – добавление пользовательской конечной точки Импортировать CSV в MySQL, с информацией о пользовательской регистрационной информации Непрозрачный черновик CPT дает ошибку 404 – когда поддержка Post Formats включена Как добавить шаблон в тему с помощью плагина? update_user_meta добавить значение сверху в существующее значение Как получить мой пользовательский тип сообщения для отображения в последних сообщениях с помощью «pre_get_posts» У кого-нибудь есть плагин, который может автоматически помечать пользовательские типы сообщений в WordPress? Добавить новую категорию Показывать братьев и сестер (если есть) и родителей Заголовки уже отправлены в Pluggable.php / домашняя страница и ошибка wp-login Помощники Javascript Проблема. Создайте задание cron для экспорта сообщений в XML-файл WordPress на сервере. Список всех имен боковой панели? Включение SSL в wordpress приводит к 404

Исключить из поиска все пользовательские сообщения, которые НЕ относятся к таксономии

У меня есть специальный пост с связанной с ним таксономией. Эта таксономия имеет только один термин, и посты либо принадлежат к ней, либо нет, булевым образом.

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

  • включают только персонализированные должности, относящиеся к термину таксономии;
  • исключить все пользовательские сообщения, которые не относятся к термину таксономии.

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

global $query_string; $query_args = explode("&", $query_string); $search_query = array(); foreach($query_args as $key => $string) { $query_split = explode("=", $string); $search_query[$query_split[0]] = urldecode($query_split[1]); } $custom_query = array(); $custom_query['tax_query'][] = array( 'taxonomy' => 'tax-whatever', 'terms' => array('term-whatever'), 'field' => 'slug', 'operator' => 'NOT IN' ); $args = array_merge( $wp_query->query, $custom_query ); query_posts( $args ); $search = new WP_Query($search_query); 

Это, конечно же, выводит все пользовательские сообщения, которые НЕ В терминах – что угодно. Как я могу выполнить полную противоположность?

РЕДАКТИРОВАТЬ

Я постараюсь объяснить свою проблему немного лучше. Давайте рассмотрим пример.

Представьте, что у меня есть таксономия, которая называется «Избранная» и только один таксономический термин «Да», который пользователи могут выбрать с помощью флажка. Полагаю, я должен был использовать два флажка («Да» и «Нет»), но я думал, что в то время это не имело большого смысла.

Когда пользователи ищут что-то на веб-сайте, в результатах появляются все страницы, сообщения и пользовательские сообщения. Единственное, что я хочу удалить из результатов поиска, – это пользовательские сообщения , которые не связаны с термином таксономии «Да», оставив все остальное, как есть. Это означает, что я хочу выводить все страницы, сообщения и пользовательские сообщения «Да».

Любые идеи, как я могу это достичь? Благодарю.

ОБНОВИТЬ

Вот моя идея: есть ли способ сделать два запроса и объединить результаты?

  • Один запрос со всеми сообщениями и страницами, кроме настраиваемого сообщения ( 'exclude_from_search' => true );
  • Другой запрос только с настраиваемыми сообщениями, которые соответствуют термину таксономии ( $custom_query['tax_query'][] = array( 'taxonomy' => 'tax-whatever', 'terms' => array('term-whatever'), 'field' => 'slug', 'operator' => 'IN' ); ).

Однако, если я использую что-то вроде:

 $mergedposts = array_merge( $wp_query->query, $custom_query ); query_posts( $mergedposts ); 

Он покажет мне только пользовательские сообщения.

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

Сейчас мой лучший вариант – создать новый таксономический термин и классифицировать все «не классифицированные» пользовательские сообщения с ним. Однако их несколько сотен, поэтому потребуется некоторое время.

НОВОЕ ОБНОВЛЕНИЕ

Я нашел способ определить, относится ли пользовательский пост к определенному термину в таксономии. Это кусок кода, который я где-то подхватил, так как у меня нет знаний PHP, чтобы создать что-то вроде этого самостоятельно. Однако я понимаю, что делается, и я адаптировал его к своей ситуации.

 function is_selected( $selected, $_post = null ) { if ( empty( $selected ) ) return false; if ( $_post ) $_post = get_post( $_post ); else $_post =& $GLOBALS['post']; if ( !$_post ) return false; $r = is_object_in_term( $_post->ID, 'selected', $selected ); if ( is_wp_error( $r ) ) return false; return $r; } 

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

Не уверен, что это шаг в правильном направлении, но, по крайней мере, это шаг.

Solutions Collecting From Web of "Исключить из поиска все пользовательские сообщения, которые НЕ относятся к таксономии"

После прочтения вашего пересмотренного вопроса было легче понять, что вы пытаетесь сделать. Мое новое решение похоже на то, что вы хотели сделать в первую очередь: оно просто исключает все должности, которые имеют ваш собственный тип, но не имеют связанного с ним «да» -term:

 $custom_query = array(); $custom_query['post_type'] = 'any'; // first, query all the posts of your custom type // that don't have the "yes"-term: $tmp_wp_query = new WP_Query(array( 'posts_per_page' => -1, 'fields' => 'ids', 'post_type' => 'your-post-type', 'tax_query' => array(array( 'taxonomy' => 'tax-whatever', 'terms' => array('term-whatever'), 'field' => 'slug', 'operator' => 'NOT IN' )) )); if(!empty($tmp_wp_query->posts)) { // Exclude the "yes"-less posts from the actual post query $custom_query['post__not_in'] = $tmp_wp_query->posts; } // now proceed with your original code and execute the definitive query $args = array_merge( $wp_query->query, $custom_query ); query_posts( $args ); $search = new WP_Query($search_query); 

Единственным недостатком является то, что теперь есть два запроса для запуска. Но первый запрос относительно легкий, поэтому потеря производительности не должна быть такой огромной.