今日、WordPressの力 インターネットの30%以上 。使いやすく、信じられないほど人気があり、すぐにどこにも行きません。
しかし、WordPressは遅くなる可能性があります。では、どのように最適化するのでしょうか。
WordPressを調整して最適化する方法についての記事はたくさんあります。実際、WordPress自体が 堅牢なガイド WordPressの最適化について。
ほとんどの場合、これらの記事とチュートリアルでは、キャッシュプラグインの使用、コンテンツ配信ネットワーク(CDN)との統合、リクエストの最小化など、非常に基本的でありながら便利な概念について説明しています。これらのヒントは非常に効果的で必要ですが、最終的には根本的な問題に対処していません。ほとんどの遅いWordPressサイトは、悪いコードまたは非効率的なコードの結果です。
したがって、この記事は主に開発者と WordPress開発会社 多くのWordPressパフォーマンス問題の根本的な原因に対処するのに役立ついくつかのガイドラインがあります。
WordPressは、開発者が見落としがちなパフォーマンス指向の機能を数多く提供します。これらの機能を利用しないコードは、投稿の取得などの最も単純なタスクの速度を低下させる可能性があります。この記事では、WordPressのパフォーマンスの低下の背後にある根本的な問題のいくつかに対処する4つの可能な解決策について詳しく説明します。
WordPressは、データベースからあらゆる種類の投稿をフェッチする可能性を提供します。これを行うには、3つの基本的な方法があります。
query_posts()
を使用する関数: これは非常に直接的なアプローチですが、問題はメインをオーバーライドすることです クエリ 、不便につながる可能性があります。たとえば、投稿をフェッチした後のある時点(footer.php
内など)で、処理しているページの種類を判別したい場合、これは問題になる可能性があります。実際、公式ドキュメントには、元のクエリを復元するために追加の関数を呼び出す必要があるため、この関数の使用を推奨しないメモがあります。さらに、メインクエリを置き換えると、ページの読み込み時間に悪影響を及ぼします。
get_posts()
を使用する関数: これはquery_posts()
とほぼ同じように機能しますが、メインクエリは変更されません。一方、get_posts()
デフォルトでは、suppress_filters
を使用してクエリを実行しますパラメータをtrue
に設定します。これにより、特にコードでクエリ関連のフィルターを使用する場合、ページで予期しない投稿がこの関数によって返される可能性があるため、不整合が発生する可能性があります。
WP_Query
を使用するクラス: 私の意見では、これはデータベースから投稿を取得するための最良の方法です。メインクエリは変更されず、他のWordPressクエリと同じように標準的な方法で実行されます。
しかし、データベースとの対話にどの方法を使用する場合でも、考慮しなければならないことが他にもあります。
クエリがフェッチする必要のある投稿の数を常に指定する必要があります。
これを実現するために、posts_per_page
を使用しますパラメータ。
WordPressでは、そのパラメーターの可能な値として-1を指定できます。この場合、システムは、定義された条件を満たすすべての投稿をフェッチしようとします。
応答として返される結果がわずかであると確信している場合でも、これは良い習慣ではありません。
諮問委員会の設置方法
一つには、ほんの少しの結果しか得られないと確信できることはめったにありません。また、可能であっても、制限を設定しない場合、データベースエンジンはデータベース全体をスキャンして一致するものを探す必要があります。
逆に、結果を制限すると、データベースエンジンがデータを部分的にしかスキャンできないことがよくあります。これは、処理時間の短縮と応答の高速化につながります。
WordPressがデフォルトで行うもう1つのことは、パフォーマンスに悪影響を与える可能性があり、スティッキーな投稿を取得して、クエリで見つかった行数を計算しようとすることです。
ただし、多くの場合、その情報は実際には必要ありません。これらの2つのパラメーターを追加すると、これらの機能が無効になり、クエリが高速化されます。
$query = new WP_Query( array( 'ignore_sticky_posts' => true, 'no_found_rows' => true ) );
特定の投稿をクエリから除外したい場合があります。 WordPressはそれを達成するためのかなり直接的な方法を提供します:post__not_in
を使用するパラメータ。例えば:
$posts_to_exclude = array( 1, 2, 3 ); $posts_per_page = 10; $query = new WP_Query( array( 'posts_per_page' => $posts_per_page, 'post__not_in' => $posts_to_exclude ) ); for ( $i = 0; $i posts ); $i++ ) { //do stuff with $query->posts[ $i ] }
ただし、これは非常に単純ですが、内部的にサブクエリを生成するため、最適ではありません。特に大規模なインストールでは、これにより応答が遅くなる可能性があります。いくつかの簡単な変更を加えるだけで、PHPインタープリターによってその処理を実行できるようにする方が高速です。
$posts_to_exclude = array( 1, 2, 3 ); $posts_per_page = 10; $query = new WP_Query( array( 'posts_per_page' => $posts_per_page + count( $posts_to_exclude ) ) ); for ( $i = 0; $i posts ) && $i posts[ $i ]->ID, $posts_to_exclude ) ) { //do stuff with $query->posts[ $i ] } }
私はそこで何をしましたか?
基本的に、私はデータベースエンジンからいくつかの作業を取り除き、代わりにPHPエンジンに任せました。これは、同じことを実行しますが、メモリ内で実行する方がはるかに高速です。
どうやって?
まず、post__not_in
を削除しましたクエリからのパラメータ。
クエリによって、結果として不要な投稿が表示される可能性があるため、posts_per_page
を増やしました。パラメータ。そうすることで、返信に不要な投稿があったとしても、少なくとも$posts_per_page
が表示されるようにします。そこに希望の投稿。
次に、投稿をループすると、$posts_to_exclude
内にない投稿のみが処理されます。アレイ。
これらすべて クエリメソッド カテゴリ別、メタキーまたは値別、日付別、作成者別など、投稿を取得するためのさまざまな可能性を提供します。
その柔軟性は強力な機能ですが、パラメータ化は複雑なテーブル結合やコストのかかるデータベース操作につながる可能性があるため、注意して使用する必要があります。
次のセクションでは、パフォーマンスを損なうことなく同様の機能を実現するためのエレガントな方法の概要を説明します。
ザ・ WordPressオプションAPI データを簡単にロードまたは保存するための一連のツールを提供します。 WordPressが提供する他のメカニズム(投稿や分類法など)が非常に複雑な小さな情報を処理する場合に便利です。
たとえば、認証キーやサイトのヘッダーの背景色を保存する場合、オプションが必要です。
WordPressはそれらを処理する機能を提供するだけでなく、最も効率的な方法でそれを実行することも可能にします。
一部のオプションは、 システムが起動します 、したがって、より高速なアクセスが提供されます(新しいオプションを作成するときは、自動ロードするかどうかを検討する必要があります)。
たとえば、バックエンドで指定された最新ニュースを表示するカルーセルがあるサイトについて考えてみます。私たちの最初の本能は、次のようにそのためのメタキーを使用することです。
// functions.php add_action( 'save_post', function ( $post_id ) { // For simplicity, we do not include all the required validation before saving // the meta key: checking nonces, checking post type and status, checking // it is not a revision or an autosaving, etc. update_post_meta( $post_id, 'is_breaking_news', ! empty ( $_POST['is_breaking_news'] ) ); } ); // front-page.php $query = new WP_Query( array( 'posts_per_page' => 1, 'meta_key' => 'is_breaking_news' ) ); $breaking_news = $query->posts[0] ?: NULL;
ご覧のとおり、このアプローチは非常に単純ですが、最適ではありません。特定のメタキーを持つ投稿を見つけようとするデータベースクエリを実行します。オプションを使用して、同様の結果を得ることができます。
// functions.php add_action( 'save_post', function ( $post_id ) { // Same comment for post validation if ( ! empty ( $_POST['is_breaking_news'] ) ) update_option( 'breaking_news_id', $post_id ); } ); // front-page.php if ( $breaking_news_id = get_option( 'breaking_news_id' ) ) $breaking_news = get_post( $breaking_news_id ); else $breaking_news = NULL;
機能は例ごとにわずかに異なります。
コードの最初の部分では、投稿の公開日に関して、常に最新の最新ニュースを取得します。
2つ目は、新しい投稿が最新ニュースとして設定されるたびに、以前の最新ニュースを上書きします。
しかし、おそらく一度に1つの最新ニュース投稿が必要なので、問題にはならないはずです。
そして、最終的に、重いデータベースクエリ(メタキーでWP_Query
を使用)を、より優れたパフォーマンスの高いアプローチである単純で直接的なクエリ(get_post()
を呼び出す)に変更しました。
小さな変更を加えて、オプションの代わりにトランジェントを使用することもできます。
トランジェントも同様に機能しますが、有効期限を指定できます。
たとえば、ニュース速報の場合、古い投稿をニュース速報として使用したくないので、手袋のようにフィットします。そのニュース速報を変更または削除するタスクを管理者に任せると、管理者はそれを忘れる可能性があります。それ。したがって、2つの簡単な変更で、有効期限を追加します。
// functions.php add_action( 'save_post', function ( $post_id ) { // Same comment for post validation // Let's say we want that breaking news for one hour // (3600 = # of seconds in an hour). if ( ! empty ( $_POST['is_breaking_news'] ) ) set_transient( 'breaking_news_id', $post_id, 3600 ); } ); // front-page.php if ( $breaking_news_id = get_transient( 'breaking_news_id' ) ) $breaking_news = get_post( $breaking_news_id ); else $breaking_news = NULL;
WordPressにはネイティブに オブジェクトキャッシュメカニズム 。
たとえば、オプションはそのメカニズムを使用してキャッシュされます。
ただし、デフォルトでは、そのキャッシュは永続的ではありません。つまり、単一のリクエストの期間のみ存続します。アクセスを高速化するために、すべてのデータはメモリにキャッシュされますが、そのリクエスト中にのみ使用できます。
永続キャッシュをサポートするには、永続キャッシュプラグインをインストールする必要があります。
一部のフルページキャッシュプラグインには永続キャッシュプラグインが含まれていますが(W3 Total Cacheなど)、含まれていないため、個別にインストールする必要があります。
ファイル、Memcached、またはその他のメカニズムを使用してキャッシュデータを保存するかどうかは、プラットフォームのアーキテクチャによって異なりますが、この驚くべき機能を利用する必要があります。
「これがこのような優れた機能である場合、WordPressでデフォルトで有効にされないのはなぜですか」と質問されるかもしれません。
主な理由は、プラットフォームのアーキテクチャによっては、一部のキャッシュ手法が機能する場合と機能しない場合があるためです。
たとえば、分散サーバーでサイトをホストする場合は、外部キャッシュシステムを使用する必要があります( Memcached サーバー)ですが、当社のWebサイトが単一のサーバー上にある場合は、ファイルシステムを使用してキャッシュするだけで、いくらかのお金を節約できます。
考慮する必要があることの1つは、キャッシュの有効期限です。これは、永続キャッシュを使用する際の最も一般的な落とし穴です。
この問題に正しく対処しないと、ユーザーは、自分が行った変更が表示されない、または変更を適用するのに時間がかかりすぎると不満を言うでしょう。
パフォーマンスとダイナミズムの間でトレードオフを行うこともありますが、それらの障害があっても、永続的なキャッシュは事実上すべてのWordPressインストールで利用する必要があります。
AJAXを介して当社のWebサイトであるWordPressと通信する必要がある場合 いくつかの抽象化を提供します サーバー側でリクエストを処理するとき。
これらの手法は、バックエンドツールをプログラミングしたり、フロントエンドからフォームを送信したりするときに使用できますが、厳密に必要でない場合は避ける必要があります。
これは、これらのメカニズムを使用するために、wp-admin
内にあるファイルにPOSTリクエストを送信する必要があるためです。フォルダ。 WordPressのフルページキャッシュプラグインの大部分(すべてではないにしても)は、POSTリクエストも管理者ファイルへの呼び出しもキャッシュしません。
たとえば、ユーザーがホームページをスクロールしているときに動的にさらに多くの投稿を読み込む場合は、他のフロントエンドページを直接呼び出すと、キャッシュされるというメリットが得られます。
次に、ブラウザのJavaScriptを介して結果を解析できます。
はい、必要以上のデータを送信していますが、処理速度と応答時間の点で勝っています。
これらは、開発者がコーディングするときに考慮すべきアドバイスのほんの一部です。 WordPress 。
プラグインやテーマを他のプラグインと一緒に使用する必要があることや、共通のデータベースを使用して数百または数千の他のサイトにサービスを提供するホスティング会社がサイトにサービスを提供していることを忘れることがあります。
プラグインがその機能をどのように処理するかではなく、プラグインがどのように機能するかに焦点を当てています。 効率的な方法でそれを行う方法 。
上記のことから、WordPressのパフォーマンス低下の根本的な原因は、コードが悪く非効率的であることは明らかです。ただし、WordPressは、さまざまなAPIを通じて必要なすべての機能を提供します。 はるかに高性能なプラグインとテーマを構築する プラットフォーム全体の速度を損なうことなく。