私は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
を関数に渡すのをやめましたか?
ドキュメント にあるように、the_posts
にフックされた関数に渡される2番目の引数はWP_Query
オブジェクトです。
これにアクセスするには、add_filter()
の4番目の引数$accepted_args
を2
に定義して、受け入れられるようにする必要があります。
それから、関数内で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 );