Hva gjør add_filters () og Apply_filter ()?

Jeg er litt forvirret over hvorfor dette ikke fungerer – selv om det må sies at jeg ikke er sikker på hva apply_filters() og add_filter gjør det, så noen generelle tips vil også være bra!

Jeg vil ha et spørsmål som viser de fem tidligere innleggene på en enkelt innleggsside. Jeg sender det aktuelle innleggets dato av, og vil bruke et filter som filtrerer ut innlegg tidligere enn dette.

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

Hvordan bruker jeg dette riktig? Bare ved å bruke add_filter eller Apply_filter før du installerer et nytt WP_Query-objekt, ser det ikke ut til å fungere riktig.

Takk på forhånd!

Rediger: For å gå nærmere inn på ting, vil jeg forstå hvordan du sender en variabel inn i filteret, da jeg ikke kan få $ date til å gå fra en annen funksjon.

Her er det sagt en annen funksjon (det er et ajax-anrop i wordpress, derfor begynner jeg med å få innleggs-ID for den aktuelle siden gjennom en $ _POST-variabel):

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

Kommentarer

  • Ok, første ting, først: til hvilken krok, akkurat, prøver du å legge til filteret ditt? Det betyr noe, fordi $date -variabelen bruker $post data, så vi må vite om vi ' re filtrering inne eller utenfor av Loop.
  • Jeg tror dette kan være der min mangel på wp-filtre kunnskap slår meg ned. Jeg trodde kroken var ' posts_where ', og det ville legge til den gitte strengen i SQL-spørringen. Så vidt jeg ' er klar over at ' er utenfor løkken, da det ' s i forbehandlingsdelen av å lage en sløyfe. Har du et forslag til hvordan jeg ville oppnå målet mitt med beste praksis?
  • Visst, vi kan komme dit. 🙂 Hvilken dato vil du bruke? Spurt mer nøyaktig: hvordan vil du bestemme hvilken dato du skal bruke?

Svar

Hva prøver du å filtrere? Jeg vil anta at du prøver å legge til et filter i en filterkrok kalt posts_before. I så fall må du legge til filteret ditt i denne kroken, 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" ); 

Merk at jeg endret funksjonsnavnet ditt. filter_posts_before() er altfor generisk med et funksjonsnavn, og vil sannsynligvis forårsake en kollisjon med funksjonsnavn.

EDIT

Og bare for å presisere:

  • apply_filters() er filterkrokposisjon , kalles av kjernekode , og brukes til å bruk eventuelle filtre som er lagt til i køen av Temaer / Plugins ( og kjerne).
  • add_filter() kalles av Temaer / plugins (og kjerne), og brukes til å legge til filtre i køen som skal påføres kroken for kjerne.

EDIT 2

Basert på kommentaren din ovenfor er kroken posts_where. Så la oss ta en sprekk i å gjenopprette tilbakeringingsfunksjonen din:

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

Kommentarer

  • Takk for avklaringen! Jeg ' Jeg sørger for å gi nytt navn til filteret. Jeg forstår fortsatt ikke ' hvordan jeg skal passere $ date variabel til dette, kan du også avklare det? Takk!
  • Hva er $date variabelen, og hvor kommer den fra?
  • $ date kommer fra en annen funksjon av meg, det er datoen for gjeldende innlegg, i formatet ' Ymd '.
  • Globaliserer du $date, eller returnerer du den fra funksjonen, hva? Kan du legge ut den funksjonen ' s kode , også?
  • Okey-cokey, jeg ' har oppdatert det opprinnelige innlegget med noen flere detaljer. Jeg kunne globalisere datoen, men er det helt nødvendig? Er det ikke best, hvis mulig, å bare overføre det på en eller annen måte?

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *