Existe uma maneira de excluir o conteúdo da variável post para economizar no uso da RAM?

9

Então, eu parei com o que parece ser um problema de uso da RAM do WP e estou procurando uma solução.

O único lugar em que realmente tenho esse problema no meu site é com uma página de Mapa do Site que estou tentando preencher, mas uma solução para esse problema pode ser aplicada universalmente e economizar no uso de RAM em todo o site.

Essencialmente, esta página do Mapa do site que tenho é uma lista de todos postse pagesno meu site. Os únicos elementos da variável $ post aos quais preciso acessar nesta página são o título e o link permanente. Infelizmente, a consulta que estou usando retorna todas as postagens com todas as informações em cada uma das suas variáveis ​​$ post.

A seguir, é apresentado um exemplo de consulta que estou usando nesta página do Mapa do site para um único custom-post-type"produtos" nomeados com uma taxonomia personalizada de "suplementos" e o termo "todos os suplementos". A página Meu mapa do site possui várias consultas, mas, para fins explicativos, incluí apenas o código dessa consulta única.

 $varArray= array(
      'post_type' => 'products',
      'post_status' => 'publish',
      'supplements' => 'all-supplements',
      'posts_per_page' => -1,
      'orderby' => 'title',
      'order' => 'ASC'
 );
 $myProducts= new WP_Query($varArray);

A grande maioria das informações salvas na variável $ post (para o meu site, e acho que essa tendência é vista para uso geral) é encontrada no "conteúdo" O uso típico de RAM na página Mapa do site é ~ 140 MB (relatado pela barra de depuração), enquanto o uso para qualquer outra página típica do meu site é de 50 a 60 MB. Grande diferença. Ontem a página Mapa do Site parou de funcionar (WSOD) e, para corrigi-la, tive que aumentar a quantidade máxima de RAM que o WP pode usar. Então, estou aumentando os recursos gerais necessários do sistema por causa de uma única página.

Assim, chego à minha pergunta.

Existe um caminho / opção em algum lugar do Wordpress que estou faltando que iria buscar posts/ pagescomo uma consulta normal, mas NÃO obter o conteúdo das postagens recuperadas?

Ou, como alternativa, existe alguma maneira mais fácil para eu pegar apenas elementos específicos em uma consulta (Title / Permaklink / Slug / etc ...) em vez de obter toda a variável $ post shebang?

Parece-me que, para muitos aplicativos WP, o único local em que "o conteúdo" de uma postagem / página normalmente seria necessário é nessa pageou na postpágina (obviamente há exceções aqui) e em ter acesso ao conteúdo completo das postagens / páginas recuperadas pela consulta em outras páginas é um exagero simples. Se houver uma maneira de evitar o carregamento do conteúdo completo para as páginas da lista de postagens, uma quantidade significativa de uso de RAM poderá ser salva.

Qualquer ajuda seria apreciada.

Programador Dan
fonte

Respostas:

8

Você pode tentar um truque consultando dados de postagem diretamente e configurando o filtercampo de objetos de publicação sampleantes de passá-los get_permalink()para reduzir o uso de memória.

Consulte problema de uso de memória get_permalink para obter um raciocínio detalhado por trás dele.

Rarst
fonte
Esta solução funcionou muito bem. Bem, depois de um pouco de disputa. :) Eu tive que descobrir como incluir minha taxonomia / termo personalizado na consulta, mas isso foi uma grande ajuda. Página Mapa do Site agora usando 70 MB de RAM (de acordo com a Barra de Depuração). Obrigado pelo ótimo ponteiro.
Programador Dan
4

Você pode tentar adicionar isso ao seu array:

'nopaging' => true,
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false

Parece bastante auto-explicativo, mas essencialmente você não está consultando todas as variáveis ​​de postagem e apenas o que precisa.

NW Tech
fonte
2

Programador Dan, mah cara!

Vamos começar com SELECTconsultas personalizadas usando o $wpdbglobal. O Codex tem uma excelente entrada em Exibição de postagens usando uma consulta de seleção personalizada . Se você usar, setup_postdata()poderá percorrer os resultados como se estivesse sentado no loop padrão do Wordpress:

global $wpdb;

$sitemap_query = "
    SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.guid
    FROM $wpdb->posts
    WHERE $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type IN ('post','supplement','another_post_type')
    ORDER BY $wpdb->posts.post_type, $wpdb->posts.post_title DESC
    ";

$sitemap_nodes = $wpdb->get_results($sitemap_query, OBJECT);

if( $sitemap_nodes ):
    global $post;
    foreach ( $sitemap_nodes as $post ):
        setup_postdata( $post );
        ?>

<!-- //Use standard Wordpress template tags for SELECT'd data within The Loop here -->
    <?php the_title() ?>
    <?php the_permalink() ?>

        <?php
    endforeach;
endif;

Essa consulta puxa apenas os IDs, títulos e GUIDs das postagens (usados ​​para determinar o link permanente de uma postagem), ignorando absolutamente todo o resto. Além disso, ele ordena os resultados primeiro até post_typeentão post_title, embora você queira usar várias consultas para separar seus tipos de postagem (teoricamente com um pequeno impacto no desempenho).

Obviamente, você pode pular o uso setup_postdata()e simplesmente fazer um loop $sitemap_nodes, ou mexer na consulta para obter os resultados necessários.

Se você ligar setup_postdata()e o modo de depuração estiver ativado, as chamadas provavelmente estarão emitindo avisos à esquerda e à direita sobre (as deliberadamente) informações ausentes. Você pode querer lançar um @antes da chamada de função para suprimi-los depois de confirmar que sua consulta personalizada está funcionando corretamente.

Mas isso deve começar! Você pode consultar o seguinte diagrama do banco de dados (na página Descrição do Banco de Dados no Codex) para localizar os campos que você precisa consultar:

Diagrama do banco de dados do Wordpress

EDITAR:

A solução com maior eficiência de memória provavelmente combina uma SELECTconsulta personalizada com o protip da @ Rarst :)

bosco
fonte
1

WP_Query possui um parâmetro de "campos de retorno" que se parece com isso:

$args = array(
 'fields' => 'ids'
);
$query = new WP_Query( $args );

Quando usado dessa maneira, o WP_Query retorna apenas os IDs da postagem, não o objeto inteiro da postagem. Então você pode apenas usar os get_permalink(), get_the_title()e outras funções WordPress assorted para recuperar o seu conteúdo com base na identificação post.

Dalton
fonte
11
Observe que as funções que aceitam o ID da postagem geralmente são executadas imediatamente get_post()para recuperar dados completos e, portanto, anulam completamente o objetivo de recuperar os IDs sozinho.
Rarst
11
Bom saber! Fiquei com a impressão de ser inteligente.
Dalton