Вопрос или проблема
Я нашел этот код, который идеально подходит для того, над чем я работаю, но требует небольших изменений. Что мне нужно, так это просто отобразить подкатегории родительской категории.
Как мне изменить get_categories()
, чтобы получить только конкретные категории, которые мне нужны? Потому что это будет отображать все доступные категории.
function ba_SearchFilter($query) {
if (!$query->is_search) {
return $query;
}
if (isset($_POST['cat'])){
$query->set('category__and', $_POST['cat']);
}
if (isset($_POST['tags'])){
$query->set('tag__and', $_POST['tags']);
}
return $query;
}
//подключение фильтров к поиску
add_filter('pre_get_posts','ba_SearchFilter');
function ba_search_with_filters(){
$out="<form role="search" method="get" id="searchform" action="". home_url( "https://wordpress.stackexchange.com/" ).'">
<div><label class="screen-reader-text" for="s">Поиск:</label>
<input type="text" value="" name="s" id="s" /><br />';
$categories= get_categories();
foreach ($categories as $category) {
$option = '';
$option .= '<input type="checkbox" name="cat[]" id="cat[]" value="'.$category->term_id.'"> ';
$option .= $category->cat_name .'<br />';
$out.= $option;
}
$tags= get_categories();
foreach ($tags as $tag) {
$option = '';
$option .= '<input type="checkbox" name="tags[]" id="tags[]" value="'.$tag->term_id.'"> ';
$option .= $tag->cat_name .'<br />';
$out.= $option;
}
$out .='<input type="submit" id="searchsubmit" value="Поиск" />
</div>
</form>';
return $out;
}
add_shortcode('search_with_filter','ba_search_with_filters');
Добавлен аргумент для $categories
. Введите ID родительской категории, чтобы отобразить все подкатегории.
function ba_SearchFilter($query) {
if (!$query->is_search) {
return $query;
}
if (isset($_POST['cat'])){
$query->set('category__and', $_POST['cat']);
}
if (isset($_POST['tags'])){
$query->set('tag__and', $_POST['tags']);
}
return $query;
}
//подключение фильтров к поиску
add_filter('pre_get_posts','ba_SearchFilter');
function ba_search_with_filters(){
$out="<form role="search" method="get" id="searchform" action="". home_url( "https://wordpress.stackexchange.com/" ).'">
<div><label class="screen-reader-text" for="s">Поиск:</label>
<input type="text" value="" name="s" id="s" /><br />';
$args = array ( 'child_of' => 1 );
$categories= get_categories( $args );
foreach ($categories as $category) {
$option = '';
$option .= '<input type="checkbox" name="cat[]" id="cat[]" value="'.$category->term_id.'"> ';
$option .= $category->cat_name .'<br />';
$out.= $option;
}
$out .='<input type="submit" id="searchsubmit" value="Поиск" />
</div>
</form>';
return $out;
}
add_shortcode('search_with_filter','ba_search_with_filters');
Получите текущую категорию, в которой вы находитесь, исходя из $_POST
. Затем получите все дочерние категории.
$args = array();
if ( isset( $_POST['cat'] ) ) {
$args = array( 'child_of' => (int) $_POST['cat'] );
}
$categories = get_categories( $args );
Замените следующие две строки кода:
$categories= get_categories();
на $categories= get_categories(array('hide_empty' => 0 ));
и
$tags= get_categories();
на $tags= get_categories(array('hide_empty' => 0 ));
Я добавил параметр array('hide_empty' => 0 )
, чтобы пропустить пустой список. Надеюсь, это поможет вам!
Ответ или решение
Как отобразить только подкатегории родительской категории с помощью функции get_categories()
В процессе разработки функционала поиска с фильтрами в WordPress, вам может понадобиться отобразить только подкатегории определенной родительской категории. Чтобы реализовать это, необходимо внести некоторые изменения в функцию ba_search_with_filters()
, а также в аргументы, передаваемые в функцию get_categories()
. Давайте рассмотрим, как этого добиться.
Шаг 1: Определение родительской категории
Для начала, вам нужно будет передать идентификатор родительской категории, подкатегории которой вы хотите отобразить. Это можно сделать с помощью переменной POST, которую вы можете получить из формы поиска.
Шаг 2: Изменение кода функции ba_search_with_filters()
-
В функции
ba_search_with_filters()
вам нужно будет заменить часть, отвечающую за получение категорий, на код, который будет использовать переменную POST для получения идентификатора родительской категории. -
Также убедитесь, что вы указываете необходимые параметры в функции
get_categories()
, чтобы получать только те категории, которые вам нужны.
Вот как можно изменить вашу функцию:
function ba_search_with_filters(){
$out = '<form role="search" method="get" id="searchform" action="'. home_url( "/search/") .'">
<div><label class="screen-reader-text" for="s">Search for:</label>
<input type="text" value="" name="s" id="s" /><br />';
// Инициализация параметров для получения категорий
$args = array( 'hide_empty' => 0 ); // получите все категории, включая пустые
if ( isset( $_POST['cat'] ) ) {
// Получаем подкатегории, если установлен идентификатор родительской категории
$args['child_of'] = (int) $_POST['cat'];
}
$categories = get_categories($args);
foreach ($categories as $category) {
$option = '';
$option .= '<input type="checkbox" name="cat[]" id="cat[]" value="'.$category->term_id.'"> ';
$option .= $category->cat_name .'<br />';
$out .= $option;
}
$out .= '<input type="submit" id="searchsubmit" value="Search" />
</div>
</form>';
return $out;
}
add_shortcode('search_with_filter', 'ba_search_with_filters');
Оптимизация SEO и читабельность
- Убедитесь, что ваша форма поиска правильно захватывает и обрабатывает входные данные пользователя, что поможет улучшить пользовательский опыт.
- Используйте понятные и описательные label для ваших полей ввода, это не только поможет пользователям, но и улучшит SEO.
- Не забывайте об обработке пользовательских данных для предотвращения возможных уязвимостей, таких как SQL инъекции.
Заключение
С помощью приведенного выше кода вы можете легко отобразить только подкатегории для выбранной родительской категории. Корректируя параметры функции get_categories()
, вы получаете гибкость в управлении категориями и точно настраиваете отображение необходимой информации для пользователей. Успехов в вашей работе с WordPress!