除META_QUERY外,还使用WP_QUERY时有‘COMPARE’选项吗

时间:2020-12-05 作者:breadwild

我了解compare 在以下情况下:meta-query, 但我想知道是否有可能compare 在中的另一列上wp_posts 表viaWP_Query. 我先写了这个,效果很好:

    $results = $wpdb->get_results( 
        $wpdb->prepare( 
            \'SELECT id, post_title, post_name  
             FROM \'.$wpdb->prefix.\'posts
             WHERE post_type = %s  
             AND post_status = %s
             AND post_title REGEXP "%s"
             ORDER BY post_date ASC\',
             \'post\',
             \'publish\',
             \'Daily Task:\'
        )  
    );  
但是,为了让WordPress完成这项工作,我想要这样的东西:

    $results = new WP_Query( array (
        \'post_type\'   => \'post\',
        \'post_status\' => \'publish\',
        \'orderby\'     => \'post_date\',
        \'relation\'    => \'AND\',
        array ( \'compare\'     => \'LIKE%\',
                \'post_title\'  => \'Daily Task: \'
              )
        )
    );
我搜索了互联网和抄本,只找到了meta_query. 那是因为compare, LIKE, 或REGEXP 不适用于WP_Query?

谢谢

1 个回复
SO网友:Sally CJ

我想知道是否有可能compare 在中的另一列上wp_posts 表viaWP_Query

在里面WP_Query, compare 不属于直接/顶层parameters, 并且它(默认情况下)仅用于自定义字段(或post meta)和日期查询(即meta_querydate_query), 以及comment_count parameter.

所以基本上,答案是;否“;,或者默认情况下不是。

但可以使用posts_where 和其他挂钩WP_Query.

这是我先写的,效果很好

是的,我想是的。

然而WP_Query 提供各种钩子来修改SQL查询,因此不必进行直接SQL查询(使用$wpdb), 您可以使用如下挂钩posts_whereposts_clauses.

下面是一个基于new WP_Query() call,查询标题以特定短语开头的帖子:

add_filter( \'posts_where\', \'my_posts_where\', 10, 2 );
function my_posts_where( $where, $query ) {
    if ( $value = $query->get( \'custom_param\' ) ) {
        global $wpdb;
        $like = $wpdb->esc_like( $value ) . \'%\';
        $where .= " AND {$wpdb->posts}.post_title LIKE \'$like\'";
    }

    return $where;
}

// In your template or code:
$query = new WP_Query( array(
    \'custom_param\' => \'Daily Task:\',
    // .. other args
) );
但当然,您不必使用该代码,或者如果您认为直接SQL查询在您的情况下更好,那么就直接使用它。

相关推荐

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

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