web-dev-qa-db-fra.com

Que font add_filters () et apply_filter ()?

Je ne comprends pas très bien pourquoi cela ne fonctionne pas - bien qu'il faille dire que je ne suis pas sûr de ce que font apply_filters() et add_filter;

Je souhaite une requête faisant apparaître les cinq publications précédentes sur une seule page. J'envoie la date du message en cours et souhaite appliquer un filtre qui filtre les messages plus tôt.

function sw_filter_posts_before( $where = '', $date) {

    $where .= " AND post_date < '" . $date . "'";
    return $where;
}

Comment puis-je appliquer correctement cela? Utiliser simplement add_filter ou apply_filter avant d'instancier un nouvel objet WP_Query ne semble pas fonctionner correctement.

Merci d'avance!

Edit: Pour aller plus loin, j'aimerais comprendre comment passer une variable dans le filtre, car je ne peux pas obtenir $ date à passer d'une autre fonction.

Voici une autre fonction (il s’agit d’un appel ajax dans wordpress, c’est pourquoi je commence par obtenir l’identifiant de publication de la page actuelle par le biais d’une variable $ _POST):

function create_more_videos_sidebar() {

    $id = $_POST['theID'];

    $args = array(  'post_type'         =>  'videos',
                    'posts_per_page'    =>  1,
                    'p'             =>  $id
                ); 

    $wp_query = new WP_Query($args);

    while ($wp_query->have_posts()) : $wp_query->the_post(); $do_not_duplicate = $post->ID;

        $date = get_the_date('Y-m-d');

    endwhile;

    $args = array(  'post_type'         =>  'videos',
                    'posts_per_page'    =>  5
                ); 

    add_filter( 'posts_where', 'sw_filter_videos_before' ); //don't know how to pass $date


    $wp_query = new WP_Query($args);
    remove_filter( 'posts_where', 'sw_filter_videos_before' );

    //do loop stuff

    $response = json_encode( array( 'result' => $result ) );

    header( "Content-Type: application/json" );
    echo $response;

    exit;
}
4
Michael Watson

Qu'est-ce que vous essayez de filtrer? Je suppose que vous essayez d'ajouter un filtre à un crochet de filtre appelé posts_before. Dans ce cas, vous devez ajouter votre filtre à ce hook, via add_filter():

function mytheme_filter_posts_before( $where = '', $date) {

    $where .= " AND post_date < '" . $date . "'";
    return $where;
}
// Add function to the filter hook
add_filter( 'posts_before', 'mytheme_filter_posts_before' );

Notez que j'ai changé le nom de votre fonction. filter_posts_before() est beaucoup trop générique d'un nom de fonction et risque très probablement de provoquer une collision de dénomination de fonction.

MODIFIER

Et juste pour clarifier:

  • apply_filters() est le emplacement du filtre, est appelé par code principal et est utilisé pour appliquer tous les filtres qui sont ajoutés à la file d'attentepar thèmes/plugins (et noyau).
  • add_filter() est appelé par Themes/Plugins (et core), et est utilisé pour ajouter des filtres à la file d'attente à appliquer au hook par core.

EDIT 2

Sur la base de votre commentaire ci-dessus, le hook est posts_where. Essayons donc de reconstruire votre fonction de rappel:

function mytheme_filter_posts_where( $where ) {

    // Here, we need to figure out how to
    // determine what date to use. In your 
    // code example, you call get_the_date(),
    // but this function must be used inside
    // the Loop. Let's try get_the_time()
    // instead. You'll just need to come up
    // with a way to determine what post ID to use.
    $post = 'some_post_id';
    $date = get_the_time( 'Y-m-d', $post );

    $where .= " AND post_date < '" . $date . "'";
    return $where;
}
// Add function to the filter hook
add_filter( 'posts_where', 'mytheme_filter_posts_where' );
4
Chip Bennett