如何将过滤器挂钩“the_post”与引用$this的函数一起使用?

时间:2018-09-04 作者:Stuart Simon

我正在使用Carbon字段来管理我网站上某些帖子的事件相关元数据(如事件日期),但我想确保过去的事件不会显示在我网站的提要中。我需要使用过滤器the_posts 具有函数。这是我的代码:

add_filter("the_posts", "filter_past_events");

function filter_past_events($posts) {
    if ($this->is_single) {
        return $posts;
    }
    if ($this->is_feed) {
        for ($i = count($posts) - 1; $i > -1; $i--) {
            $event_meta = carbon_get_post_meta($posts[$i]->ID, "event_meta");
            if ($event_meta) {
                $is_future = false;
                if (!empty($event_meta[0]["scheduling_blocks"])) {
                    $scheduling_blocks = $event_meta[0]["scheduling_blocks"];
                    for ($j = 0; $j < count($scheduling_blocks); $j++) {
                        if (DateTimeImmutable::createFromFormat("m/d/Y H:i:s", $scheduling_blocks[$j]["start"]) > new DateTimeImmutable()) {
                            $is_future = true;
                        }
                    }
                }
                if (!$is_future) {
                    array_splice($posts, $i, 1);
                }
            }
        }
    }
    return $posts;
}
我正在Fatal error: Too few arguments to filter_past_events(), 1 passed. 我做错了什么?WordPress是否已停止传递WP\\u查询对象$this 到功能?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

正如你在the documentation, 传递给连接到的函数的第二个参数the_postsWP_Query 对象

要访问它,需要定义add_filter(), $accepted_args, 到2, 这样你就可以接受了。

然后只需在函数中接受2个参数,并使用第2个参数to作为WP_Query 对象:

function wpse_313327_filter_past_events( $posts, WP_Query $query ) {
    if ( $query->is_single() ) {
        return $posts;
    }

    if ( $query->is_feed() ) {
        // etc. etc.
    }

    return $posts;
}
add_filter( \'the_posts\', \'wpse_313327_filter_past_events\', 10, 2 );

结束