Ich bin etwas verwirrt darüber, warum dies nicht funktioniert – obwohl ich nicht sicher bin, was und add_filter
tun dies, daher wären auch allgemeine Tipps großartig!
Ich möchte eine Abfrage, die die fünf früheren Beiträge aufruft Ich sende das Datum des aktuellen Beitrags ab und möchte einen Filter anwenden, der Beiträge früher herausfiltert.
function sw_filter_posts_before( $where = "", $date) { $where .= " AND post_date < "" . $date . """; return $where; }
Wie wende ich das richtig an Die einfache Verwendung von add_filter oder apply_filter vor dem Instanziieren eines neuen WP_Query-Objekts scheint nicht richtig zu funktionieren.
Vielen Dank im Voraus!
Bearbeiten: Um weiter darauf einzugehen, möchte ich verstehen Wie man eine Variable an den Filter übergibt, da ich „$ date“ nicht von einer anderen Funktion übergeben kann.
Hier ist die andere Funktion (es ist ein Ajax-Aufruf in WordPress, daher beginne ich mit dem Abrufen der Post-ID für die aktuelle Seite über eine $ _POST-Variable):
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; }
Kommentare
- Okay, Das Wichtigste zuerst: Zu welchem Haken genau möchten Sie Ihren Filter hinzufügen? Dies ist wichtig, da Ihre Variable
$date
$post
Daten verwendet. Daher müssen wir wissen, ob wir ‚ filtere innerhalb oder außerhalb der Schleife. - Ich denke, dies ist der Punkt, an dem mich mein Mangel an Wissen über WP-Filter beeindruckt. Ich dachte, der Hook wäre ‚ posts_where ‚, und er würde die angegebene Zeichenfolge zur SQL-Abfrage hinzufügen. Soweit ich ‚ weiß, dass ‚ außerhalb der Schleife liegt, da ‚ s im Vorverarbeitungsteil der Erstellung einer Schleife. Haben Sie einen Vorschlag, wie ich mein Ziel mit Best Practice erreichen könnte?
- Sicher, wir können dorthin gelangen. 🙂 Welches Datum möchten Sie verwenden? Genauer gefragt: Wie möchten Sie bestimmen, welches Datum verwendet werden soll?
Antwort
Was versuchen Sie zu filtern? Ich gehe davon aus, dass Sie versuchen, einem Filter-Hook mit dem Namen posts_before
einen Filter hinzuzufügen. In diesem Fall müssen Sie Ihren Filter über 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" );
div zu diesem Hook hinzufügen >
Beachten Sie, dass ich Ihren Funktionsnamen geändert habe. filter_posts_before()
ist viel zu allgemein für einen Funktionsnamen und verursacht sehr wahrscheinlich eine Kollision mit Funktionsnamen.
EDIT
Und nur zu Verdeutlichen Sie:
-
apply_filters()
ist die Filter-Hook-Position wird von Kerncode aufgerufen und für verwendet Wenden Sie alle Filter an, die von Themes / Plugins (> div> = 086e1c9eb0 „>
zur Warteschlange hinzugefügt wurden und Kern).
add_filter()
wird von Themes / Plugins (und core) und wird verwendet, um Filter zur Warteschlange hinzuzufügen, die vom Core auf den Hook angewendet werden sollen. BEARBEITEN 2
Basierend auf Ihrem obigen Kommentar lautet der Hook posts_where
. Machen wir also eine Pause beim Wiederaufbau Ihrer Rückruffunktion:
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" );
Kommentare
- Vielen Dank für die Klarstellung! ‚ muss den Filter umbenennen. Ich verstehe immer noch nicht, wie das $ -Datum übergeben werden soll. ‚ Könnten Sie das auch klarstellen? Danke!
- Was ist die Variable
$date
und woher kommt sie? - $ date stammt von einer anderen Funktion von mir, es ist das Datum des aktuellen Beitrags im Format ‚ Ymd ‚.
- Globalisieren Sie den Code von
$date
oder geben Sie ihn von der Funktion zurück? Können Sie den Code dieser Funktion ‚ veröffentlichen? , auch? - Okey-cokey, ich ‚ habe den ursprünglichen Beitrag mit einigen weiteren Details aktualisiert. Ich könnte das Datum globalisieren, aber ist das absolut notwendig? Ist es das? nicht am besten, wenn möglich, es einfach irgendwie zu übergehen?