RAM使用量を節約するために、post変数からコンテンツを除外する方法はありますか?


9

それで、私はWP RAM使用問題のように見えるものに出会い、解決策を探しています。

私のサイトで実際にこの問題が発生している唯一の場所は、入力しようとしているサイトマップページですが、この問題の解決策は広く適用され、サイト全体のRAM使用量を節約できます。

基本的に、私はこのサイトマップのページには、すべてのリストであるpostspages、私のサイト上で。このページでアクセスする必要がある$ post変数の唯一の要素は、タイトルとパーマリンクです。残念ながら、私が使用しているクエリは、各$ post変数にすべての情報を含むすべての投稿を返します。

以下は、このサイトマップページで使用しているcustom-post-type、「サプリメント」というカスタム分類と「すべてのサプリメント」という用語を使用した「製品」という名前の単一のクエリの例です。サイトマップページにはそのようなクエリが複数ありますが、説明のために、この単一のクエリのコードのみを含めています。

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

$ post変数に保存された情報の大部分(私のサイトの場合、この傾向は一般的な使用で見られると思います)は "コンテンツ"内にあります私のサイトマップページの一般的なRAMの使用は〜140MBです(デバッグバーによって報告されます)、私のサイトの他の一般的なページの使用量は50〜60 MBです。大きな違い。昨日、サイトマップページが機能しなくなり(WSOD)、それを修正するには、WPが使用できるRAMの最大量を増やす必要がありました。したがって、ページが1つしかないため、必要なシステムリソース全体を増やしています。

したがって、私は私の質問に来る。

Wordpress内のどこかに、通常のクエリのようにフェッチposts/ 取得するが取得した投稿のコンテンツを取得しないパスウェイ/オプションはありますか?pages

または、代わりに、$ post変数シバン全体を取得する代わりに、特定のクエリ(Title / Permaklink / Slug / etc ...)内の特定の要素のみを取得する簡単な方法はありますか?

多くのWPアプリケーションでは、投稿/ページの「コンテンツ」が通常必要となる唯一の場所はそのpageまたはpostページ(明らかにここには例外があります)であり、投稿の完全なコンテンツにアクセスできるようです/ pagesは、他のページのクエリによって取得され、単純にやりすぎです。投稿リストページのコンテンツ全体を読み込まないようにする方法がある場合、RAMの使用量を大幅に節約できます。

任意の助けいただければ幸いです。

回答:


8

メモリ使用量を減らすために、それを渡す前に、投稿データを直接クエリしfilter、投稿オブジェクトのフィールドをに設定するトリックを試すことができます。sampleget_permalink()

その背後にある詳細な理由については、get_permalinkのメモリ使用量の問題を参照してください。


このソリューションはうまくいきました。まあ、それは少しの論争の後です。:)カスタムタクソノミー/用語をクエリに含める方法を理解する必要がありましたが、これは非常に役立ちました。サイトマップページは70MBのRAMを使用するようになりました(デバッグバーによると)。すばらしいポインタをありがとう。
プログラマダン

4

これを配列に追加してみてください:

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

自明のようですが、本質的には、すべてのPOST変数と必要なものだけをクエリしているわけではありません。


2

プログラマーダン、マーマン!

グローバルSELECTを使用してカスタムクエリを開始しましょう$wpdb。コーデックスには、カスタム選択クエリを使用した投稿の表示に関する優れたエントリがあります。あなたが使用しますもしsetup_postdata()あなたが標準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;

このクエリは、投稿のパーマリンクを決定するために使用される投稿のID、タイトル、およびGUIDのみをプルし、その他はすべて無視します。さらに、post_typeそれpost_titleまでに最初に結果を並べ替えますが、複数のクエリを使用して投稿タイプを分離することもできます(理論的には小さなパフォーマンスヒット時)。

明らかに、使用をスキップしてsetup_postdata()単純にをループする$sitemap_nodesか、クエリをいじって必要な結果を得ることができます。

呼び出しをsetup_postdata()行い、デバッグモードをアクティブにした場合、呼び出しは(意図的に)欠落している情報に関する通知を左右に吐き出します。@カスタムクエリが適切に機能していることを確認した後で、関数呼び出しの前にをスローして、それらを抑制することができます。

しかし、これであなたは始められるはずです!(Codexの[ データベースの説明]ページから)次のデータベースダイアグラムを参照して、クエリを実行する必要があるフィールドを見つけることができます。

Wordpressデータベース図

編集:

最もメモリ効率の高いソリューションは、カスタムSELECTクエリと@Rarstのprotip を組み合わせたものです:)


1

WP_Queryには、次のような「戻りフィールド」パラメーターがあります。

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

この方法で使用した場合、WP_Queryは投稿オブジェクト全体ではなく、投稿IDのみを返します。次に、あなただけ使用することができget_permalink()get_the_title()ポストIDに基づいてコンテンツを取得するために、その他の各種WordPressの機能を。


1
投稿のIDを受け入れる関数は通常、すぐに実行さget_post()れて完全なデータを取得するため、IDだけを取得する目的を完全に無効にします。
Rarst

1
知っておきたい!頭が良いという印象を受けました。
ダルトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.