Estou trabalhando em um site com um recurso de pesquisa que permite que os usuários pesquisem várias meta meta. Existe um padrão de pesquisa específico para o qual gostaria de não retornar resultados à força. O WP_Query tecnicamente encontrará resultados no banco de dados, mas eu gostaria de substituir isso de alguma forma para forçá-lo a não retornar resultados para acionar a if( $example->have_posts() )
falha.
Existe algum tipo de parâmetro que eu possa passar para o WP_Query 'force_no_results' => true
que o forçará a não retornar resultados?
WP_Query()
retorno de nenhum resultado pode ou não ser a melhor maneira de responder a essa pergunta. Também pode ser útil se você descrever o padrão de pesquisa que deseja ser inquestionável. Conhecer o padrão de pesquisa pode ajudar a encontrar uma solução.Respostas:
Experimentar
Simples e direto ao ponto.
fonte
post__in
estava retornando postagens quando passou uma matriz vazia ...array(0)
funciona muito bem! Isso é estranho, mas na verdade pode ser atribuído a um problema que surgiu no núcleo do WP como um bug, mas foi deixado como está porque muitos desenvolvedores de temas / plugins criaram funcionalidades em torno dele -_- core.trac.wordpress.org/ ticket / 28099Curiosamente, não há uma maneira limpa / explícita de curto-circuito
WP_Query
.Se for a consulta principal, você pode resolver algo
WP->parse_request()
, parece haver umdo_parse_request
filtro relativamente recente (3.5) lá.Mas, por
WP_Query
si só, hacks sujos geralmente estão em ordem, como um curto-circuito na consulta SQL adicionandoAND 1=0
viaposts_where
filtro, etc.fonte
"post_type" => "break_loop"
que é um tipo de postagem inexistente.Os problemas ao definir um parâmetro de consulta para um valor inexistente são 2:
'posts_*'
ganchos de filtro diferentes ('posts_where'
,'post_join'
etc.) que atuam na consulta, para que você nunca tenha certeza de que, mesmo definindo parâmetros inexistentes, a consulta não retorne resultados, uma simplesOR
cláusula retornada por um filtro faz com que retorne algo.Você precisa de uma rotina um pouco incondicional para garantir que uma consulta não retorne resultado e que não haja problema de desempenho (ou muito mínimo).
Para acionar essa rotina, você pode usar todos os métodos, tecnicamente pode passar qualquer argumento para
WP_Query
, argumentos de evento que não existem.Então, se você gosta de algo assim
'force_no_results' => true
, pode usá-lo da seguinte maneira:e adicione um retorno de chamada em execução
'pre_get_posts'
que faça o trabalho duro:O que esse código faz é executado o
'pre_get_posts'
mais tarde possível. Se o argumento 'force_no_results' estiver presente na consulta, então:SELECT ID FROM wp_posts WHERE 0 = 1
depois que todos os filtros são removidos, não há possibilidade de que essa consulta seja alterada e seja muito rápida e sem resultados.fonte