Hay dos query_posts()
funciones técnicamente hablando. Uno query_posts()
es en realidad WP_Query::query_posts()
y el otro está en el espacio global.
Pidiendo de la cordura:
Si global query_posts()
es ese "mal", ¿por qué no está en desuso?
O por qué no está marcado como _doing_it_wong
.
query-posts
prosti
fuente
fuente
Respuestas:
Pregunta esencial
Excavación Vamos en el trío:
::query_posts
,::get_posts
yclass WP_Query
para comprender::query_posts
mejor.La piedra angular para obtener los datos en WordPress es la
WP_Query
clase. Ambos métodos::query_posts
y::get_posts
usan esa clase.Entendiendo el
WP_Query
Aquí está la
WP_Query
estructura:WP_Query
Es la navaja suiza.Algunas cosas sobre
WP_Query
:pre_get_posts
ganchoNo puedo explicar todo esto, pero algunos de estos son complicados, así que proporcionemos consejos breves.
WP_Query
es algo que puedes controlar a través de argumentos que pasasEste sería el ejemplo mínimo de creación del
WP_Query
objeto a partir de los argumentos:WP_Query
es codiciosoCreado a partir de la idea,
get all you can
los desarrolladores de WordPress decidieron obtener todos los datos posibles antes, ya que esto es bueno para el rendimiento . Esta es la razón por la cual, de manera predeterminada, cuando la consulta toma 10 publicaciones de la base de datos, también obtendrá los términos y los metadatos de estas publicaciones a través de consultas separadas. Los términos y metadatos se almacenarán en caché (se buscarán previamente).Puede desactivar el almacenamiento en caché si se establece
update_post_meta_cache
yupdate_post_term_cache
alfalse
mismo tiempo establecer losWP_Query
argumentos. Cuando el almacenamiento en caché está desactivado, los datos se solicitarán a la base de datos solo bajo demanda.Para la mayoría de los blogs de WordPress, el almacenamiento en caché funciona bien, pero hay algunas ocasiones en las que puede deshabilitar el almacenamiento en caché.
WP_Query
utiliza clases auxiliaresSi marcó los
WP_Query
campos allí, tiene estos tres:Puedes imaginar agregar nuevos en el futuro.
WP_Query
contiene la sustancia para el bucleEn este código:
puede notar que
WP_Query
tiene la sustancia que puede iterar. Los métodos de ayuda también están ahí. Acabas de configurar elwhile
bucle.WP_Query
Primaria y secundariaEn WordPress tienes una consulta primaria y cero o más consultas secundarias .
Consulta primaria conocida como consulta principal o consulta regular . La consulta secundaria también se denomina consulta personalizada .
WordPress usa la
WP_Rewrite
clase temprana para crear los argumentos de consulta basados en la URL. En base a estos argumentos, almacena los dos objetos idénticos en el espacio global. Ambos contendrán la consulta principal.Cuando decimos consulta principal pensamos en estas variables. Otras consultas pueden llamarse secundarias o personalizadas.
WP_Query
Tiene el prácticopre_get_posts
gancho.Este es el gancho de acción. Se aplicará a cualquier
WP_Query
instancia. Lo llamas así:Este enlace es excelente y puede alterar cualquier argumento de consulta.
Esto es lo que puedes leer :
Este gancho es un administrador de argumentos pero no puede crear nuevos
WP_Query
objetos. Si tuvo una consulta primaria y una secundaria,pre_get_posts
no puede crear la tercera. O si acaba de tener una primaria, no puede crear la secundaria.WP_Query
admite bucles anidadosAquí está el ejemplo de muestra de WordPress tiene funciones de ayuda incluso para los bucles anidados:
El resultado será así desde que instalé los datos de prueba de la unidad de tema :
Aunque solicité 5 publicaciones en la consulta $ personalizada, me devolverá seis, porque la publicación adhesiva seguirá. Si no hay
wp_reset_postdata
en el ejemplo anterior, la salida será así, ya$GLOBALS['post']
que no será válida.WP_Query
tienewp_reset_query
funciónEsto es como un botón de reinicio.
$GLOBALS['wp_the_query']
debe estar congelado todo el tiempo, y los complementos o temas nunca deben alterarlo.Esto es lo
wp_reset_query
que debes hacer:Observaciones sobre
get_posts
get_posts
pareceEs sólo una envoltura alrededor de
WP_Query
que las declaraciones de los mensajes objeto de consulta.El
ignore_sticky_posts
conjunto en verdadero significa que las publicaciones adhesivas pueden aparecer solo en una posición natural. No habrá publicaciones adhesivas en el frente. El otrono_found_rows
conjunto en verdadero significa que la API de la base de datos de WordPress no se usaráSQL_CALC_FOUND_ROWS
para implementar la paginación, lo que reduce la carga en la base de datos para ejecutar el recuento de filas encontradas .Esto es útil cuando no necesita paginación. Entendemos que ahora podemos imitar esta función con esta consulta:
Aquí está la solicitud SQL correspondiente:
Compare lo que tenemos ahora con la solicitud SQL anterior donde
SQL_CALC_FOUND_ROWS
exista.La solicitud sin
SQL_CALC_FOUND_ROWS
será más rápida.Observaciones sobre
query_posts
query_posts()
EsWP_Query
envoltorio. Devuelve la referencia alWP_Query
objeto principal y, al mismo tiempo, establecerá elglobal $wp_query
.En PHP4 todo, incluidos los objetos, se pasaba por valor.
query_posts
fue así:Tenga en cuenta que en un escenario típico con una consulta primaria y una secundaria tenemos estas tres variables:
Digamos que cada uno de estos tres toma 1M de memoria. El total sería 3M de memoria. Si lo usamos
query_posts
,$GLOBALS['wp_query']
se desarmará y se volverá a crear.PHP5 + debería ser inteligente vaciando el
$GLOBALS['wp_query']
objeto, al igual que en PHP4 lo hicimos con elunset($GLOBALS['wp_query']);
Como resultado,
query_posts
consume 2M de memoria en total, mientras queget_posts
consume 3M de memoria.Tenga en cuenta
query_posts
que no estamos devolviendo el objeto real, sino una referencia al objeto.Aquí hay un ejemplo
Resultará:
Intenta restablecer la consulta:
Resultará:
Puede crear problemas incluso si usa
WP_Query
Por supuesto, la solución sería usar la
wp_reset_query
función nuevamente.Es por eso que creo que
query_posts
puede ser mejor desde el punto de vista de la memoria. Pero siempre debes hacerwp_reset_query
trucos.fuente
Acabo de crear un nuevo boleto de trac, boleto # 36874 , para proponer la desaprobación de
query_posts()
. Si se aceptará o no, sigue siendo una buena pregunta.El verdadero gran problema con
query_posts()
es que todavía es ampliamente utilizado por complementos y temas, a pesar de que ha habido muy buenos escritos sobre el tema de por qué NUNCA debes usarlo. Creo que la publicación más épica aquí en WPSE es la siguiente:deprecation! == eliminación , por lo que la degradación
query_posts()
no detendrá su uso por parte de desarrolladores de baja calidad y personas en general que no conocen WordPress y que usan tutoriales de baja calidad como pautas. Así como alguna prueba, cuántas preguntas qué seguimos hasta aquí donde la gente utilizacaller_get_posts
enWP_Query
? Ha quedado en desuso durante muchos años.Sin embargo, las funciones y argumentos en desuso pueden eliminarse en cualquier momento que los desarrolladores principales lo consideren apropiado, pero esto probablemente nunca sucederá,
query_posts()
ya que esto romperá millones de sitios. Entonces, sí, probablemente nunca veremos la eliminación total dequery_posts()
, lo que podría llevar al hecho de que lo más probable es que nunca sea desaprobado.Sin embargo, este es un punto de partida, pero hay que recordar que despreciar algo en WordPress no detiene su uso.
ACTUALIZACIÓN 19 de mayo de 2016
El boleto que levanté ahora está cerrado y marcado como duplicado de un boleto de 4 años , que se cerró como wontfix y se volvió a abrir y aún permanece abierto y sin resolver.
Parece que los desarrolladores principales se aferran a este viejo y pequeño mal fiel. Todos los interesados, aquí está el boleto duplicado de 4 años
fuente
[algo despotricado]
Es la filosofía central permanente en este punto que nada es realmente desaprobado. El aviso de desaprobación, aunque es bueno tenerlo, solo se ignorará si la función no se descarta en algún momento. Hay muchas personas que no se desarrollan con
WP_DEBUG
y no notarán el aviso si no se produce una rotura real.OTOH mano, esta función es como una
goto
declaración. Personalmente nunca (para una definición más pequeña que la esperada) uségoto
pero puedo entender los argumentos que apuntan a alguna situación en la que no es malo por defecto. Lo mismo ocurre conquery_posts
, es una manera simple de configurar todos los globales necesarios para hacer un bucle simple, y puede ser útil en el contexto ajax o rest-api. Nunca lo usaría también en esos contextos, pero puedo ver que allí, es más una cuestión de estilo de codificación que una función que es malvada en sí misma.Yendo un poco más profundo, el problema principal es que los globales deben establecerse en absoluto. Ese es el problema principal, no la única función que ayuda a configurarlos.
fuente
query_posts
más lento que una consulta secundaria (léase: no la consulta principal).query_posts
sí mismo, sino la consulta inútil que se hizo cuando WP se estaba cargando