Gibt es eine Möglichkeit, den Inhalt von der Post-Variablen auszuschließen, um RAM-Auslastung zu sparen?

9

Ich bin also auf ein Problem mit der WP-RAM-Nutzung gestoßen und suche nach einer Lösung.

Der einzige Ort, an dem ich dieses Problem wirklich auf meiner Site habe, ist eine Site Map-Seite, die ich zu füllen versuche. Eine Lösung für dieses Problem kann jedoch universell angewendet werden und die RAM-Nutzung auf einer gesamten Site einsparen.

Im Wesentlichen ist diese Site Map-Seite, die ich habe, eine Liste aller postsund pagesauf meiner Site. Die einzigen Elemente der Variablen $ post, auf die ich auf dieser Seite zugreifen muss, sind der Titel und der Permalink. Leider gibt die von mir verwendete Abfrage alle Beiträge mit allen Informationen in jeder ihrer $ post-Variablen zurück.

Das folgende Beispiel zeigt eine Abfrage, die ich auf dieser Site Map-Seite für ein einzelnes custom-post-typeProdukt mit dem Namen "Produkte" mit einer benutzerdefinierten Taxonomie von "Ergänzungen" und dem Begriff "Alle Ergänzungen" verwende. Meine Site Map-Seite enthält mehrere solcher Abfragen, aber zu Erklärungszwecken füge ich nur den Code für diese einzelne Abfrage hinzu.

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

Die große Mehrheit der Informationen, die in der Variablen $ post gespeichert sind (für meine Site, und ich vermute, dass dieser Trend für die allgemeine Verwendung gesehen wird), befindet sich im "Inhalt". Die typische RAM-Nutzung für meine Site Map-Seite beträgt ~ 140 MB (von Debug Bar gemeldet), während die Verwendung für jede andere typische Seite auf meiner Website 50-60 MB beträgt. Großer Unterschied. Gestern funktionierte die Site Map-Seite nicht mehr (WSOD), und um dies zu beheben, musste ich die maximale RAM-Größe erhöhen, die WP verwenden kann. Daher erhöhe ich die insgesamt erforderlichen Systemressourcen aufgrund einer einzelnen Seite.

So komme ich zu meiner Frage.

Gibt es irgendwo in Wordpress einen Pfad / eine Option, den ich vermisse, der eine normale Abfrage abruft posts/ pagesmag, aber NICHT den Inhalt für abgerufene Beiträge erhält?

Oder gibt es alternativ eine einfachere Möglichkeit für mich, nur bestimmte Elemente innerhalb einer bestimmten Abfrage (Titel / Permaklink / Slug / etc ...) zu erfassen, anstatt die gesamte $ post-Variable shebang abzurufen?

Es scheint mir, dass für viele WP-Anwendungen der einzige Ort, an dem "der Inhalt" eines Posts / einer Seite normalerweise benötigt wird, auf dieser pageoder dieser postSeite liegt (offensichtlich gibt es hier Ausnahmen) und dass der Zugriff auf den vollständigen Inhalt für Posts möglich ist / Seiten, die durch Abfrage auf anderen Seiten abgerufen werden, sind einfach übertrieben. Wenn es eine Möglichkeit gibt, das Laden des gesamten Inhalts für Postlistenseiten zu vermeiden, kann eine erhebliche Menge an RAM-Nutzung eingespart werden.

Jede Hilfe wäre dankbar.

Programmierer Dan
quelle

Antworten:

8

Sie können einen Trick ausprobieren filter, sampleindem Sie Post-Daten direkt abfragen und das Feld der Post-Objekte festlegen, bevor Sie es übergeben, get_permalink()um die Speichernutzung zu reduzieren.

Ausführliche Informationen dazu finden Sie unter Problem mit der Speichernutzung von get_permalink .

Selten
quelle
Diese Lösung hat großartig funktioniert. Nun, nach ein wenig Streit ist das. :) Ich musste herausfinden, wie ich meine benutzerdefinierte Taxonomie / meinen benutzerdefinierten Begriff in die Abfrage aufnehmen kann, aber das war eine große Hilfe. Site Map-Seite verwendet jetzt 70 MB RAM (laut Debug-Leiste). Danke für den tollen Hinweis.
Programmierer Dan
4

Sie können versuchen, dies Ihrem Array hinzuzufügen:

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

Es scheint ziemlich selbsterklärend zu sein, aber im Grunde fragen Sie nicht alle Post-Variablen und nur das Zeug ab, das Sie brauchen.

NW Tech
quelle
2

Programmierer Dan, mah Mann!

Beginnen wir mit benutzerdefinierten SELECTAbfragen unter Verwendung der $wpdbglobalen. Der Codex bietet einen großartigen Eintrag zum Anzeigen von Posts mithilfe einer benutzerdefinierten Auswahlabfrage . Wenn Sie davon Gebrauch machen setup_postdata(), können Sie die Ergebnisse so durchlaufen, als ob Sie in der Standard-Wordpress-Schleife sitzen:

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;

Diese Abfrage ruft nur die IDs, Titel und GUIDs der Posts ab (die zum Ermitteln des Permalinks eines Posts verwendet werden), während alles andere absolut ignoriert wird. Außerdem werden die Ergebnisse bis post_typedahin zuerst sortiert post_title, obwohl Sie möglicherweise mehrere Abfragen verwenden möchten, um Ihre Beitragstypen zu trennen (theoretisch bei einem kleinen Leistungstreffer).

Natürlich möchten Sie möglicherweise auf die Verwendung verzichten setup_postdata()und diese einfach durchlaufen $sitemap_nodesoder mit der Abfrage herumspielen, um die gewünschten Ergebnisse zu erhalten.

Wenn Sie anrufen setup_postdata()und den Debug-Modus aktiviert haben, werden die Anrufe wahrscheinlich links und rechts Hinweise auf (absichtlich) fehlende Informationen ausspucken. Möglicherweise möchten Sie @vor dem Funktionsaufruf ein auslösen, um sie zu unterdrücken, nachdem Sie bestätigt haben, dass Ihre benutzerdefinierte Abfrage ordnungsgemäß funktioniert.

Aber das sollte Ihnen den Einstieg erleichtern! In dem folgenden Datenbankdiagramm (auf der Seite Datenbankbeschreibung im Codex) finden Sie die Felder, die Sie abfragen müssen:

Wordpress-Datenbankdiagramm

BEARBEITEN:

Die speichereffizienteste Lösung ist wahrscheinlich eine, die eine benutzerdefinierte SELECTAbfrage mit @ Rarsts Protip kombiniert :)

Bosco
quelle
1

WP_Query hat einen Parameter "Rückgabefelder", der folgendermaßen aussieht:

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

Auf diese Weise gibt WP_Query nur die Post-IDs zurück, nicht das gesamte Post-Objekt. Dann können Sie einfach verwenden Sie die get_permalink(), get_the_title()und andere Funktionen sortiert Wordpress Ihre Inhalte auf der Basis der Post - ID abzurufen.

Dalton
quelle
1
Beachten Sie, dass Funktionen, die die ID eines Posts akzeptieren, normalerweise sofort darauf ausgeführt werden get_post(), um vollständige Daten abzurufen, und somit den Zweck des Abrufs von IDs allein vollständig zunichte machen.
Erst
1
Gut zu wissen! Ich hatte den Eindruck, schlau zu sein.
Dalton