Existe-t-il un moyen d'exclure le contenu de la variable post pour économiser sur l'utilisation de la RAM?

9

Donc, j'ai rencontré ce qui ressemble à un problème d'utilisation de WP RAM et je cherche une solution.

Le seul endroit où j'ai vraiment ce problème sur mon site est avec une page Plan du site que j'essaie de remplir, mais une solution à ce problème pourrait être universellement appliquée et économiser sur l'utilisation de la RAM sur un site entier.

Essentiellement, cette page Plan du site que j'ai est une liste de tous postset pagessur mon site. Les seuls éléments de la variable $ post auxquels j'ai besoin d'accéder sur cette page sont le titre et le permalien. Malheureusement, la requête que j'utilise renvoie tous les messages avec toutes les informations dans chacune de leurs variables $ post.

Voici un exemple de requête que j'utilise sur cette page Plan du site pour un seul custom-post-type"produit" nommé avec une taxonomie personnalisée de "suppléments" et le terme "tous-suppléments". Ma page Plan du site contient plusieurs requêtes de ce type, mais à des fins explicatives, j'inclus uniquement le code de cette seule requête.

 $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 grande majorité des informations enregistrées dans la variable $ post (pour mon site, et je suppose que cette tendance est observée pour une utilisation générale) se trouve dans "le contenu". L'utilisation typique de la RAM pour ma page Plan du site est ~ 140 Mo (rapporté par la barre de débogage), alors que l'utilisation de toute autre page typique sur mon site est de 50 à 60 Mo. Grande différence. Hier, la page Plan du site a cessé de fonctionner (WSOD), et pour y remédier, j'ai dû augmenter la quantité maximale de RAM que WP peut utiliser. J'augmente donc globalement les ressources système nécessaires en raison d'une seule page.

J'en viens donc à ma question.

Y a-t-il un chemin / une option quelque part dans Wordpress qui me manque qui irait chercher posts/ pagescomme une requête normale, mais PAS obtenir le contenu des messages récupérés?

Ou bien, existe-t-il un moyen plus simple pour moi de ne saisir que des éléments particuliers dans une requête donnée (Titre / Permaklink / Slug / etc ...) au lieu d'obtenir l'intégralité de la variable $ post shebang?

Il me semble que pour de nombreuses applications WP, le seul endroit où "le contenu" d'une publication / page serait généralement nécessaire est sur cette pageou cette postpage (il y a évidemment des exceptions ici), et que l'accès au contenu complet des publications / pages récupérées par requête sur d'autres pages est une simple exagération. S'il existe un moyen d'éviter de charger le contenu complet des pages de la liste des publications, une quantité importante d'utilisation de la RAM pourrait être économisée.

Toute aide serait appréciée.

Programmeur Dan
la source

Réponses:

8

Vous pouvez essayer une astuce en interrogeant directement les données de publication et en définissant le filterchamp des objets de publication sur sampleavant de les transmettre get_permalink()pour réduire l'utilisation de la mémoire.

Voir le problème d'utilisation de la mémoire de get_permalink pour un raisonnement détaillé.

Rarst
la source
Cette solution a très bien fonctionné. Eh bien, après une petite dispute, c'est. :) J'ai dû comprendre comment inclure ma taxonomie / terme personnalisé dans la requête, mais cela m'a été d'une grande aide. La page Plan du site utilise désormais 70 Mo de RAM (selon la barre de débogage). Merci pour le grand pointeur.
Programmeur Dan
4

Vous pouvez essayer d'ajouter ceci à votre tableau:

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

Cela semble assez explicite, mais essentiellement vous n'interrogez pas toutes les variables de publication et juste ce dont vous avez besoin.

NW Tech
la source
2

Programmeur Dan, mah man!

Commençons par des SELECTrequêtes personnalisées à l'aide du $wpdbglobal. Le Codex a une excellente entrée sur l' affichage des messages à l'aide d'une requête de sélection personnalisée . Si vous utilisez, setup_postdata()vous pouvez parcourir les résultats comme si vous étiez assis dans la boucle Wordpress standard:

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;

Cette requête extrait uniquement les ID, titres et GUID des publications (utilisés pour déterminer le permalien d'une publication) tout en ignorant absolument tout le reste. Il ordonne en outre les résultats d'abord d'ici post_typepost_title, bien que vous souhaitiez peut-être utiliser plusieurs requêtes pour séparer vos types de publication (théoriquement à un faible niveau de performances).

De toute évidence, vous souhaiterez peut-être ignorer l'utilisation setup_postdata()et simplement parcourir $sitemap_nodes, ou jouer avec la requête pour obtenir les résultats dont vous avez besoin.

Si vous appelez setup_postdata()et que le mode de débogage est activé, les appels cracheront probablement des avis de gauche et de droite concernant (délibérément) les informations manquantes. Vous souhaiterez peut-être lancer un @avant l'appel de fonction pour les supprimer après avoir confirmé que votre requête personnalisée fonctionne correctement.

Mais cela devrait vous aider à démarrer! Vous pouvez vous référer au diagramme de base de données suivant (à partir de la page Description de la base de données sur le Codex) pour localiser les champs que vous devez interroger:

Diagramme de base de données Wordpress

ÉDITER:

La solution la plus efficace en mémoire est probablement celle qui combine une SELECTrequête personnalisée avec le protip de @ Rarst :)

bosco
la source
1

WP_Query a un paramètre "champs de retour" qui ressemble à ceci:

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

Lorsqu'il est utilisé de cette façon, WP_Query renvoie uniquement les ID de publication, pas l'intégralité de l'objet de publication. Ensuite, vous pouvez simplement utiliser le get_permalink(), get_the_title()et d'autres fonctions WordPress assorties pour récupérer votre contenu en fonction de l'ID de la publication.

Dalton
la source
1
Notez que les fonctions qui acceptent l'ID de la publication s'exécutent généralement immédiatement get_post()sur celui-ci pour récupérer toutes les données et ainsi complètement annuler l'objectif de récupérer les ID seuls.
Rarst
1
Bon à savoir! J'avais l'impression d'être intelligent.
Dalton