Intereting Posts
ACF – Как установить порядок меню для поля отношений PHPmailer не работает с момента обновления! Будет ли мой сайт WordPress уязвимым для межсайтового сценария (XSS), если я разрешу теги img в области комментариев? Изменить постоянную ссылку на публикацию Суб-суб-блоги – создание и импорт содержимого в пользовательский подтип Скрытые медиа-загрузки отображаются в Media Library Заглавная запятая из последнего элемента в конкатенированной строке JSON Предотвращение дублирования привязки при использовании wp_insert_post Удаление тегов объявлений удаляет категории Область переменных темы WordPress Разрешить гостю обновлять персонализированный пост с использованием ajax Как я могу получить изображение или первое изображение для публикации / страницы и отобразить его как баннер? W3 Общий кэш, CDN и файлы тем Как сохранить настраиваемые поля для вложений Заполнение меню WordPress со ссылкой на значение настраиваемого поля (загрузка файла)

Поиск по ключевым словам ограничен конкретным типом сообщения, отфильтрованным несколькими пользовательскими таксономиями?

Можно ли ограничить поиск ключевых слов конкретным типом сообщения (например, «новость»), но фильтровать результаты по выбранным пользовательским таксономии?

  • У меня есть раздел новостей.
  • У этого есть настраиваемый тип сообщения, называемый 'news'.
  • Тогда у него есть обычная таксономия «категория новостей».
  • Существует несколько пользовательских терминов таксономии, которые должны быть перечислены рядом с ними.

Скажем, например, кто-то хочет найти ключевое слово «Уэльс», и они проверяют пользовательские таксономии «Медицина» и «Финансовый», затем отображает результаты по этим поисковым запросам.

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


ОБНОВИТЬ:

У меня есть шаблон под названием archive-members.php со следующим: как я могу обернуть все это с помощью необходимого кода, чтобы показать поиск с ключевым словом + категория, просто ключевое слово или просто категорию.

<?php /** * @package WordPress * @subpackage Default_Theme */ get_header(); ?> <!-- Main Content --> <div class="post" id="post-<?php the_ID(); ?>"> <div class="entry"> <div class="left-search"> <div class="page-title-search"> <h2>Search</h2> <form id="custom-search" action="<?php bloginfo('url'); ?>/" method="get"> <?php //Get all (non-empty) terms for taxonomy 'news-category' $args = array('orderby' => 'name','order' => 'ASC'); $categories = get_terms( 'members', $args ); ?> <!-- Visible input for search term --> <p style="margin-bottom:5px!IMPORTANT;"><b>Keyword</b></p> <input type="text" class="keyword" name="s" value="" /> <div class="clear"></div> <p style="margin-top:20px!IMPORTANT;margin-bottom:2px!IMPORTANT;"><b>Specialisms</b></p> <?php //Display checkbox for each term $counter = 1; foreach ($categories as $category) { echo '<input type="checkbox" id="field-'.$counter.'" class="mycheckbox" name="mw-filter-terms[]" value="'.$category->slug.'">'; echo '<label for="field-'.$counter.'" class="mycheckbox-label">'.esc_html($category->name).'</label>'; $counter++; } ?> <!-- Hidden input to set post type to news--> <input type="hidden" name="post_type" value="members" /> <div class="clear"></div> <!-- Submit button --> <button class="blue medium awesome awesomeforward awesomesearch" type="submit">Search</button> </form> </div> </div> <div class="news-content" style="background-color:#ececec!IMPORTANT;"> <div class="page-title-content"> <h2>Members Directory</h2> </div> <div class="news-content-inner"> <div class="inner-holder"> <?php the_field('content', 1886); ?> </div> </div> <a class="blue medium awesome awesomeforward" style="margin-left:193px;margin-bottom:10px;color: white !important; " href="<?php bloginfo('url'); ?>/member-signup/">Become A Member</a> <div class="news-content" style="background-color:#ececec!IMPORTANT;"> <div class="page-title-content"> <h2>Search Results</h2> </div> <div class="news-content-inner"> <?php $portfolioloop1 = new WP_Query( array( 'paged' => get_query_var('paged'), 'order' => 'ASC', 'orderby' => 'title', 'post_status' => 'publish', 'post_type' => 'members', 'posts_per_page' => 300 ) ); ?> <?php while ( $portfolioloop1->have_posts() ) : $portfolioloop1->the_post(); ?> <div <?php if (get_field('logo') != "") { ?>style="height:120px;"<?php } ?> class="news-item" onclick="location.href='<?php echo the_permalink(); ?>'"> <?php if (get_field('logo') != "") { ?> <div style="height:110px;float:left;"> <table> <tr> <td height="110"> <img style="margin-right:15px;" src="<?php echo the_field('logo'); ?>" width="150" alt="<?php echo the_title(); ?>" /> </td> </tr> </table> </div> <?php } ?> <div <?php if (get_field('logo') != "") { ?>style="float:left;width:379px;"<?php } ?>> <h2><a style="color:#AA3CA7!important;" href="<?php echo the_permalink(); ?>"><?php echo the_title(); ?></a></h2> <p class="news-page"> <?php $description = get_field('description'); echo substr($description,0,300) . "..." ?> </p> </div> </div> <?php endwhile; // end of the loop. ?> </div> <div class="clear"></div> </div> </div> <?php get_footer(); ?> 

query_posts использовать query_posts и я часто нахожу, что это больше проблем, чем того стоит. Вместо этого, чтобы установить тип сообщения, вы можете просто иметь скрытый ввод внутри формы с именем «post_type» и значением (в этом примере) «news». WordPress справляется с остальными.

К сожалению, это не так легко с таксономиями (возможно, я пропустил трюк?). Однако вместо повторного поиска с помощью query_posts вы можете просто использовать фильтр pre_get_posts который выполняется до pre_get_posts базы данных для фильтрации по таксономическому термину.

Следующее предполагает, что ваша категория новостей имеет название «категория новостей», а ваш тип сообщения – «новости»:

(Сначала помните, что вы query_posts материал query_posts из шаблона поиска, так как это просто превышает запрос по умолчанию, выполняемый WordPress).

Разметка HTML

Это форма, отображающая ваш поиск:

 <form action="" method="get"> <?php //Get all (non-empty) terms for taxonomy 'news-category' $args = array('orderby' => 'name','order' => 'ASC'); $categories = get_terms( 'news-category', $args ); //Display checkbox for each term foreach ($categories as $category) { echo '<input type="checkbox" name="my-filter-terms[]" value="'.$category->slug.'">'.esc_html($category->name); } ?> <!-- Hidden input to set post type to news--> <input type="hidden" name="post_type" value="news" /> <!-- Visible input for search term --> <input type="text" name="s" value="" /> <!-- Submit button --> <input type="submit" /> </form> 

Я использовал my-filter-terms для хранения массива пули проверенных терминов. (Вероятно, было бы лучше зарегистрировать пользовательскую переменную, но пока я оставлю это. Я надеялся, что смогу использовать переменную запроса таксономии по умолчанию, но она, похоже, не работает).

Фильтровать поиск

Тип сообщения и поисковый запрос будут автоматически обрабатываться. Следующим является фильтрация по таксономическому сроку. Это касается функций theme.php:

 add_filter('pre_get_posts','my_filter_the_search',10,1); function my_filter_the_search($query){ //If the query is a search AND taxonomy terms are set, filter by those terms: if($query->is_search() && isset($_GET['my-filter-terms'])){ //Get array of slugs of checked terms $terms = (array) $_GET['my-filter-terms']; //Tax_query array $tax_query = array(array( 'taxonomy' => 'news-category', 'field' => 'slug', 'terms' => $terms, 'operator' => 'IN', )); //Tell the query to filter by tax $query->set('tax_query', $tax_query ); } return $query; } 

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

Вы должны сделать это, объединив параметры «tax_query» и «s» WP_Query. Я предполагаю, что вы используете параметры URL для этого, но вы можете настроить начальные переменные, но вы хотите.

 $search_terms = isset( $_GET['s'] ) ? urldecode( $_GET['s'] ) : ''; $news_category = isset( $_GET['news_category'] ) ? urldecode( $_GET['news_category'] ) : ''; $query_args = array( 'post_type' => 'news', 'tax_query' => array() ); if ( !empty( $search_terms ) ) { $query_args['s'] = $search_terms; } if ( !empty( $search_terms ) ) { $query_args['tax_query'][] = array( array( 'taxonomy' => 'news', 'field' => 'slug', 'terms' => $news_category ) ); } $my_posts = new WP_Query( $query_args ); if ( $my_posts->have_posts() ) { // etc 

Подробнее о параметрах WP_Query, из wordpress.org codex: https://codex.wordpress.org/Class_Reference/WP_Query