【问题标题】:How to do a partial match in Wordpress tax_query for custom taxonomy如何在 Wordpress tax_query 中为自定义分类法进行部分匹配
【发布时间】:2020-06-17 12:35:57
【问题描述】:

我们在分类法中搜索某些术语。搜索短语 $search_data(在我们的示例中:4000342)来自搜索表单字段。

当搜索词组与字词完全匹配时,查询看起来像这样并且通常已经可以正常工作:

$search_data = 4000342;
$args =  array (
    'post_type' => 'product',
    'tax_query' => array(
          array(
              'taxonomy' => 'pa_version',
              'field' => 'slug',
              'terms' => $search_data
          )
      ),
 ); 

此搜索显示所有具有分类术语 4000342 的产品。

但是有很多不同的术语包含搜索词组 (4000342) 作为术语的一部分,例如:XC-KK-4000342-8。

我们希望显示分类术语包含搜索词组的所有产品。

我们在 tax_query 中尝试了不同的运算符,但在这种情况下它们似乎都不起作用。我们如何使用tax_query 进行部分匹配?

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    WP_Query 不允许对分类搜索进行 LIKE 比较,因此您需要执行 2 个步骤:

    1. 首先获取与您的搜索词部分匹配的所有 slug 的列表。
    2. 然后在您的tax_query 中使用此列表来搜索与此列表中的 slug 完全匹配的所有 slug。

    1.获取所有部分匹配的 slug

    使用get_terms 获取包含您的搜索字词$search_data 的所有字词的列表。

    您不需要正则表达式 - get_terms 已经有一个参数 name__like 将执行部分匹配而不是完全匹配。

    $matching_terms = get_terms( array(
        'taxonomy' => 'pa_version',
        'fields' => 'slugs', // searches in the slug and returns an array of matching slugs
        'name__like' => $search_data, 
    ) );
    

    这将返回与您的搜索词部分匹配的所有 slug 的数组,例如('4000342', 'XC-KK-4000342-8', '123440003425')

    注意:get_terms默认不返回空词。如果要包含空词,可以在参数中包含'hide_empty' => false。)

    2。在您的tax_query 中使用它来搜索此列表中的所有蛞蝓

    $args =  array (
        'post_type' => 'product',
        'tax_query' => array(
              array(
                  'taxonomy' => 'pa_version',
                  'field' => 'slug',
                  'terms' => $matching_terms
              )
          ),
     ); 
    

    查看更多关于这个和其他WP__Term_Query parameters here的信息,可以传递给get_terms

    【讨论】:

    • 我理解背后的逻辑。但是 $matching_terms 不输出任何东西。即使完整的术语 slug 是确切的 search_data,例如4001681。部分“'name__like' => 4001681”由于某种原因不起作用。
    • 此代码有效,因为我以前在网站中使用过它,所以还有其他影响它。您的查询中还有其他参数吗?另外,您使用的是哪个版本的 Wordpress? get_terms 的功能在版本之间发生了变化。如果你 var_dump($matching_terms);你得到了什么?
    • "var_dump($matching_terms); => array(0) { } " 参数看起来是正确的。里面没有别的东西。似乎搜索字符串不正确。但是当我回显搜索字符串时,它会显示确切的 stzring,例如术语 slug 和名称(展位相同)。我使用 WP 5.4.2。
    • WP 版本没问题。嗯...如果您省略了 name__like arg,您的 slug 是否包含在 var_dump 结果中?另外,我想知道问题是否是因为它是一个数字并且它对待它的方式不同......尝试将您的搜索字符串更改为上一个 var_dump 中显示的非数字 slug 之一。
    • 嘿,非常感谢。它确实有效,我发现了问题。某些属性术语未正确分配给产品。它们在产品(后端和前端)中可见,但是当我访问“产品 => 属性”时,属性术语显示计数 0(附加到某个分类术语的产品数量)。你知道如何解决这个问题吗?
    【解决方案2】:

    您可以使用正则表达式来做到这一点。首先,您需要了解所有条款:

    $terms = get_terms( array(
        'taxonomy' => 'pa_version',
        'field' => 'slug',
    ) );
    

    然后得到正则表达式结果:

    $filtered_terms = preg_grep('/' . $search_data . '/gm', $terms);
    

    并在您的税务查询中使用它:

    $args =  array (
        'post_type' => 'product',
        'tax_query' => array(
            array(
                'taxonomy' => 'pa_version',
                'field' => 'slug',
                'terms' => $filtered_terms
            )
        ),
    ); 
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢。但我无法让它工作。如果我回显 $filtered_terms 它是空的。 '/gm' 部分是什么意思? $terms 是一个数组,对吧? preg_grep 会自行搜索数组吗?
    • 对不起,我弄错了,terms 查询应该使用“field”属性而不是“fields”,我改变答案,试试这个方法,告诉我它是否有效
    【解决方案3】:

    您需要使用关系“OR”来显示来自两个分类的产品,或使用关系“AND”来显示具有两个分类的产品,如下所示:

    $args =  array (
        'post_type' => 'product',
        'tax_query' => array(
              'relation' => 'OR',
              array(
                  'taxonomy' => 'pa_version',
                  'field' => 'slug',
                  'terms' => 4000342,
              ),
              array(
                  'taxonomy' => 'pa_version',
                  'field' => 'slug',
                  'terms' => 'XC-KK-4000342-8',
              )
          ),
     ); 
    

    【讨论】:

    • 这只是一个例子。用户使用搜索表单。因此,他搜索的术语将来自搜索表单。我们有数以千计的 7 位数字供用户搜索。还有数以千计的其他包含 7 位数字的术语。所以我们不能像你的例子那样工作。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2014-07-20
    • 2013-09-29
    相关资源
    最近更新 更多