Добавление / удаление фильтра из другого фильтра в WordPress

#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:

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

  1. Установите новый searchform.php
  2. Добавьте свой 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 это не фильтр.