Estou um pouco confuso sobre por que isso não está funcionando – embora deva ser dito que não tenho certeza do que apply_filters()
e add_filter
estão fazendo, então qualquer dica geral seria ótima também!
Eu quero uma consulta que traga as cinco postagens anteriores sobre uma única página de postagem. Estou enviando a data da postagem atual e desejo aplicar um filtro que filtre as postagens anteriores a esta.
function sw_filter_posts_before( $where = "", $date) { $where .= " AND post_date < "" . $date . """; return $where; }
Como eu aplico isso corretamente? Simplesmente usar add_filter ou apply_filter antes de instanciar um novo objeto WP_Query não parece funcionar corretamente.
Agradecemos antecipadamente!
Editar: Para aprofundar as coisas, gostaria de entender como passar uma variável para o filtro, pois não consigo fazer com que $ date passe de outra função.
Aqui está a outra função (é uma chamada ajax dentro do wordpress, portanto, começo obtendo o postar o ID da página atual por meio de uma variável $ _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; }
Comentários
Resposta
O que você está tentando filtrar? Presumo que você está tentando adicionar um filtro a um gancho de filtro chamado posts_before
. Nesse caso, você precisa adicionar seu filtro a este gancho, 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" );
Observe que alterei o nome da sua função. filter_posts_before()
é muito genérico para um nome de função e muito provavelmente causa uma colisão de nomenclatura de função.
EDITAR
E apenas para esclarecer:
-
apply_filters()
é a localização do gancho de filtro , é chamado por código principal e é usado para aplique quaisquer filtros que sejam adicionados à fila por Temas / Plug-ins ( e núcleo). -
add_filter()
é chamado por Temas / plug-ins (e núcleo), e é usado para adicionar filtros à fila para serem aplicados ao gancho pelo núcleo.
EDIT 2
Com base em seu comentário acima, o gancho é posts_where
. Então, vamos tentar reconstruir sua função de retorno de chamada:
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" );
Comentários
- Obrigado pelo esclarecimento! Eu ' certificarei de renomear o filtro. Ainda não ' não entendo como passar a $ data variável para isso, você poderia esclarecer isso também? Obrigado!
- O que é a variável
$date
e de onde ela vem? - $ date vem de outra função minha, é a data da postagem atual, no formato ' Ymd '.
- Você está globalizando
$date
ou retornando-o da função, o quê? Você pode postar o código ' dessa função , também? - Ok, eu ' atualizei a postagem original com mais alguns detalhes. Eu poderia globalizar a data, mas isso é totalmente necessário? É não é melhor, se possível, simplesmente ignorá-lo de alguma forma?
$date
variável usa$post
dados, então precisamos saber se ' re-filtrando dentro ou fora do Loop.