在功能中将ID传递给pre_get_posts查询

时间:2014-04-03 19:25:14

标签: php mysql wordpress function

我正在尝试将帖子ID传递给函数的查询 - >设置并且函数将返回帖子。

add_action( 'pre_get_posts', 'query_booked_posts' );

function query_booked_posts( $query ) {
    if ( $condition ) { //the condition

    if ( is_home() && $query->is_main_query() )
    $results = $wpdb->get_col($wpdb->prepare( "SELECT booked_id FROM $wpdb->userbooking WHERE userid = %d",$current_user_id));

    foreach($results as $result){
    $results_separated = $result.',';
    }
    $query->set ('post__in', array($results_separated)); // pass results (post ids) to post__in

    return $query;
    }

}    

此后,该函数不返回任何内容。

如果我$query->set ('post__in', array(45,121));,查询将返回id 45和id 121的帖子,因此查询正常。

但是我想让$results_separated将帖子ID(例如45,121,132)传递给查询,然后$query->set ('post__in', array($results_separated));将正常工作。 我怎样才能做到这一点?

pre_get_posts reference

2 个答案:

答案 0 :(得分:0)

我猜你实际上有一个PHP问题。当你执行array($results_separated)时,你基本上是从一个如下所示的字符串创建一个数组:"12,114,56,"。通过这样做,PHP正在创建一个这样的数组:

array(
    0 => "12,114,56,"
)

显然,WordPress无法找到任何有此ID的帖子!你想要的实际上是这样的数组:

array(
    0 => "12",
    1 => "114",
    2 => "56"
)

实际上那是get_col()返回的内容,因此您只需要将$results传递给set()函数:

$query->set ( 'post__in', $results );

编辑 :实际上我意识到您的问题是在您致电$wpdb->get_col(...)时,因为它干扰了$query您将在稍后执行......那些变量正在使用一些可能被覆盖的其他全局变量,这就是为什么你没有得到任何结果...

答案 1 :(得分:0)

除$ results_separated之外的额外数组(),在我的情况下,我必须应用

if (!$query->is_main_query()) {
    return $query;
}

在我的函数的顶部(找到它,否则,内部的查询将执行几次而不是正确的。 答案中的评论帮助我解决了这个问题。