Estoy trabajando en un sitio web con una función de búsqueda que permite a los usuarios buscar en muchas publicaciones meta. Hay un patrón de búsqueda específico para el que me gustaría no devolver ningún resultado por la fuerza. El WP_Query técnicamente encontrará resultados en la base de datos, pero me gustaría anular eso de alguna manera para obligarlo a no devolver ningún resultado que provoque if( $example->have_posts() )
que falle.
¿Hay algún tipo de parámetro que pueda pasar a WP_Query como 'force_no_results' => true
que lo obligará a no devolver resultados?
WP_Query()
no devolver resultados puede o no ser la mejor manera de responder a esa pregunta. También podría ser útil si describiera el patrón de búsqueda que desea que no se pueda consultar. Conocer el patrón de búsqueda podría ayudar a descubrir una solución.Respuestas:
Tratar
Simple y al grano.
fuente
post__in
estaba devolviendo publicaciones cuando pasaba una matriz vacía ... ¡array(0)
funciona muy bien! Esto es extraño, pero en realidad se puede rastrear a un problema que surgió en el núcleo de WP como un error, pero luego se dejó como está porque demasiados desarrolladores de temas / complementos crearon unaCuriosamente no hay una forma limpia / explícita de cortocircuito
WP_Query
.Si se trata de una consulta principal con la que puede resolver algo
WP->parse_request()
, parece haber undo_parse_request
filtro relativamente reciente (3.5) allí.Pero por
WP_Query
sí mismos, los hacks sucios generalmente están en orden, como el cortocircuito de la consulta SQL al agregar aAND 1=0
través de unposts_where
filtro, etc.fuente
"post_type" => "break_loop"
que es un tipo de publicación inexistente.Los problemas al establecer un parámetro de consulta en un valor inexistente son 2:
'posts_*'
enlaces de filtros ('posts_where'
,'post_join'
, etc ..) que actúan sobre la consulta, por lo que nunca puede estar seguro de que incluso el establecimiento de parámetro unexistent la consulta devuelve ningún resultado, un simpleOR
cláusula devuelto por un filtro devolverlo es algo.Necesita una rutina un poco dura para asegurarse de que una consulta no devuelva ningún resultado y no haya un problema de rendimiento (o muy mínimo).
Para activar esa rutina, puede usar todos los métodos, técnicamente puede pasar cualquier argumento a
WP_Query
, argumentos de evento que no existan.Entonces, si te gusta algo como
'force_no_results' => true
, puedes usarlo así:y agrega una devolución de llamada en ejecución
'pre_get_posts'
que hace el trabajo duro:Lo que hace este código se ejecuta lo
'pre_get_posts'
más tarde posible. Si el argumento 'force_no_results' está presente en la consulta, entonces:SELECT ID FROM wp_posts WHERE 0 = 1
una vez que se eliminan todos los filtros, no hay posibilidades de que esta consulta cambie y es muy rápida, y no tiene ningún resultado segurofuente