web-dev-qa-db-fra.com

Comment utiliser le crochet de filtre "the_posts" avec une fonction qui fait référence à $ this?

J'utilise Carbon Fields pour gérer les métadonnées liées aux événements (telles que les dates des événements) de certains messages sur mon site, mais je veux m'assurer que les événements passés n'apparaissent pas dans les flux de mon site. Je dois utiliser le filtre the_posts avec une fonction. Voici mon code:

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;
}

J'obtiens Fatal error: Too few arguments to filter_past_events(), 1 passed. Qu'est-ce que je fais mal? WordPress a-t-il cessé de transmettre l'objet WP_Query $this à la fonction?

1
Stuart Simon

Comme vous pouvez le voir dans la documentation , le deuxième argument passé aux fonctions raccordées à the_posts est l’objet WP_Query.

Pour y accéder, vous devez définir le 4ème argument de add_filter(), $accepted_args, en 2, afin de pouvoir l'accepter.

Ensuite, il vous suffit d'accepter 2 arguments dans votre fonction et d'utiliser le second argument comme objet 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