¿Hay alguna forma de excluir el contenido de la variable de publicación para ahorrar en el uso de RAM?

9

Por lo tanto, me he topado con lo que parece ser un problema de uso de RAM de WP y estoy buscando una solución.

El único lugar donde realmente tengo este problema en mi sitio es con una página de Mapa del sitio que estoy tratando de poblar, pero una solución a este problema podría aplicarse universalmente y ahorrar en el uso de RAM en todo el sitio.

Esencialmente, esta página del Mapa del sitio que tengo es una lista de todos los posts y pages en mi sitio. Los únicos elementos de la variable $ post a los que necesito acceder en esta página son el título y el enlace permanente. Desafortunadamente, la consulta que estoy usando devuelve todas las publicaciones con toda la información en cada una de sus variables $ post.

El siguiente es un ejemplo de una consulta que estoy usando en esta página del Mapa del sitio para un único custom-post-type llamado "productos" con una taxonomía personalizada de "suplementos" y el término "todos los suplementos". La página de Mi Mapa del sitio tiene varias consultas de este tipo, pero con fines explicativos solo incluyo el código para esta única consulta.

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

La gran mayoría de la información guardada dentro de la variable $ post (para mi sitio, y supongo que esta tendencia se ve para el uso general) se encuentra dentro de "el contenido" El uso típico de RAM en la página Mapa del sitio es ~ 140MB (reportado por Debug Bar), mientras que el uso de cualquier otra página típica en mi sitio es de 50-60MB. Gran diferencia. Ayer, la página Mapa del sitio dejó de funcionar (WSOD), y para solucionarlo tuve que aumentar la cantidad máxima de RAM que WP puede usar. Por lo tanto, estoy aumentando los recursos generales necesarios del sistema debido a una sola página.

Por lo tanto, vengo a mi pregunta.

¿Hay algún camino / opción en algún lugar de Wordpress que falte que pueda obtener posts / pages como una consulta normal, pero NO obtenga el contenido para las publicaciones recuperadas?

O, alternativamente, ¿hay alguna forma más fácil para que solo pueda capturar elementos particulares dentro de una consulta determinada (Título / Permaklink / Slug / etc ...) en lugar de obtener la variable $ post shebang?

Me parece que para muchas aplicaciones WP, el único lugar donde "el contenido" de una publicación / página se necesitaría normalmente es en esa página page o post (obviamente hay excepciones aquí), y el hecho de tener acceso al contenido completo para las publicaciones / páginas recuperadas por consulta en otras páginas es una simple exageración. Si hay una forma de evitar cargar el contenido completo para las páginas de la lista de publicaciones, entonces se podría guardar una cantidad significativa de uso de RAM.

Cualquier ayuda sería apreciada.

    
pregunta Programmer Dan 02.05.2013 - 18:43

4 respuestas

8

Puede intentar un truco consultando directamente los datos de publicación y configurando el campo filter de los objetos de publicación en sample antes de pasarlo a get_permalink() para reducir el uso de memoria.

Consulte problema de uso de memoria de get_permalink para conocer el razonamiento detallado que lo respalda.

    
respondido por el Rarst 02.05.2013 - 20:52
4

Puede intentar agregar esto a su matriz:

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

Parece bastante autoexplicativo, pero básicamente no estás consultando todas las variables de publicación y solo lo que necesitas.

    
respondido por el NW Tech 02.05.2013 - 19:54
2

¡Programador Dan, hombre mah!

Comencemos con las consultas personalizadas de SELECT usando $wpdb global. El Codex tiene una excelente entrada en Visualización de publicaciones utilizando una consulta de selección personalizada . Si utilizas setup_postdata() puedes recorrer los resultados como si estuvieras en el bucle estándar de 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 solo extrae los ID, los títulos y los GUID de las publicaciones (que se utilizan para determinar el enlace permanente de una publicación) mientras ignora absolutamente todo lo demás. Además, ordena los resultados primero por post_type y luego por post_title , aunque es posible que desee utilizar varias consultas para separar los tipos de publicación (teóricamente en un pequeño impacto de rendimiento).

Obviamente, es posible que desee omitir el uso de setup_postdata() y simplemente recorrer $sitemap_nodes , o jugar con la consulta para obtener los resultados que necesita.

Si llama a setup_postdata() y tiene activado el modo de depuración, es probable que las llamadas salgan avisos a la izquierda y a la derecha con respecto a la información faltante (deliberadamente). Es posible que desee lanzar un @ antes de la llamada a la función para suprimirlos una vez que haya confirmado que su consulta personalizada funciona correctamente.

¡Pero esto debería empezar! Puede consultar el siguiente diagrama de la base de datos (en la página Descripción de la base de datos en el Codex) para ubicar los campos que necesita consultar:

  

EDIT:

     

La solución más eficiente en memoria es una que combina una consulta personalizada SELECT con el protip de @Rarst :)

    
respondido por el bosco 02.05.2013 - 20:09
1

WP_Query tiene un parámetro de "campos de retorno" que se ve así:

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

Cuando se usa de esta manera, WP_Query solo devuelve los ID de publicación, no el objeto de publicación completo. Luego, solo puede usar get_permalink() , get_the_title() y otras funciones de WordPress para recuperar su contenido según la ID de la publicación.

    
respondido por el Dalton 07.05.2013 - 22:08

Lea otras preguntas en las etiquetas