Wat doen add_filters () en apply_filter ()?

Ik “ben een beetje in de war over waarom dit niet” werkt – al moet gezegd worden dat ik “niet zo zeker weet wat apply_filters() en add_filter doen het, dus algemene tips zouden ook geweldig zijn!

Ik wil een vraag die de vijf eerdere berichten oproept een enkele berichtpagina. Ik stuur de datum van het huidige bericht weg en wil een filter toepassen dat eerdere berichten eruit filtert.

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

Hoe pas ik dit correct toe? Het simpelweg gebruiken van add_filter of apply_filter voordat een nieuw WP_Query-object wordt geïnstantieerd, lijkt niet correct te werken.

Bij voorbaat dank!

Bewerken: om verder in te gaan, zou ik graag willen weten hoe een variabele door te geven aan het filter, aangezien ik $ date niet kan krijgen om van een andere functie over te gaan.

Hier is een andere functie (het is een ajax-aanroep binnen wordpress, daarom begin ik met het ophalen van de post-ID voor de huidige pagina via een $ _POST-variabele):

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

Reacties

  • Oké, eerste dingen, eerst: aan welke haak, precies, probeert u uw filter toe te voegen? Dat is belangrijk, omdat uw $date variabele $post gegevens gebruikt, dus we moeten weten of we ' re filtering binnen of buiten van de Loop.
  • Ik denk dat dit het punt is waar mijn gebrek aan kennis van wp-filters me opvalt. Ik dacht dat de hook ' posts_where ' was, en dat het de gegeven string aan de SQL-query zou toevoegen. Voor zover ik ' m weet dat ' buiten de lus valt, aangezien het ' s in het voorverwerkingsgedeelte van het maken van een lus. Heeft u een suggestie over hoe ik mijn doel zou bereiken met de beste praktijken?
  • Natuurlijk kunnen we daar komen. 🙂 Welke datum wil je gebruiken? Nauwkeuriger gesteld: hoe wil je bepalen welke datum te gebruiken?

Antwoord

Wat probeert u te filteren? Ik “neem aan dat je” probeert een filter toe te voegen aan een filter hook genaamd posts_before. In dat geval moet u uw filter toevoegen aan deze 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" ); 

Merk op dat ik je functienaam heb gewijzigd. filter_posts_before() is een veel te algemene functienaam, en veroorzaakt zeer waarschijnlijk een botsing tussen functienamen.

BEWERK

En alleen om verduidelijk:

  • apply_filters() is de filter hook locatie , wordt aangeroepen door kerncode , en wordt gebruikt voor pas alle filters toe die zijn toegevoegd aan de wachtrij op basis van themas / plug-ins ( en core).
  • add_filter() wordt aangeroepen door Themas / plug-ins (en core), en wordt gebruikt om filters toe te voegen aan de wachtrij om te worden toegepast op de hook by core.

EDIT 2

Gebaseerd op je commentaar hierboven, is de hook posts_where. Laten we dus eens kijken naar het opnieuw opbouwen van uw callback-functie:

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

Reacties

  • Bedankt voor de verduidelijking! Ik ' zorg ervoor dat ik de naam van het filter wijzig. Ik ' begrijp niet hoe ik de $ date moet doorgeven variabele, zou u dat ook kunnen verduidelijken? Bedankt!
  • Wat is de $date variabele en waar komt deze vandaan?
  • $ date komt van een andere functie van mij, het is de datum van het huidige bericht, in het formaat ' Ymd '.
  • Globaliseert u $date, of retourneert u het vanuit de functie, wat? Kunt u de code van die functie ' posten , ook?
  • Okey-cokey, ik ' heb het oorspronkelijke bericht bijgewerkt met wat meer details. Ik zou de datum kunnen globaliseren, maar is dat absoluut nodig? Is het niet het beste, indien mogelijk, om het op de een of andere manier gewoon door te geven?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *