为什么分类查询运算符在Wordpress中没有“ LIKE”?

时间:2018-11-26 22:08:51

标签: php wordpress woocommerce product custom-taxonomy

我正在使用woocommerce。简而言之,我需要找到属性术语值应为“ LIKE” 100值的产品。因此,它应该找到类似以下术语:100 / 104、100 / 99。

My URL search: domain.com/?pa_boltpcd=100

所以我有一个属性(pa_boltpcd),这是一个分类法。此分类法(pa_boltpcd)具有以下术语:

100
100/104
100/99 

目前,它仅显示术语值正好为“ 100”的产品。为什么没有这样的运算符“ like”可以通过搜索“ 100”值来找到所有这三个术语。

我尝试过的事情:

function taxonomy_like( $q ) {

if(isset($q->query['pa_boltpcd'])){

    $tax_query = (array) $q->get( 'tax_query' );

    $termIds = get_terms([
        'name__like' => '100',
        'fields' => 'ids'
    ]);

    $tax_query[] = array(
        'taxonomy' => 'pa_boltpcd',
        'field' => 'term_id',
        'terms' => $termIds,
        'operator' => 'IN'
    );

    $q->set( 'tax_query', $tax_query );
}

}
add_action( 'woocommerce_product_query', 'taxonomy_like' );
  1. 首先使用此挂钩,我在条件为“ LIKE”的条件下搜索值为100的术语,因此它将找到所有这些术语。

  2. 然后我收集找到的条款ID。

  3. 此后,我创建了tax_query,可以在其中使用创建的ID进行搜索。

问题是它返回相同的结果,并且显示产品的term正好是100 ...

请给我一些提示怎么办???对不起,英语不好,请纠正我不清楚的地方。

1 个答案:

答案 0 :(得分:0)

就像在税收查询中一样,您可以查询词条数组,它不能像SQL中那样使用通配符%处理 LIKE 。希望get_terms()在使用'name__like'时可以做到这一点……

  

需要禁用产品属性复选框选项Enable Archives?

要测试以下代码,我首先使用3个术语100100/104100/99向Woocommerce添加了产品属性“ boltpcd”。然后,我在3种不同的产品中设置了属性,每种产品都有不同的用语。对我来说,将?pa_boltpcd=100添加到商店网址时,它可以工作并显示3种产品。

我使用类似的针对税收查询的挂钩对您的代码进行了非常小的更改:

add_filter( 'woocommerce_product_query_tax_query', 'custom_taxonomy_like', 10, 2 );
function custom_taxonomy_like( $tax_query, $query ) {
    $taxonomy = 'pa_boltpcd';

    if( ! isset($_GET[$taxonomy]) )
        return $tax_query;

    // The tax query
    $tax_query[] = array(
        'taxonomy' => $taxonomy,
        'field' => 'term_id',
        'terms' => get_terms([ // Get terms "%LIKE%"
            'name__like' => esc_attr( $_GET[$taxonomy] ),
            'fields' => 'ids',
            'taxonomy' => $taxonomy
        ])
    );

    return $tax_query;
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试并可以正常工作。

我得到3种产品,它们分别为pa_boltpcd分类法100100/104100/99设置了不同的术语:

enter image description here