Intereting Posts
Уникальный PHP на каждой странице Как добавить div в верхнее меню itiem Как вставить код отслеживания JS на страницу с помощью редактора WP? Отображение скрытых подменю при загрузке страницы – Двадцать пятая тема Как добавить кнопку, которая позволяет пользователю вставлять ссылку в текстовое поле, расположенное в интерфейсе? Справочник по функциям / человеческое время для будущих должностей preview_post_link для пользовательских типов сообщений изменение статической ссылки на относительную ссылку Пользовательская боковая панель страницы с раскрывающимся списком шаблонов Применить элементы html в выражении php .htaccess для wordpress в отдельной папке stdObject хранится в базе данных. Как преобразовать его в удобный формат? Избранные изображения metox MU Как переписать URL-адрес вызова AJAX для admin-ajax.php для соответствия URL-адресам стиля REST Как использовать SSL с помощью WordPress Network?

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

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

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

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

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

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); 

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