Co robią add_filters () i apply_filter ()?

Nie wiem, dlaczego to nie działa – chociaż trzeba powiedzieć, że nie jestem pewien, co apply_filters() i add_filter dobrze sobie radzą, więc wszelkie ogólne wskazówki też byłyby świetne!

Potrzebuję zapytania, które spowoduje wyświetlenie pięciu wcześniejszych postów na pojedyncza strona postu. Wysyłam datę bieżącego posta i chcę zastosować filtr, który odfiltrowuje posty wcześniejsze niż ta.

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

Jak czy mam to poprawnie zastosować? Po prostu użycie add_filter lub apply_filter przed utworzeniem instancji nowego obiektu WP_Query nie wydaje się działać poprawnie.

Z góry dziękuję!

Edycja: Aby przejść dalej, chciałbym zrozumieć jak przekazać zmienną do filtra, ponieważ nie mogę uzyskać $ date do przekazania z innej funkcji.

Tutaj jest powiedziane inna funkcja (jest to wywołanie Ajax w ramach wordpressa, dlatego zaczynam od pobrania identyfikator posta dla bieżącej strony za pośrednictwem zmiennej $ _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; } 

Komentarze

  • OK, Po pierwsze: do jakiego dokładnie zaczepu próbujesz dodać filtr? To ma znaczenie, ponieważ zmienna $date wykorzystuje dane $post, więc musimy wiedzieć, czy ' re filtrowanie wewnątrz lub na zewnątrz pętli.
  • Myślę, że to może być miejsce, w którym mój brak wiedzy o filtrach wp uderza mnie. Wydawało mi się, że hak to ' posts_where ' i doda podany ciąg do zapytania SQL. O ile ' zdaję sobie sprawę, że ' znajduje się poza pętlą, ponieważ ' w części związanej z przetwarzaniem wstępnym tworzenia pętli. Czy masz sugestie, jak osiągnąć swój cel przy użyciu najlepszych praktyk?
  • Jasne, możemy się tam dostać. 🙂 Z jakiej daty chcesz skorzystać? Zapytano dokładniej: jak chcesz ustalić , której daty użyć?

Odpowiedź

Co próbujesz filtrować? Zakładam, że próbujesz dodać filtr do zaczepu filtra o nazwie posts_before. W takim przypadku musisz dodać swój filtr do tego zaczepu, przez 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" ); 

Zwróć uwagę, że zmieniłem nazwę Twojej funkcji. filter_posts_before() jest zbyt ogólną nazwą funkcji i jest bardzo prawdopodobne, że spowoduje kolizję nazw funkcji.

EDYTUJ

I po prostu wyjaśnij:

  • apply_filters() to lokalizacja zaczepu filtra , jest wywoływany przez podstawowy kod i jest używany do zastosuj wszystkie filtry, które zostały dodane do kolejki przez motywy / wtyczki ( and core).
  • add_filter() jest wywoływana przez Motywy / Wtyczki (i core) i służy do dodawania filtrów do kolejki , które mają być stosowane do podpięcia przez rdzeń.

EDYCJA 2

W oparciu o Twój komentarz powyżej, haczyk to posts_where. Spróbujmy więc odbudować swoją funkcję zwrotną:

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

Komentarze

  • Dzięki za wyjaśnienie! ' upewnię się, że zmienię nazwę filtra. Nadal nie ' nie rozumiem, jak przekazać datę $ czy możesz to również wyjaśnić? Dzięki!
  • Co to jest zmienna $date i skąd ona pochodzi?
  • $ data pochodzi z innej mojej funkcji, jest to data bieżącego postu w formacie ' Ymd '.
  • Czy globalizujesz $date, czy zwracasz to z funkcji, co? Czy możesz opublikować kod tej funkcji ' , też?
  • Okey-cokey, ' zaktualizowałem oryginalny post o więcej szczegółów. Mogę globalizować datę, ale czy jest to całkowicie konieczne? Czy to nie najlepiej, jeśli to możliwe, jakoś go po prostu pominąć?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *