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

9

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

O único local em que realmente estou tendo esse problema em meu site é com uma página de mapa de sites que estou tentando preencher, mas uma solução para esse problema pode ser universalmente aplicada e economizar o uso de RAM em um site inteiro.

Essencialmente, esta página Mapa do site que eu tenho é uma lista de todos os posts e pages no meu site. Os únicos elementos da variável $ post que eu preciso acessar nesta página são o título e permalink. Infelizmente, a consulta que estou usando retorna todas as postagens com todas as informações em cada uma de suas variáveis $ post.

Segue-se um exemplo de uma consulta que utilizo nesta página do Mapa de sites para um único custom-post-type denominado "produtos" com uma taxonomia personalizada de "suplementos" e termo "todos os suplementos". A página Meu mapa do site tem várias consultas desse tipo, mas, para fins explicativos, estou incluindo 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 estou supondo que essa tendência é vista para uso geral) é encontrada dentro do "conteúdo" O uso típico de RAM para minha página do Mapa do Site é ~ 140MB (reportado pela Barra de Depuração), enquanto o uso para qualquer outra página típica no meu site é de 50-60MB. Grande diferença. Ontem a página do Mapa do Site parou de funcionar (WSOD) e, para corrigi-lo, 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 algum caminho / opção em algum lugar dentro do Wordpress que esteja faltando, que buscaria posts / pages como uma consulta normal, mas NÃO obteria o conteúdo das postagens recuperadas?

Ou, alternativamente, existe alguma maneira mais fácil para eu pegar apenas elementos particulares dentro de uma dada consulta (Title / Permaklink / Slug / etc ...) ao invés 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 seria normalmente necessário está na page ou post página (obviamente há exceções aqui) e que ter acesso ao conteúdo completo para postagens / páginas recuperadas por consulta em outras páginas é um exagero simples. Se houver uma maneira de evitar o carregamento de todo o conteúdo das páginas da lista de postagens, uma quantidade significativa de uso de RAM poderá ser salva.

Qualquer ajuda seria apreciada.

    
por Programmer Dan 02.05.2013 / 18:43

4 respostas

8

Você pode tentar um truque ao consultar dados de postagem diretamente e definir filter campo de postar objetos como sample antes de passá-lo para get_permalink() para reduzir o uso de memória.

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

    
por Rarst 02.05.2013 / 20:52
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 post e apenas as coisas que você precisa.

    
por NW Tech 02.05.2013 / 19:54
2

Programador Dan, meu Deus!

Vamos começar com as consultas SELECT personalizadas usando o $wpdb global. O Codex tem uma ótima entrada em Exibição de postagens usando uma Consulta de Seleção Personalizada . Se você fizer uso de setup_postdata() , você pode percorrer os resultados como se estivesse 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;

Esta consulta apenas extrai os IDs, Títulos e GUIDs das postagens (usados para determinar o link permanente de uma postagem), ignorando todo o resto. Além disso, ele ordena os resultados primeiro por post_type then post_title , embora você possa querer usar várias consultas para separar seus tipos de post (teoricamente com um pequeno desempenho).

Obviamente, você pode querer usar setup_postdata() e simplesmente percorrer $sitemap_nodes ou mexer na consulta para obter os resultados necessários.

Se você chamar setup_postdata() e tiver o modo de depuração ativado, as chamadas provavelmente serão enviadas à esquerda e à direita em relação às informações ausentes (deliberadamente). 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 de banco de dados (da página Database Description no Codex) para localizar os campos que você precisa consultar:

  

EDITAR:

     

A solução mais eficiente em termos de memória é provavelmente aquela que combina uma consulta SELECT personalizada com o protip do @Rarst:)

    
por bosco 02.05.2013 / 20:09
1

WP_Query tem um parâmetro "campos de retorno" com a seguinte aparência:

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

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

    
por Dalton 07.05.2013 / 22:08