在WP_QUERY中查找包含%KEYWENT%词条的所有产品

时间:2018-09-05 作者:Mike

我想使用WP\\u Query查找输入字段中输入的所有产品术语。这是我的WP\\U查询代码。

$paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
$args = array(
    \'post_type\'         => \'product\',
    \'product_cat\'       => \'construction\',
    \'posts_per_page\'    => 12,
    \'paged\'             => $paged,
    \'tax_query\' => array(
        array(
            \'taxonomy\'  => \'pa_reference-p-no\',
            \'field\'     => \'slug\',
            \'terms\'     => $input_search_txt
        )
    );
);

$loop = new WP_Query( $args );
\'$input_search_txt\' 是在输入字段中输入的文本。我想在“pa\\U reference-p-no”中找到包含此文本的所有产品。For example, if I search for \'123\', I want to find products with terms \'12345\' or \'123456\'.

但现在我只能看到带有“123”一词的产品。

我想要有人帮助我。

1 个回复
SO网友:Aurovrata

不幸地tax_query 没有compare 匹配修饰符类meta_query, 允许使用“LIKE”运算符进行通配符搜索。所以你需要有一个不同的方法。我可以想出两种方法来解决这个问题,

1) 使用全局$wpdb 对象来搜索与文本搜索匹配的所有术语,然后使用这些术语ID添加operator 将修饰符匹配到当前查询,[编辑:添加了调试行,请确保enable WP_DEBUG]

    global $wpdb; 
    $term_ids = $wpdb->get_results( 
        "
        SELECT {$wpdb->terms}.term_id 
        FROM {$wpdb->terms}, {$wpdb->term_taxonomy}
        WHERE {$wpdb->terms}.term_id =  {$wpdb->term_taxonomy}.term_id
            AND {$wpdb->term_taxonomy}.taxonomy LIKE \'pa_reference-p-no\'
            AND {$wpdb->terms}.slug LIKE \'%{$input_search_txt}%\'
        ",
        ARRAY_N
    );
    //you can debug your term id results at this point by printing them in your log file, make sure WP_DEBUG is set to true in your wp_config.php file.
    error_log(\'TERM IDS:\'.print_r($term_ids,true)); //should be an array of term ids.
    $args = array(
        \'post_type\'         => \'product\',
        \'product_cat\'       => \'construction\',
        \'posts_per_page\'    => 12,
        \'paged\'             => $paged,
        \'tax_query\' => array(
            array(
                \'taxonomy\'  => \'pa_reference-p-no\',
                \'terms\'     => $term_ids,
                \'operator\'  => \'IN\'
            )
        );
    );

    $loop = new WP_Query( $args );
2)第二种方法是使用query filter posts_where 滤器因此,您可以简化查询,只搜索“产品”帖子,然后使用修改分类条件,

        add_filter( \'posts_where\' , \'posts_where\', 10,2 );

        function posts_where( $where , $query) {

            if( \'product\' == $query->query_vars[\'post_type\'] && !$query->is_main_query() && !$query->is_admin() ) {
                global $wpdb;

                if ( isset( $_POST[\'input_search_txt\'] ) && !empty( $_POST[\'input_search_txt\'] ) ) {

                   $where .= 
                   " 
                     AND {$wpdb->terms}.term_id =  {$wpdb->term_taxonomy}.term_id
                     AND {$wpdb->term_taxonomy}.taxonomy LIKE \'pa_reference-p-no\'
                     AND {$wpdb->terms}.slug LIKE \'%{$_POST[\'input_search_txt\'];}%\'
                 ";
                }
            }
            return $where;
        }
这两种解决方案都应该有效,尽管我还没有对它们进行测试。第一个更容易调试,并且只针对当前查询。第二种解决方案效率更高,因为它可以减少对DB的1次命中,但是请记住,如果不过滤$query 在初始条件下,最终可能会影响其他自定义查询,并且这些查询可能很难调试。

如果您在理解上有任何问题,请在下面的评论中告诉我。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post