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
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ąć?
$date
wykorzystuje dane$post
, więc musimy wiedzieć, czy ' re filtrowanie wewnątrz lub na zewnątrz pętli.