我正在研究问题Twig highlight word (Timber plugin)的答案,以更新功能以在更新的Timber / Twig 2过滤器结构下工作。
但是我得到一个错误,即“传递给{closure}()的参数2必须是数组类型,给定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();
答案 0 :(得分: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) }}