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

9

Entonces, me he encontrado con lo que parece un problema de uso de WP RAM y estoy buscando una solución.

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

Esencialmente, esta página del Mapa del sitio que tengo es una lista de todos postsy pagesen 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 solo custom-post-type"productos" con una taxonomía personalizada de "suplementos" y el término "todos los suplementos". La página Mi mapa del sitio tiene varias consultas de este tipo, pero con fines explicativos solo incluyo el código para esta 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);

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 uso general) se encuentra dentro del "contenido". El uso típico de RAM para mi página de Mapa del sitio es de ~ 140 MB (informado por Debug Bar), mientras que el uso de cualquier otra página típica en mi sitio es de 50-60 MB. Gran diferencia. Ayer, la página del 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 del sistema necesarios en general debido a una sola página.

Por lo tanto, llego a mi pregunta.

¿Hay una vía / opción en algún lugar dentro de Wordpress que me falta que obtenga posts/ pagescomo una consulta normal, pero que NO obtenga el contenido de las publicaciones recuperadas?

O, alternativamente, ¿hay alguna manera más fácil para que yo solo tome elementos particulares dentro de una consulta dada (Título / Permaklink / Slug / etc ...) en lugar de obtener todo el shebang variable $ post?

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

Cualquier ayuda sería apreciada.

Programador Dan
fuente

Respuestas:

8

Puede probar un truco con la consulta de datos de publicación directamente y establecer el filtercampo de los objetos de publicación sampleantes de pasarlos get_permalink()para reducir el uso de memoria.

Consulte el problema de uso de memoria get_permalink para obtener un razonamiento detallado.

Rarst
fuente
Esta solución funcionó muy bien. Bueno, después de un pequeño debate, eso es. :) Tuve que descubrir cómo incluir mi taxonomía / término personalizado en la consulta, pero fue de gran ayuda. La página del mapa del sitio ahora usa 70 MB de RAM (según la barra de depuración). Gracias por el gran puntero.
Programador Dan
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 explicativo, pero esencialmente no está consultando todas las variables de publicación y solo las cosas que necesita.

NW Tech
fuente
2

Programador Dan, hombre!

Comencemos con las SELECTconsultas personalizadas utilizando el $wpdbglobal. El Codex tiene una gran entrada en la visualización de publicaciones utilizando una consulta de selección personalizada . Si lo utiliza setup_postdata(), puede recorrer los resultados como si estuviera sentado 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, títulos y GUID de las publicaciones (utilizados para determinar el enlace permanente de una publicación) mientras ignora absolutamente todo lo demás. Además, ordena los resultados primero para post_typeentonces post_title, aunque es posible que desee utilizar múltiples consultas para separar sus tipos de publicación (teóricamente con un pequeño impacto en el rendimiento).

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

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

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

Diagrama de base de datos de Wordpress

EDITAR:

Es probable que la solución más eficiente en memoria sea una que combine una SELECTconsulta personalizada con el protip de @ Rarst :)

bosco
fuente
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 las ID de publicación, no el objeto de publicación completo. A continuación, sólo puede utilizar los get_permalink(), get_the_title()y otras funciones de WordPress variada para recuperar su contenido basado en el poste de identificación.

Dalton
fuente
1
Tenga en cuenta que las funciones que aceptan la ID de la publicación generalmente se ejecutan inmediatamente get_post()para recuperar datos completos y, por lo tanto, anulan por completo el propósito de recuperar las ID solo.
Rarst
1
¡Bueno saber! Tenía la impresión de que estaba siendo inteligente.
Dalton