在 Twig/Timber 的搜索结果中突出显示搜索词
Highlight search terms in search results in Twig/Timber
我正在研究这个问题 Twig highlight word (Timber plugin) 的答案,以更新函数以在较新的 Timber/Twig 2 过滤器结构下工作。
但是我得到的错误是 "Argument 2 passed to {closure}() must be of the type array, null given"。
所以我知道我需要将搜索词传递给函数。我该怎么做?
我是否从 search-results.twig
模板上的 {{ search_query }}
获取搜索词?
或者我可以从 search.php
和该文件中的 "context" 调用获得的全局搜索词,即 $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();
像这样传递你想要突出显示的条款
{{ 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) }}
我正在研究这个问题 Twig highlight word (Timber plugin) 的答案,以更新函数以在较新的 Timber/Twig 2 过滤器结构下工作。
但是我得到的错误是 "Argument 2 passed to {closure}() must be of the type array, null given"。
所以我知道我需要将搜索词传递给函数。我该怎么做?
我是否从 search-results.twig
模板上的 {{ search_query }}
获取搜索词?
或者我可以从 search.php
和该文件中的 "context" 调用获得的全局搜索词,即 $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();
像这样传递你想要突出显示的条款
{{ 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) }}