数百万の投稿に対してWPサイトを最適化する方法


19

私は、カスタム投稿タイプを介して何百万もの投稿を作成する可能性が非常に高い会社のWebサイトに取り組んでいます。彼らは祈りなので、基本的にフロントエンドのユーザーはフォームを介して短いフレーズを送信するだけです。会社が気にするのは、投稿内容と投稿日だけです。このサイトはまだ公開されておらず、すでに120,000を超える投稿があるので、何百万と言っても私は真剣です。

そのため、最適化に関する質問がいくつかあります。

  1. 500,000件の投稿があるカスタム投稿タイプに「特集」カテゴリがあるとします。注目のカテゴリには500件の投稿しかありません。注目の投稿のクエリを作成する場合、500,000件の投稿全体をクエリしますか、それとも注目の500件のみをクエリしますか?特集されている最新の投稿を10個だけ表示したい場合はどうすればよいですか?
  2. このカスタムの投稿タイプをデータベースに保存するときに、特に本当に必要なのは投稿の内容と日付だけなので、サーバーリソースを削減するためにできることはありますか?
  3. カスタム投稿タイプを使用する必要がありますか?WordPress管理機能にうまく統合されているため、原則としては気に入っていますが、パフォーマンスに大きな欠点がある場合は、何か別のことができると思います。

この規模でプロジェクトに取り組んだことはないので、いつもよりもパフォーマンスが少し気になります。助けてくれてありがとう!


WordPressの関数でデータベースクエリを最小限に抑え、スクリプトを適切に呼び出すことが重要ですが、最適化の大部分はサーバーのセットアップと設定方法に関係しています。そのためには、サーバー障害ネットワークを検索します。serverfault.com/search?q=optimize+wordpress
iyrin

@RyanLoremIpsum-コメントありがとうございます。しかし、特定の質問に対する回答を期待していました。私はWordPressが動作していないか、コードの観点からそれを最適化する方法、サーバ自体とそこに扱ったものの大部分
エレミヤPrummer

回答:


25

1. WP_Queryを実行するにクエリを設定します

クエリを変更する唯一の機会は、もちろん、それがSQLデータベースで実行される前であるため、データベースクエリを最小限に抑えようとするとき、これは覚えておくべき最も重要なことのようです。

通常のクエリ
通常のクエリの場合、WordPressはwp()関数を使用し、この関数はを呼び出します$wp->main( $query_vars )。条件タグの「is_変数」は、に渡す前に設定さWP_Query->get_posts()れ、MySQLデータベースクエリに変換され、最終的に$ wp_queryオブジェクトに保存されます。SQLデータベースで実際に実行される前にクエリをフィルタリングすることができます

pre_get_postsアクションは、それが渡される前に、クエリを変更することができ、このプロセスにフックWP_Query->get_posts()

たとえば、「注目」カテゴリの投稿のクエリをフィルタリングする場合add_action( 'pre_get_posts', 'your_function_name' );は、in_category内に条件タグを使用して含めますyour_function_name

function your_function_name( $query ) {
    if ( $query->in_category( 'featured' ) && $query->is_main_query() ) {
        // Replace 123 with the category ID of the featured category.
        $query->set( 'cat', '123' );
    }
}
add_action( 'pre_get_posts', 'your_function_name' );

プラグインAPI /アクションリファレンス/ pre get postsを参照してください«WordPress Codex

ページリクエスト
「機能」カテゴリのアーカイブページなどのページテンプレートに関しては、条件タグはpre_get_postsフィルターから機能しません。たとえば、is_categoryWP_Queryが実行されていないため、アーカイブページの確認に使用できません。

代わりに、のnew WP_Queryようなページリクエストのメインクエリを変更する必要があります$query = new WP_Query( 'cat=123' );。これにより、最初から適切な引数が設定されたクエリが実行されます。

参照クラスリファレンス/ WPクエリ«WordPressのコーデックス

2.データベースへの保存

フィルタを使用しwp_insert_post_dataて、カスタム投稿タイプに関連する$ dataのみがに返されるようにすることができますwp_insert_post。カスタム投稿タイプを確認するための条件ステートメントを必ず含めてください。
プラグインAPI /フィルターリファレンス/ wp投稿データの挿入«WordPress Codex

このフックはwp_insert_post関数によって呼び出されます。この関数は、通常下書きを保存するか、投稿を公開することにより、カスタム投稿タイプを更新するときにwp_update_postによって呼び出されます。

ただし、データベースで更新されるデータを削減することの最適化の重要性について個人的に話すことはできないため、自分でベンチマークを行う必要があります。

3.カスタム投稿タイプはパフォーマンスに影響しますか?

私の経験では、カスタム投稿タイプはコンテンツを管理するための強力なツールです。少ないリソースを使用する方法で許可されているすべての方法で投稿を管理する他の方法は知りません。個人的には、可能な限り行われるクエリの数を減らす方法を見つけることに集中します。

以前は、パーマリンク構造に関連するパフォーマンスの問題があったため、数字ではなくテキストで始まる場合にヒットしました。3これは、多数のページをホストするサイトでは特に面倒でしたが、WordPressバージョン3.3以降で解決されています。

スラッグは通常、パーマリンク構造の最初の部分であり、バージョン3.3より前のパフォーマンスに影響を与える可能性があるため、ここではパーマリンクのみを取り上げます。それ以外は、カスタム投稿タイプの使用から生じるパフォーマンスの問題については知りません。

その他のパフォーマンスオプション

Transients
これは、コード内でクエリを最小限に抑えるための代替ではありませんが、set_transientを使用してクエリをしばらく保存し、新しいクエリが不要になるようにすることができます。以下は、Dave Clementsの投稿で使用されている例です。また、save_post特定の投稿タイプが更新されるたびに、一時的なイベントを削除するアクションを追加することをお勧めします。

<?php // IN THE SPOTLIGHT QUERY
if( false === ( $its_query = get_transient( 'its_query' ) ) ) {
    $pttimestamp = time() + get_option('gmt_offset') * 60*60;
    $its_query = new WP_Query( array(
        'post_type' => 'spotlight',
        'posts_per_page' => 1,
            'post__not_in' => $do_not_duplicate,
        'meta_query' => array(
            array(
                'key' => '_hpc_spotlight_end_time',
                'value' => $pttimestamp,
                'compare' => '>'
            )
        )
    ) );
    set_transient( 'its_query', $its_query, 60*60*4 );
}
if( have_posts() ) { // HIDE SECTION IF NO CURRENT ITS FEATURE ?>
    // LOOP GOES HERE: NOT IMPORTANT TO EXAMPLE
<?php } ?>

より多くのクエリの最適化
Thomas Griffinは、WordPressクエリの最適化チュートリアルでいくつかの良いヒントを持っています。彼の提案の簡単なリストを以下に示します。

  • 'cache_results' => falseサーバーがMemcachedなどの永続的なキャッシュを使用していない場合は、1回限りのクエリで設定します。1回限りのクエリは、「少量のデータを表示するために使用されるクエリです。現在の投稿に関連するリンクされた投稿のタイトルを表示したい場合や、選択する投稿のドロップダウンを表示したい場合があります特定のオプション設定。」

    彼の例: $query = get_posts( array( 'posts_per_page' => 1, 'cache_results' => false ) );

  • 'no_found_rows' => trueページネーションが不要な場所を設定します。これにより、「MySQLをバイパスして結果をカウントし、ページネーションが必要かどうかを確認します」。

    彼の例: $query = new WP_Query( array( 'posts_per_page' => 1, 'no_found_rows' => true ) );

  • これはあなたが必要とするすべてである場合にのみ、ポストIDのクエリ'fields' => 'ids'get_posts。これにより、返されるデータの量が大幅に削減されます。 データベースの説明«WordPress Codex

    彼の例: $query = get_posts( array( 'posts_per_page' => 1, 'fields' => 'ids' ) );

最後のヒントに加えて、get_post_fieldを使用して1つまたはいくつかの投稿フィールドのみが必要な場合にも同じ推論を適用できます。

クエリがどのように機能するかをしっかりと理解することが不可欠です。クエリをより具体的にすればするほど、SQLデータベースに要求される作業が少なくなります。これは、データベースクエリを管理するための非常に多くの可能性があることを意味します。カスタムクエリを実行する場所(管理ページですか?)に注意し、直接クエリで適切なサニタイズを使用し、同じパフォーマンスを実現できるネイティブのWordPress機能を使用してみてください。


2
優秀で非常に役立つ答え、ありがとう!
エレミヤプラマー

テーマは完全にカスタム構築されているため、文字通り、絶対に不可欠な項目のみを照会しています。しかし、これらは非常に役立ちます。これを踏まえて、クエリに戻って変更を加えます。;)
エレミヤプラマー14年

1
メタクエリは可能な限り避けるべきだと付け加えます。確かに、2つのメタフィールドに対して同時にクエリを実行しないでください。これにより、ダブルおよびトリプルクエリが発生し、すぐにパフォーマンスが低下します。多くの場合、カスタム投稿タイプがこれに役立ちます。
チャールズジェイメット

3

私も追加します:

    'no_found_rows'          => true,
    'update_post_term_cache' => false,
    'update_post_meta_cache' => false,
    'cache_results'          => false
  • no_found_rows(boolean)–ページネーションを必要とせず、見つかった投稿の総数のカウントを必要としないときにtrueにします。
  • cache_results(boolean)–投稿情報キャッシュ。
  • update_post_meta_cache(boolean)–投稿メタ情報キャッシュ。
  • update_post_term_cache(boolean)–投稿期間情報キャッシュ。

これらのパラメーターを使用し、値をFALSEとして渡すことで、実行中のいくつかの余分なデータベースクエリを停止することで、クエリを高速化できます。

注:キャッシュに物事を追加することは正しいことなので、これらのパラメーターを常に使用する必要はありませんが、これらは特定の状況で役立つ場合があり、何をしているのかを知っているときに使用することを検討する必要があります。

してください訪問: https://drujoopress.wordpress.com/2013/06/27/how-to-optimize-wordpress-query-to-get-results-faster/#more-184


1
回答を編集し、説明を追加してください:なぜそれが問題を解決できるのでしょうか?
FUXIA

この回答にコメントを追加することはできません:wordpress.stackexchange.com/a/166699/57674
rigosan

1

すべての時期尚早な最適化タイプの質問であるため、この質問は、実際に使用する場合にのみ多くの場合に発見される正確な使用パターンを知らずに実際に答えることはできません。

一般に、MYSQL仕様に従って、データ量に問題はありません。もちろん、最適なアルゴリズムを使用してもデータを検索する場合は、テーブルがはるかに小さい場合よりも遅くなりますが、その解決策は単純で強力なCPUです。

メタデータの保存方法を最適化する必要がある場合があります(ping関連データを保存しないなど)が、この種のことは正確に何を行うかによって異なり、最終的にはより強力なCPUが必要になる可能性があるため、手間をかける価値はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.