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_postsyclass WP_Querypara comprender::query_postsmejor.La piedra angular para obtener los datos en WordPress es la
WP_Queryclase. Ambos métodos::query_postsy::get_postsusan esa clase.Entendiendo el
WP_QueryAquí está la
WP_Queryestructura:WP_QueryEs la navaja suiza.Algunas cosas sobre
WP_Query:pre_get_postsganchoNo puedo explicar todo esto, pero algunos de estos son complicados, así que proporcionemos consejos breves.
WP_Queryes algo que puedes controlar a través de argumentos que pasasEste sería el ejemplo mínimo de creación del
WP_Queryobjeto a partir de los argumentos:WP_Queryes codiciosoCreado a partir de la idea,
get all you canlos 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_cacheyupdate_post_term_cachealfalsemismo tiempo establecer losWP_Queryargumentos. 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_Queryutiliza clases auxiliaresSi marcó los
WP_Querycampos allí, tiene estos tres:Puedes imaginar agregar nuevos en el futuro.
WP_Querycontiene la sustancia para el bucleEn este código:
puede notar que
WP_Querytiene la sustancia que puede iterar. Los métodos de ayuda también están ahí. Acabas de configurar elwhilebucle.WP_QueryPrimaria 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_Rewriteclase 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_QueryTiene el prácticopre_get_postsgancho.Este es el gancho de acción. Se aplicará a cualquier
WP_Queryinstancia. 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_Queryobjetos. Si tuvo una consulta primaria y una secundaria,pre_get_postsno puede crear la tercera. O si acaba de tener una primaria, no puede crear la secundaria.WP_Queryadmite 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_postdataen el ejemplo anterior, la salida será así, ya$GLOBALS['post']que no será válida.WP_Querytienewp_reset_queryfunció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_queryque debes hacer:Observaciones sobre
get_postsget_postspareceEs sólo una envoltura alrededor de
WP_Queryque las declaraciones de los mensajes objeto de consulta.El
ignore_sticky_postsconjunto 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_rowsconjunto en verdadero significa que la API de la base de datos de WordPress no se usaráSQL_CALC_FOUND_ROWSpara 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_ROWSexista.La solicitud sin
SQL_CALC_FOUND_ROWSserá más rápida.Observaciones sobre
query_postsquery_posts()EsWP_Queryenvoltorio. Devuelve la referencia alWP_Queryobjeto principal y, al mismo tiempo, establecerá elglobal $wp_query.En PHP4 todo, incluidos los objetos, se pasaba por valor.
query_postsfue 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_postsconsume 2M de memoria en total, mientras queget_postsconsume 3M de memoria.Tenga en cuenta
query_postsque 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_QueryPor supuesto, la solución sería usar la
wp_reset_queryfunción nuevamente.Es por eso que creo que
query_postspuede ser mejor desde el punto de vista de la memoria. Pero siempre debes hacerwp_reset_querytrucos.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_postsenWP_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_DEBUGy no notarán el aviso si no se produce una rotura real.OTOH mano, esta función es como una
gotodeclaración. Personalmente nunca (para una definición más pequeña que la esperada) uségotopero 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_postsmás lento que una consulta secundaria (léase: no la consulta principal).query_postssí mismo, sino la consulta inútil que se hizo cuando WP se estaba cargando