Внедрить расширенный поиск

Я сталкиваюсь с проблемами сервера при создании моей темы WordPress:

1 Избегайте жесткого кода поискового URL в searchform.php .

Типичный шаблон может выглядеть так:

 <form class="search" method="get" action="<?php echo get_search_link(); ?>" role="search"> <input class="search-input" type="search" name="s"> <button class="search-submit" type="submit" role="button">Search</button> </form> 

Однако обратите внимание на action="<?php echo get_search_link(); ?> Действие жестко запрограммировано, предполагается, что путь поиска: http://homeurl/?s=xxx , как насчет того, если плагин изменит путь поиска на что-то как http://homeurl/search?s=xxx ?

2 Изменить поисковый URL

Мне не нравится путь по умолчанию /?s=xxx для поиска, мне нравится что-то вроде /search?s=xxx

3 Расширенный поиск с большим количеством переменных запроса

Я хочу найти ключевые слова + категорию + тег + мета значение, например:

введите описание изображения здесь

Я должен установить поисковый url для каждой ссылки в панели и hightlight, как только это текущая переменная запроса.

Это возможно,?


(Обновленная проблема была опубликована в новом посте здесь )

Согласно ответу cybmeta, я делаю следующее изменение:

 add_action('pre_get_posts', 'include_any_post_type_in_search'); function include_any_post_type_in_search($query) { if (!is_admin() && $query->is_search && $query->is_main_query()) { $tax_query = array( 'relation' => 'AND' ); if (isset($_REQUEST['c'])) { $cate = $_REQUEST['c']; array_push($tax_query, array( 'taxonomy' => 'category', 'terms' => sanitize_text_field($cate) )); } if (isset($_REQUEST['t'])) { $tag = $_REQUEST['t']; array_push($tax_query, array( 'taxonomy' => 'post_tag', 'terms' => sanitize_text_field($tag) )); } $query->set('tax_query', $tax_query); } } add_filter('query_vars', 'cyb_query_vars'); function cyb_query_vars($vars) { array_push($vars, "t", "c"); return $vars; } function my_get_search_url($key, $val) { $query = array(); $supported = array("c", "t", "k"); foreach ($supported as $s) { if ($s == $key) { array_push($query, "$s=$val"); } else { $old_val = get_query_var($s); if (isset($old_val) && !empty($old_val)) { array_push($query, "$s=$old_val"); } } } return get_search_link(join("&", $query)); } 

Затем используйте его следующим образом:

  <?php $cates = get_categories(); foreach ($cates as $cate) { ?> <li> <a href="<?php echo my_get_search_url('c', $cate->term_id); ?>"><?php echo $cate->name; ?></a> </li> <?php } ?> 

Он генерирует URL-адрес, например: /search/c%3D9 :

1 c=9 закодирован

2 Он отображает страницу индекса, а не страницу результатов поиска.

И как только я посещу /?c=9&s=1 я могу получить результаты с ключевым словом 1 и категорией 9.

Получил индексную страницу для /?c=9 .

Получил 404 для /search?c=9

Похоже, есть проблема с переписыванием.

Solutions Collecting From Web of "Внедрить расширенный поиск"

Если вы используете get_search_link() а кто-то фильтрует URL-адрес поиска и меняет его, get_search_link() вернет отфильтрованный URL-адрес; то есть большой URL без жесткого кодирования. Вы или сторонний плагин можете изменить URL-адрес, и он всегда вернет правильное значение. Таким образом, проблем 1 и 2, похоже, не существует.

Проблема 3 имеет разные подходы:

1.- Использовать ввод в форме поиска с name равным некоторому аргументу запроса, непосредственно принимаемому WP_Query качестве строки запроса. Например, category_name :

 <form class="search" method="get" action="<?php echo get_search_link(); ?>" role="search"> <input class="search-input" type="search" name="s"> <select name="category_name"> <option value="">All categories</option> <option value="politics">Politics</option> <option value="economy">Economy</option> </select> <button class="search-submit" type="submit" role="button">Search</button> </form> 

2.- Используйте любую WP_Query строку запроса и WP_Query к запросу поиска в действии pre_get_posts :

HTML:

 <form class="search" method="get" action="<?php echo get_search_link(); ?>" role="search"> <input class="search-input" type="search" name="s"> <select name="a_search_filter"> <option value="">All categories</option> <option value="politics">Politics</option> <option value="economy">Economy</option> </select> <button class="search-submit" type="submit" role="button">Search</button> </form> 

И действие:

 add_action( 'pre_get_posts', 'cyb_advanced_search' ); function cyb_advanced_search( $query ) { if ( ! is_admin() && $query->is_search && $query->is_main_query() ) { // Set query parameters you need // For example $search_filter = $_REQUEST[ 'a_search_filter' ]; $tax_query = [ 'taxonomy' => 'news', 'field' => 'slug', 'terms' => sanitize_text_field( $search_filter ), ]; $query->set( 'tax_query', $tax_query ); } } 

Я бы добавил строку запроса в систему WP Rewrite:

 add_filter( 'query_vars', 'cyb_query_vars' ); function cyb_query_vars( $vars ) { $vars[] = 'a_search_filter'; return $vars; } 

Теперь вы используете get_query_var() чтобы получить значение переменной пользовательского запроса:

 add_action( 'pre_get_posts', 'cyb_advanced_search' ); function cyb_advanced_search( $query ) { if ( ! is_admin() && $query->is_search && $query->is_main_query() ) { // Set query parameters you need // For example $search_filter = get_query_var( 'a_search_filter' ); $tax_query = [ 'taxonomy' => 'news', 'field' => 'slug', 'terms' => sanitize_text_field( $search_filter ), ]; $query->set( 'tax_query', $tax_query ); } } 

Наконец, вы можете получить текущий запрос и добавить / удалить классы в свои ссылки и повысить их, как вы хотите, используя CSS:

 if( get_query_var( 'a_search_filter' ) == 'category1' ) { $class = 'selected'; } <a href="..." class=".<?php esc_attr_e( $class ); ?>.">Category 1</a>