Term begins with a letter

时间:2013-11-14 作者:P_Enrique

我有一个模板

$terms = get_terms( "ingredient", array( \'name__like\' => $letter ) );

返回自定义分类法ingredient 开始于$letter.

的行为name__like was changed in WP 3.7 到文本搜索而不是开始。

我可以使用什么功能来实现以前的结果?我需要自定义查询吗?

4 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

您需要过滤查询,您可以使用terms_clauses 钩这与G-M的解决方案非常相似,但不需要在搜索字符串上加前缀。

function old_style_name_like_wpse_123298($clauses) {
  remove_filter(\'term_clauses\',\'old_style_name_like_wpse_123298\');
  $pattern = \'|(name LIKE )\\\'%(.+%)\\\'|\';
  $clauses[\'where\'] = preg_replace($pattern,\'$1 \\\'$2\\\'\',$clauses[\'where\']);
  return $clauses;
}
add_filter(\'terms_clauses\',\'old_style_name_like_wpse_123298\');
// $letter = \'str\'; // test
$terms = get_terms( "ingredient", array( \'name__like\' => $letter ) )

SO网友:gmazzap

这是一个骗局。

在要搜索奇怪字符串的字母前加前缀:

$letter = \'§§§\' . \'a\'; // strange string plus the letter you want to search
然后将筛选器应用于terms_clauses 挂钩:

add_filter(\'terms_clauses\', \'replace_name__like_for_ingredients\', 10, 3);

$terms = get_terms( "ingredient", array( \'name__like\' => $letter ) );
最后使用该函数删除% 在奇怪字符串和奇怪字符串本身之前:

function replace_name__like_for_ingredient( $pieces, $taxonomies, $args ) {
  if ( in_array(\'ingredient\', $taxonomies) ) {
    // replace the perc sign plus strange string with empty string so
    // LIKE \'%§§§a%\' become LIKE \'a%\'
    $pieces[\'where\'] = str_replace("%§§§", \'\', $pieces[\'where\']);
  }
  return $pieces;
}
Untested.

SO网友:Bob

我无法对之前的答案发表评论,因此我将在此处添加此注释,以防其他人也面临此问题:上述内容对我无效,因此我将其替换为:

$pattern = \'|(name LIKE )\\\'%(.+%)\\\'|\';
使用

$pattern = \'|(name LIKE )\\\'{.*?}(.+{.*?})\\\'|\';
此处建议:https://stackoverflow.com/questions/47840519/listing-custom-taxonomy-terms-by-first-letter-using-name-like-does-not-work-ev

SO网友:Macr1408

根据gmazaap的回复,我得到了:

$terms_array = [
    \'taxonomy\' => \'pa_myattr\',
    \'name__like\' => \'§§§\' . \'A\'
];
$terms = get_terms($terms_array);

add_filter(\'terms_clauses\', \'replace_name__like_for_product_attribute\', 10, 3);
function replace_name__like_for_product_attribute($pieces, $taxonomies, $args)
{
  if (in_array(\'pa_myattr\', $taxonomies)) {
    // replace the perc sign plus strange string with empty string so
    // LIKE \'{abc..}§§§a{abc...}\' become LIKE \'A%\'
    $pieces[\'where\'] = preg_replace(\'/(.* LIKE ).*§§§([A-Z])(.*)/\', \'$1\\\'$2$3\', $pieces[\'where\']);
  }
  return $pieces;
}
用WordPress 5.2.2测试

不得不用preg\\u匹配修改常规str\\u replace,因为现在WordPress似乎添加了哈希之类的内容来保护SQL注入。由于此字符串在查询之间似乎是随机的,因此唯一的解决方案是使用regex。

结束

相关推荐

GET_POST_TERMS未按预期工作

我有一个称为“水果”的自定义帖子类型,在这个类型下,我有一个称为“水果类别”的层次分类法当我在Fruit下创建一个新帖子时,我可以将其分配到一个“术语”,就像您在普通帖子类别下一样,但在Fruit Categories分类下。我在Fruit上增加了三个职位,每个职位分别分配给一个任期;“苹果”、“梨”和“香蕉”。所有这些都很好,但现在我想创建一个归档页面,简单地列出UL中的术语,用于自定义帖子类型,如下所示;我的网站。玉米/水果我面临的问题是,我使用的每个查询似乎只返回第一个词Apples。其他两个没有显