Cosa fanno add_filters() e apply_filter() in WordPress?
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;
}

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' );

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!

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

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

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?

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.

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.
