Cosa fanno add_filters() e apply_filter() in WordPress?

23 ago 2011, 15:18:25
Visualizzazioni: 18.7K
Voti: 5

Sono un po' confuso sul perché questo non funzioni - anche se devo dire che non sono molto sicuro di cosa facciano apply_filters() e add_filter, quindi qualsiasi consiglio generale sarebbe fantastico!

Voglio una query che mostri i cinque post precedenti in una pagina di singolo post. Sto inviando la data del post corrente e voglio applicare un filtro che escluda i post successivi a questa data.

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

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

Come posso applicare questo correttamente? Semplicemente usando add_filter o apply_filter prima di creare un nuovo oggetto WP_Query non sembra funzionare correttamente.

Grazie in anticipo!

Modifica: Per approfondire, vorrei capire come passare una variabile al filtro, poiché non riesco a far passare $date da un'altra funzione.

Ecco l'altra funzione (è una chiamata ajax all'interno di WordPress, quindi inizio ottenendo l'ID del post per la pagina corrente attraverso una variabile $_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' ); //non so come passare $date


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

    //fai cose con il loop

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

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

    exit;
}
3
Commenti

Ok, prima cosa: a quale hook stai cercando di aggiungere il tuo filtro? Questo è importante, perché la tua variabile $date utilizza i dati di $post, quindi dobbiamo sapere se stiamo filtrando dentro o fuori dal Loop.

Chip Bennett Chip Bennett
23 ago 2011 17:31:31

Penso che qui sia dove la mia mancanza di conoscenza sui filtri di WordPress mi sta penalizzando. Credevo che l'hook fosse 'posts_where', e che avrebbe aggiunto la stringa data alla query SQL. Per quanto ne so, questo è fuori dal loop, poiché fa parte della fase di pre-elaborazione della creazione di un loop. Hai qualche suggerimento su come potrei raggiungere il mio obiettivo seguendo le best practice?

Michael Watson Michael Watson
23 ago 2011 19:27:38

Certo, possiamo arrivarci. :) Quale data vuoi usare? Per essere più precisi: come vuoi determinare quale data utilizzare?

Chip Bennett Chip Bennett
23 ago 2011 20:53:28
Tutte le risposte alla domanda 1
7

Cosa stai cercando di filtrare? Suppongo che tu stia cercando di aggiungere un filtro a un hook di filtro chiamato posts_before. In tal caso, devi aggiungere il tuo filtro a questo hook, tramite add_filter():

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

    $where .= " AND post_date < '" . $date . "'";
    return $where;
}
// Aggiungi la funzione all'hook di filtro
add_filter( 'posts_before', 'mytheme_filter_posts_before' );

Nota che ho cambiato il nome della tua funzione. filter_posts_before() è un nome di funzione troppo generico e molto probabilmente causerà un conflitto di nomi.

MODIFICA

E solo per chiarire:

  • apply_filters() è la posizione dell'hook di filtro, viene chiamato dal codice core e viene utilizzato per applicare qualsiasi filtro che viene aggiunto alla coda da Temi/Plugin (e core).
  • add_filter() viene chiamato da Temi/Plugin (e core), e viene utilizzato per aggiungere filtri alla coda da applicare all'hook dal core.

MODIFICA 2

In base al tuo commento sopra, l'hook è posts_where. Quindi, proviamo a ricostruire la tua funzione di callback:

function mytheme_filter_posts_where( $where ) {

    // Qui, dobbiamo capire come
    // determinare quale data utilizzare. Nel tuo 
    // esempio di codice, chiami get_the_date(),
    // ma questa funzione deve essere utilizzata all'interno
    // del Loop. Proviamo con get_the_time()
    // invece. Dovrai solo trovare un modo
    // per determinare quale ID del post usare.
    $post = 'some_post_id';
    $date = get_the_time( 'Y-m-d', $post );

    $where .= " AND post_date < '" . $date . "'";
    return $where;
}
// Aggiungi la funzione all'hook di filtro
add_filter( 'posts_where', 'mytheme_filter_posts_where' );
23 ago 2011 15:26:20
Commenti

Grazie per la chiarificazione! Mi assicurerò di rinominare il filtro. Non ho ancora capito come passare la variabile $date a questo, potresti chiarire anche quello? Grazie!

Michael Watson Michael Watson
23 ago 2011 15:34:12

Cos'è la variabile $date e da dove proviene?

Chip Bennett Chip Bennett
23 ago 2011 15:38:27

$date proviene da un'altra mia funzione, è la data del post corrente, nel formato 'Y-m-d'.

Michael Watson Michael Watson
23 ago 2011 15:49:57

Stai globalizzando $date, o lo stai restituendo dalla funzione, cosa? Puoi postare anche il codice di quella funzione?

Chip Bennett Chip Bennett
23 ago 2011 16:31:33

Ok, ho aggiornato il post originale con alcuni dettagli in più. Potrei globalizzare date, ma è davvero necessario? Non è meglio, se possibile, passarlo semplicemente in qualche modo?

Michael Watson Michael Watson
23 ago 2011 16:42:11

Ho aggiornato la mia risposta. Dobbiamo solo trovare un modo per determinare l'ID del post a cui fare riferimento per ottenere la data corretta da usare nella query.

Chip Bennett Chip Bennett
23 ago 2011 20:58:51

Assolutamente. Ho seguito il tuo consiglio iniziale e faccio arrivare l'ID del post dalla pagina via json, poi lo rendo globale. Funziona bene, ma immagino non sia la pratica migliore? Ora tutto funziona perfettamente, ma mi sentirei molto meglio se potessi passare questi dati in modo privato. Grazie mille per l'aiuto finora.

Michael Watson Michael Watson
24 ago 2011 13:16:09
Mostra i restanti 2 commenti