Cosa fanno add_filters () e apply_filter ()?

Sono “un po confuso sul motivo per cui non funziona, anche se va detto che” non sono così sicuro di cosa apply_filters() e add_filter stanno andando bene, quindi anche qualsiasi consiglio generale sarebbe ottimo!

Voglio una query che richiami i cinque post precedenti su una singola pagina di post. Sto inviando la data di scadenza del post corrente e desidero applicare un filtro che filtri i post precedenti a questa.

function sw_filter_posts_before( $where = "", $date) { $where .= " AND post_date < "" . $date . """; return $where; } 

Come lo applico correttamente? Il semplice utilizzo di add_filter o apply_filter prima di creare unistanza di un nuovo oggetto WP_Query non sembra funzionare correttamente.

Grazie in anticipo!

Modifica: per approfondire, vorrei capire come passare una variabile nel filtro, dato che “non riesco a far passare $ date da unaltra funzione.

Ecco unaltra funzione (è una chiamata ajax allinterno di wordpress, quindi inizio ottenendo il ID post per la pagina corrente tramite 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" ); //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; } 

Commenti

  • Va bene, per prima cosa, per prima cosa: a quale hook, esattamente, stai cercando di aggiungere il tuo filtro? Questo è importante, perché la tua variabile $date utilizza i dati $post, quindi dobbiamo sapere se ' che filtra allinterno o allesterno del Loop.
  • Penso che questo potrebbe essere il motivo per cui la mia mancanza di conoscenza dei filtri wp mi sta colpendo. Pensavo che lhook fosse ' posts_where ' e avrebbe aggiunto la stringa data alla query SQL. Per quanto ' so che ' è al di fuori del ciclo, poiché ' s nella parte di pre-elaborazione della creazione di un ciclo. Hai qualche suggerimento su come raggiungere il mio obiettivo con le migliori pratiche?
  • Certo, possiamo arrivarci. 🙂 Quale data vuoi usare? Richiesta più accurata: come vuoi determinare quale data utilizzare?

Risposta

Che cosa stai tentando di filtrare? Presumo che tu stia cercando di aggiungere un filtro a un filtro hook 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; } // Add function to the filter hook add_filter( "posts_before", "mytheme_filter_posts_before" ); 

Nota che ho cambiato il nome della tua funzione. filter_posts_before() è troppo generico per il nome di una funzione ed è molto probabile che provochi una collisione tra i nomi delle funzioni.

EDIT

E solo per chiarire:

  • apply_filters() è la posizione del hook del filtro , viene chiamato dal codice di base e viene utilizzato per applica eventuali filtri aggiunti alla coda da Temi / Plugin ( e core).
  • add_filter() è chiamato da Themes / Plugins (e core) e viene utilizzato per aggiungere filtri alla coda da applicare allhook per core.

EDIT 2

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

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

Commenti

  • Grazie per il chiarimento! ' mi assicurerò di rinominare il filtro. Continuo a non ' capire come passare $ date variabile a questo, potresti chiarire anche questo? Grazie!
  • Cosè la variabile $date e da dove viene?
  • $ date proviene da unaltra mia funzione, è la data del post corrente, nel formato ' Ymd '.
  • Stai globalizzando $date o restituendolo dalla funzione, cosa? Puoi pubblicare il codice ' della funzione , inoltre?
  • Okey-cokey, ' ho aggiornato il post originale con qualche dettaglio in più. Potrei globalizzare la data, ma è del tutto necessario? non è meglio, se possibile, passarlo sopra in qualche modo?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *