web-dev-qa-db-ja.com

$ thisを参照する関数でフィルタフック "the_posts"を使う方法?

私はCarbon Fieldsを使って自分のサイトの特定の投稿のイベント関連のメタデータ(イベントの日付など)を管理していますが、過去のイベントが自分のサイトのフィードに表示されないようにしたいです。私は関数でフィルタ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_Queryオブジェクト$thisを関数に渡すのをやめましたか?

1
Stuart Simon

ドキュメント にあるように、the_postsにフックされた関数に渡される2番目の引数はWP_Queryオブジェクトです。

これにアクセスするには、add_filter()の4番目の引数$accepted_args2に定義して、受け入れられるようにする必要があります。

それから、関数内で2つの引数を受け取り、2番目の引数を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 );
0
Jacob Peattie