Выделите поисковые запросы в результатах поиска в Twig / Timber

Я работаю над ответом на этот вопрос Подсветка слова Twig (плагин Timber), чтобы обновите функцию, чтобы она работала в новой структуре фильтров Timber / Twig 2.

Но я получаю сообщение об ошибке: «Аргумент 2, переданный в {closure} (), должен иметь тип массива, задано значение null».

Итак, я знаю, что мне нужно передать поисковый запрос функции. Как я могу это сделать?

Получу ли я поисковый запрос от {{ search_query }} в шаблоне search-results.twig?

Или поисковые термины в глобальном списке, которые я могу получить из search.php, и "контекстный" вызов в этом файле, то есть $context['search_query'] = get_search_query();?

Мне нужно использовать фильтр стандартным способом in search-results.twig, например, этот {{ content|highlight }}, поскольку у меня есть отдельные поля для заголовка и содержания результатов поиска, и я хочу выделить термины в каждом из них.

Эта функция в functions.php в настоящее время выдает ошибку, указанную выше:

add_filter('timber/twig', function($twig) {
   $twig->addExtension(new Twig_Extension_StringLoader());

   $twig->addFilter(
     new Twig_SimpleFilter(
       'highlight', 

function($text, array $terms) {

    $highlight = array();
    foreach($terms as $term) {
       $highlight[]= '<span class="highlight">'.$term.'</span>';
    }

    return str_ireplace($terms, $highlight, $text);
}

 )
   );

   return $twig;
});

Обновление: это работает

functions.php:

add_filter('timber/twig', function($twig) {
   $twig->addExtension(new Twig_Extension_StringLoader());

   $twig->addFilter(
     new Twig_SimpleFilter(
       'highlight', 

function($text, array $terms) {

    $highlight = array();
    foreach($terms as $term) {
       $highlight[]= '<span class="highlight">'.$term.'</span>';
    }

    return str_ireplace($terms, $highlight, $text);
}

 )
   );

   return $twig;
});

и в search-results.twig:

{% set searches = [ search_query ] %}

and

{{ content|highlight(search_query|split(' ')) }}

и в search.php

$search_results = Timber::get_posts();
$context['search_query'] = get_search_query();

person BlueDogRanch    schedule 25.09.2018    source источник
comment
Как вы используете фильтр в своем шаблоне?   -  person DarkBee    schedule 25.09.2018
comment
Спасибо, я забыл добавить это; Мне нужно использовать стандартный фильтр, например {{content | highlight}}.   -  person BlueDogRanch    schedule 25.09.2018


Ответы (1)


Передайте условия, которые хотите выделить, вот так

{{ content | highlight(['foo', 'bar',]) }}

Если бы у вас был определен только один термин, вы могли бы сделать это так

{% set search = 'foo' %}
{{ content | highlight([ search, ]) }}

Если бы я был на вашем месте, я бы изменил функцию на эту

function($text, $terms) {
    if (!is_array($terms)) $terms = [ $terms, ];
    $highlight = array();
    foreach($terms as $term) {
       $highlight[]= '<span class="highlight">'.$term.'</span>';
    }

    return str_ireplace($terms, $highlight, $text);
}

Тогда вы можете передать один термин или несколько

{% set search = 'foo' %}
{{ content | highlight(search) }}

{% set searches = [ 'foo', 'bar', ] %}
{{ content | highlight(searches) }}
person DarkBee    schedule 25.09.2018
comment
Спасибо, но я не понимаю, зачем мне {% set search = ['foo', 'bar',]%} в файле ветки. Почему не {{content | выделить (ищет)}} работать без него? Это было то, что я пытался сделать, вставить условия поискового запроса в функцию. - person BlueDogRanch; 26.09.2018
comment
Это просто для примера, вы можете передать любой массив в свой шаблон twig и передать его фильтру highlight - person DarkBee; 26.09.2018
comment
Хм ... Но я не понимаю, как передать массив в шаблон веточки или в фильтр. - person BlueDogRanch; 26.09.2018
comment
Я уже показал вам, как передать его фильтру. Вам нужно только передать свои условия от вашего контроллера к вашему шаблону, как вы обычно делаете - person DarkBee; 26.09.2018
comment
Ах, это работает; Я использовал {% set search = [search_query]%}, чтобы вызвать поисковый запрос над вызовом фильтра. Работает сейчас на один срок. Но если я ищу двумя словами, ничего. Так нужна ли нам еще одна функция для добавления запятых между условиями поиска? - person BlueDogRanch; 28.09.2018
comment
Что содержит search_query? Если это список, разделенный запятыми / точками, вы можете сделать {{ content | highlight(search_query|split(',')) }} - person DarkBee; 28.09.2018
comment
Я использовал переменную дампа и обнаружил, что условия поиска разделены пробелами, поэтому использование highlight(search_query|split(' ')) работает. Спасибо! - person BlueDogRanch; 03.10.2018