#php #wordpress
#php #wordpress
Вопрос:
Я пытаюсь добавить / удалить фильтр поиска WordPress в соответствии с автором страницы страницы, на которой я сейчас нахожусь. Панель поиска находится в заголовке темы и, следовательно, не зависит от страницы, на которой я нахожусь. Я хотел бы использовать идентификатор автора текущей страницы, чтобы добавить фильтр для следующего поиска, который я бы сделал в строке поиска.
Это сайт электронной коммерции. Панель поиска находится в заголовке (независимо от страницы). Я на странице магазина. Я хотел бы выполнить поиск товаров (т. Е. Сообщений с тем же идентификатором автора), связанных со страницей магазина, на которой я был до действия поиска.
Я написал код для functions.php однако это не работает, т.е. «my_search_filter» не добавляется (и не удаляется). Чего мне не хватает?
function search_filter_by_page_author()
{
$author_id = get_the_author_meta('ID');
#echo $author_id;
if (in_array($author_id, array("1", "2"))
{
add_filter( 'pre_get_posts', 'my_search_filter' );
}
else
{
remove_filter( 'pre_get_posts', 'my_search_filter' );
}
}
add_action( 'wp_head', 'search_filter_by_page_author' );
function my_search_filter( $query )
{
if ( $query->is_search amp;amp; !is_admin())
{
$query->set( 'author', '1, 2' );
}
return $query;
}
Комментарии:
1. Добро пожаловать в SO! Было бы очень полезно, если бы вы могли быть немного более конкретными в части «это не работает». Что происходит и чем это отличается от ожидаемого поведения?
2. Спасибо за комментарий. Под «не работает» я имел в виду, что «my_search_filter» не добавлен. Исправлен вопрос, как вы рекомендовали…
3. Не уверен, почему вы используете для этого две функции, когда вам
search_filter_by_page_author()
это вообще не нужно. Почему вы не используетеadd_filter('pre_get_posts', 'my_search_filter')
и не обрабатываете там условные обозначения?4. @disinfor, к сожалению, я не могу. Поисковый запрос не зависит от страницы, поэтому у меня нет идентификатора автора страницы внутри функции «my_search_filter»
5. Как вы можете получить идентификатор автора, прежде чем получить сообщение?
Ответ №1:
Вот ответ, который может быть тем, что вам нужно. На мой взгляд, вам следует
- Установите новый searchform.php
- Добавьте свой
pre_get_posts
(который, кстати, является действием, а не фильтром)
searchform.php (пример) — это находится в корневой папке вашей темы или дочерней темы.
<?php
global $post;
$author_id = $post->post_author;?>
<form method="get" id="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>" role="search" class="searchform search">
<div class="form-group">
<input type="text" class="form-control" name="s" value="<?php echo esc_attr( get_search_query() ); ?>" id="s" placeholder="<?php esc_attr_e( 'Search amp;hellip;', 'text_domain' ); ?>"/>
<input type="hidden" name="author" value="<?php echo $author_id;?>">
</div>
<button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button>
</form>
Фильтр поиска (вставить functions.php )
add_action('pre_get_posts', 'search_filter_by_page_author');
function search_filter_by_page_author($query){
if ($query->is_search amp;amp; !is_admin() amp;amp; isset($_GET['author'])) {
$query->set('author', $_GET['author']);
}
return $query;
}
Возможно, это не совсем то, что вы ищете, но я думаю, вы сможете получить положительный результат от этого в качестве отправной точки.
Комментарии:
1. Я бы не сказал, что это то, что я ищу. Я думаю, правильным ответом было бы, почему
add_filter( 'pre_get_posts', 'my_search_filter' );
не добавили фильтр. Я предполагаю, что это что-то о области видимости функций…2.
pre_get_posts
это не фильтр.