Existem duas query_posts()
funções tecnicamente falando. Um query_posts()
é realmenteWP_Query::query_posts()
e o outro está no espaço global.
Pedindo sanidade:
Se global query_posts()
é esse "mal", por que não é preterido?
Ou por que não está marcado como _doing_it_wong
.
query-posts
prosti
fonte
fonte
Respostas:
Questão essencial
Vamos cavar o trio:
::query_posts
,::get_posts
eclass WP_Query
para entender::query_posts
melhor.A pedra angular para obter os dados no WordPress é a
WP_Query
classe. Ambos os métodos::query_posts
e::get_posts
usam essa classe.Compreendendo o
WP_Query
Aqui está a
WP_Query
estrutura:WP_Query
é o canivete suíço.Algumas coisas sobre
WP_Query
:pre_get_posts
gancho à mãoNão sei explicar tudo isso, mas alguns são complicados, então vamos fornecer dicas curtas.
WP_Query
é algo que você pode controlar através de argumentos que você passaEste seria o exemplo mínimo da criação do
WP_Query
objeto a partir dos argumentos:WP_Query
é gananciosoCriado com a idéia, os
get all you can
desenvolvedores do WordPress decidiram obter todos os dados possíveis o quanto antes, pois isso é bom para o desempenho . É por isso que, por padrão, quando a consulta recebe 10 postagens do banco de dados, ela também obtém os termos e os metadados para essas postagens por meio de consultas separadas. Os termos e metadados serão armazenados em cache (pré-buscados).Você pode desativar o cache de se definir
update_post_meta_cache
eupdate_post_term_cache
parafalse
ao definir aWP_Query
argumentos. Quando o armazenamento em cache está desativado, os dados serão solicitados no banco de dados somente sob demanda.Para a maioria dos blogs do WordPress, o cache funciona bem, mas há algumas ocasiões em que você pode desativar o cache.
WP_Query
usa classes auxiliaresSe você verificou os
WP_Query
campos, você tem estes três:Você pode imaginar adicionando novas no futuro.
WP_Query
contém a substância para loopNeste código:
você pode notar que
WP_Query
possui a substância que pode iterar. Os métodos auxiliares também estão lá. Você acabou de definir owhile
loop.WP_Query
primário e secundárioNo WordPress, você tem uma consulta primária e zero ou mais consultas secundárias .
Consulta primária conhecida como consulta principal ou consulta regular . Consulta secundária também chamada de consulta personalizada .
O WordPress usa a
WP_Rewrite
classe mais cedo para criar os argumentos de consulta com base na URL. Com base nesses argumentos, ele armazena os dois objetos idênticos no espaço global. Ambos conterão a consulta principal.Quando dizemos a consulta principal , pensamos nessas variáveis. Outras consultas podem ser chamadas de secundárias ou personalizadas.
WP_Query
tem a mãopre_get_posts
gancho .Este é o gancho de ação. Será aplicado a qualquer
WP_Query
instância. Você chama assim:Esse gancho é ótimo e pode alterar qualquer argumento de consulta.
Aqui está o que você pode ler :
Portanto, este gancho é gerenciador de argumentos, mas não pode criar novos
WP_Query
objetos. Se você teve uma consulta primária e uma secundária,pre_get_posts
não pode criar a terceira. Ou, se você tivesse apenas um primário, ele não poderá criar o secundário.WP_Query
suporta loops aninhadosAqui está o exemplo de exemplo do WordPress com funções auxiliares, mesmo para os loops aninhados:
A saída será assim desde que instalei os dados do teste da unidade temática :
Mesmo que eu tenha solicitado 5 postagens na consulta $ personalizada, ele retornará seis, porque a postagem adesiva continuará. Se não houver
wp_reset_postdata
no exemplo anterior, a saída será assim, porque o valor$GLOBALS['post']
será inválido.WP_Query
temwp_reset_query
funçãoÉ como um botão de reset.
$GLOBALS['wp_the_query']
deve ser congelado o tempo todo, e plugins ou temas nunca devem alterá-lo.Aqui está o que
wp_reset_query
fazer:Observações sobre
get_posts
get_posts
pareceÉ apenas um invólucro em torno de
WP_Query
que os retornos das mensagens objeto de consulta.A
ignore_sticky_posts
configuração como true significa que as postagens adesivas podem aparecer apenas em uma posição natural. Não haverá postagens adesivas na frente. O outrono_found_rows
conjunto como true significa que a API do banco de dados WordPress não será usadaSQL_CALC_FOUND_ROWS
para implementar a paginação, reduzindo a carga no banco de dados para executar linhas encontradas contagem de .Isso é útil quando você não precisa de paginação. Entendemos agora que podemos imitar esta função com esta consulta:
Aqui está a solicitação SQL correspondente:
Compare o que temos agora com a solicitação SQL anterior, onde
SQL_CALC_FOUND_ROWS
existe.O pedido sem
SQL_CALC_FOUND_ROWS
será mais rápida.Observações sobre
query_posts
query_posts()
éWP_Query
invólucro. Retorna a referência aoWP_Query
objeto principal e, ao mesmo tempo, define oglobal $wp_query
.No PHP4, tudo, incluindo objetos, foi passado por valor.
query_posts
foi assim:Observe no cenário típico com uma consulta primária e uma secundária que temos essas três variáveis:
Digamos que cada um desses três consuma 1 milhão de memória. Total seria 3M de memória. Se usarmos
query_posts
,$GLOBALS['wp_query']
será desativado e criado novamente.O PHP5 + deve ser inteligente esvaziando o
$GLOBALS['wp_query']
objeto, assim como no PHP4, fizemos com ounset($GLOBALS['wp_query']);
Como resultado,
query_posts
consome 2M de memória no total, enquantoget_posts
consome 3M de memória.Observe
query_posts
que não estamos retornando o objeto real, mas uma referência ao objeto.Aqui está um exemplo
Resultará:
Tente redefinir a consulta:
Resultará:
Você pode criar problemas mesmo se usar
WP_Query
Obviamente, a solução seria usar a
wp_reset_query
função novamente.É por isso que acho que
query_posts
pode ser melhor do ponto de vista da memória. Mas você deve sempre fazerwp_reset_query
truques.fonte
Acabei de criar um novo ticket trac, ticket # 36874 , para propor a descontinuação
query_posts()
. Se será ou não aceito, continua sendo uma boa pergunta.O grande problema
query_posts()
é que ele ainda é amplamente usado por plugins e temas, mesmo que tenha havido realmente bons escritos sobre o assunto de por que você NUNCA deve usá-lo. Eu acho que o post mais épico aqui no WPSE é o seguinte:remoção de deprecation! == , portanto, a depreciação
query_posts()
não interromperá seu uso por desenvolvedores de baixa qualidade e por pessoas em geral que não conhecem o WordPress e que usam tutoriais de baixa qualidade como diretrizes. Assim como alguma prova, quantas perguntas que nós ainda chegar aqui onde as pessoas usamcaller_get_posts
emWP_Query
? Está obsoleto há muitos anos.No entanto, funções e argumentos obsoletos podem ser removidos a qualquer momento que os desenvolvedores principais entenderem, mas isso provavelmente nunca acontecerá,
query_posts()
pois isso quebrará milhões de sites. Portanto, sim, provavelmente nunca veremos a remoção totalquery_posts()
- o que pode levar ao fato de que provavelmente nunca será reprovado.Este é um ponto de partida, mas é preciso lembrar que a depreciação de algo no WordPress não interrompe seu uso.
ATUALIZAÇÃO 19 de maio de 2016
O ingresso que levantei agora está fechado e marcado como duplicado para um ingresso de 4 anos , que foi fechado como wontfix e foi reaberto e ainda permanece aberto e sem solução.
Parece que os principais desenvolvedores estão se apegando a esse velho e pequeno mal fiel. Todos os interessados, aqui está o bilhete duplicado de 4 anos
fonte
[um tanto retórico]
É a filosofia central permanente que nada é verdadeiramente depreciado. O aviso de descontinuação, embora seja bom ter, só será ignorado se a função não for realmente descartada em algum momento. Existem muitas pessoas que não desenvolvem com
WP_DEBUG
e não notarão o aviso se não houver uma ruptura real.OTOH mão, esta função é como
goto
declaração. Pessoalmente, nunca usei (por definição menor do que o esperado),goto
mas posso entender os argumentos que apontam para alguma situação em que não é ruim por padrão. O mesmo acontece comquery_posts
, é uma maneira simples de configurar todos os globais necessários para fazer um loop simples e pode ser útil no contexto ajax ou rest-api. Eu nunca o usaria também nesses contextos, mas posso ver que, ali, é mais uma questão de estilo de codificação do que uma função que é má por si só.Aprofundando um pouco, o principal problema é que os globais precisam ser definidos. Esse é o principal problema, não a única função que ajuda a defini-los.
fonte
query_posts
mais lento que uma consulta secundária (leia-se: não a consulta principal).query_posts
si mesmo, mas a consulta inútil que foi feito quando WP foi de carregamento