有没有办法在没有过滤器的情况下连接WP_QUERY?

时间:2018-05-17 作者:ShoeLace1291

我有一个称为service的CPT和一个称为partner\\u request的CPT。partner\\u request CPT将具有post meta字段recipient\\u id和service\\u id,并且将具有挂起或接受的自定义post状态。我想使用WP\\u Query检索与正在查看的服务是合作伙伴的服务列表。结果中包含的帖子需要有一个partner\\u请求,其recipient\\u id或service\\u id等于原始服务的id,post\\u状态为accepted。我知道您可以使用add\\u filter(\'posts\\u join\')将join语句添加到查询中。在我看来,这看起来很草率,如果我可以在WP\\u查询参数中使用连接查询,那么管理代码就会更容易,就像使用元查询一样。

在允许用户向另一个服务发送partner\\u请求的函数中,我确保服务之间不存在其他partner\\u请求帖子。我是这样做的:

$request_atts = array(
    \'post_type\' => \'partner_request\',
    \'post_status\' => array(\'pending\', \'accepted\'),
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'relation\' => \'AND\',
            array(
                \'key\' => \'recipient_id\',
                \'value\' => 94
            ),
            array(
                \'key\' => \'service_id\',
                \'value\' => 95
            )
        ), 
        array(
            \'relation\' => \'AND\',
            array(
                \'key\' => \'recipient_id\',
                \'value\' => 95
            ),
            array(
                \'key\' => \'service_id\',
                \'value\' => 94
            )
        )

    )
);
$request_query = new WP_Query($request_atts);
if($request_query->have_posts()){
    //A request already exists
} else {
    //Send the request
}
那么,使用上面的信息,有没有一种方法可以在不使用过滤器的情况下向WP\\u查询添加join子句?

$partner_atts = array(
    \'post_type\' => \'service\',
    //Could a join that determines partners go here?
);

$partner_query = new WP_Query($partner_atts);
if($partner_query->have_posts()){
   //Display a list of partners
}

1 个回复
SO网友:Jacob Peattie

没有。向WordPress查询添加自定义联接的唯一方法是通过posts_join 过滤器或posts_clauses 筛选器,其中包含查询的所有部分。

这些过滤器接收WP_Query 对象作为参数,它允许您为WP_Query 这将影响查询。

function wpse_303758_posts_join( $join, $query ) {
    if ( $query->get( \'custom_arg\' ) === true ) {
        $join .= " LEFT JOIN my_table ON $wpdb->posts.ID = my_table.post_id";
    }

    return $join;
}
使用该过滤器JOIN 将添加到查询中,如果custom_arg 在中为真WP_Query:

$query = new WP_Query( array(
    \'custom_arg\' => true,
) );

结束

相关推荐

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

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