今日、WordPressは インターネットの33% 。使いやすく、非常に人気があり、すぐにどこにも行かないでしょう。
しかし、Wordpressは遅くなる可能性があります。では、どのように最適化するのでしょうか。
httpライブストリーミング.tsファイルをダウンロードしてマージします
WordPressを最適化する方法についての記事はたくさんあります。実際、WordPress自体が 堅牢なガイド 最適化する方法。
ほとんどの場合、これらの記事とチュートリアルは、かなり基本的でありながら有用な概念をカバーしています。これは、キャッシングプラグインの使用、コンテンツ配信ネットワーク(CDN)との統合、および要求の最小化です。これらのヒントは非常に効果的で必要ですが、根本的な問題には対処していません。ほとんどの遅いWordpressサイトは、不十分または非効率的なコーディングの結果です。
したがって、この記事は主に開発者と Wordpress開発会社 多くのWordPressパフォーマンス問題の根本的な原因に対処するのに役立ついくつかのガイドライン。
WordPressは、開発者が見落としがちなパフォーマンス指向の機能を数多く提供しています。これらの機能を利用できないコードは、ジョブの取得などの最も単純なタスクの速度を低下させる可能性があります。この記事では、WordPressのパフォーマンスの低下の背後にある根本的な問題のいくつかに対処する4つの可能な解決策について詳しく説明します。
WordPressは、データベース内の任意のタイプの位置を検索する可能性を提供します。それを行うには3つの基本的な方法があります。
'query_posts()'関数の使用: これは非常に簡単なアプローチですが、問題はクエリを上書きすることです 主要な ご不便をおかけします。たとえば、投稿を取得した後のある時点で( 'footer.php'内のように)処理しているページのタイプを判別したい場合、これは問題になる可能性があります。実際、元のクエリを復元するには追加の関数を呼び出す必要があるため、公式ドキュメントにはこの関数の使用に対する推奨事項があります。また、メインクエリを置き換えると、ページの読み込み時間に悪影響があります。
'get_posts()'関数の使用: これは「query_posts()」とほぼ同じように機能しますが、メインクエリは変更されません。一方、「obtain_posts()」はデフォルトで「delete_files」へのクエリを実行し、パラメータは「true」に設定されています。これは、特にコードでクエリ関連のフィルターを使用する場合、ページに予期しない投稿がこの関数によって返される可能性があるため、不整合につながる可能性があります。
'WP_query'クラスの使用: 私の意見では、これはデータベースから投稿を取得するための最良の方法です。メインクエリを変更せず、他のWordPressクエリと同じように標準形式で実行されます。
しかし、データベースとの対話に使用する方法が何であれ、考慮すべきことが他にもあります。
クエリがもたらす投稿の数を常に指定する必要があります。
これを行うには、「ページあたりの投稿数」パラメータを使用します。
WordPressでは、そのパラメーターの可能な値として-1を指定できます。この場合、システムは、定義された条件を満たすすべてのメッセージを取得しようとします。
答えとして得られる結果が少ないと確信している場合でも、これは良い習慣ではありません。
一つには、結果を再び得ることはめったに真実ではありません。また、制限を設定できる場合でも、データベースエンジンがデータベース全体を解析して一致するかどうかを確認する必要があります。
対照的に、結果を制限すると、データベースエンジンがデータを部分的にしか分析できないことがよくあります。これは、処理時間の短縮と応答の高速化につながります。
WordPressがデフォルトで行うもう1つのことは、スティッキーな投稿を取得してクエリ内の行数を計算しようとするため、パフォーマンスに悪影響を与える可能性があることです。
ただし、その情報はそれほど頻繁には必要ありません。これらの2つのパラメーターの追加は、これらの機能を無効にし、クエリを高速化することです。
$query = new WP_Query( array( 'ignore_sticky_posts' => true, 'no_found_rows' => true ) );
特定の投稿をクエリから除外したい場合があります。 WordPressは、これを行うための素晴らしく簡単な方法を提供します: 'post__no_en'パラメーターを使用します。例えば:
$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__no_en」パラメータを削除しました。
クエリによって不要な投稿が表示される可能性があるため、「posts_per_page」のパラメータを増やしました。これにより、応答に不要な投稿があった場合でも、次の場所に移動したいと思うようになります。少なくとも「$ posts_per_pagedesired」をそこに置いてください。
したがって、投稿を探して、「$ posts_para_exclude」配列内にないものだけを処理する場合。
これらすべて クエリメソッド カテゴリ別、メタキーまたは値別、日付別、作成者別など、ポジションを取得するためのさまざまな可能性を提供します。
柔軟性は非常に強力な機能であるため、複雑なテーブル結合のパラメータ化やコストのかかるデータベース操作が発生する可能性があるため、注意して使用する必要があります。
次のセクションでは、パフォーマンスを犠牲にすることなく同様の機能を実現する方法をエレガントに概説します。
オプション WordPress 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;
機能は例ごとにわずかに異なります。
コードの最初の部分では、投稿の公開日に関して、常に最新のニュースを取得します。
第二に、新しい投稿が最新ニュースとして確立されるたびに、それは前のニュースに上書きされます。
しかし、おそらく一度に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にはネイティブにキャッシュメカニズムがあります オブジェクト 。
たとえば、オプションはそのメカニズムを使用してキャッシュされます。
ただし、デフォルトでは、キャッシュは永続的ではありません。つまり、キャッシュは1回のリクエストの間だけ存続します。アクセスを高速化するために、すべてのデータがキャッシュされますが、そのリクエスト中にのみ利用できます。
永続キャッシュのサポートには、永続キャッシュプラグインのインストールが必要です。
一部のフルページキャッシュプラグインには永続キャッシュプラグインが含まれていますが(W3 Total Cacheなど)、含まれていないため、個別にインストールする必要があります。
Memcacheなどのファイルやその他のメカニズムを使用してデータをキャッシュに保存する場合は、プラットフォームのアーキテクチャによって異なります。この驚くべき機能を利用する必要があります。
「これが優れたWordPress機能である場合、デフォルトで有効になっていないのはなぜですか?」と自問するかもしれません。
主な理由は、プラットフォームのアーキテクチャによっては、一部のキャッシュ手法が機能する場合と機能しない場合があるためです。
たとえば、サイトで分散サーバーをホストする場合は、外部キャッシュシステム( Memcachedサーバー )しかし、私たちのウェブサイトが単一のサーバー上にある場合、私たちはお金を節約し、キャッシュファイルシステムを使用することができます。
考慮しなければならないことの1つは、キャッシュの有効期限です。これは、永続キャッシュを使用する際の最も一般的な落とし穴です。
これに適切に対処しないと、ユーザーは、行った変更を確認できない、または変更を適用するのに時間がかかりすぎると不満を言うでしょう。
パフォーマンスとダイナミズムのバランスが取れていることに気付くことがありますが、これらのハードルがあっても、永続的なキャッシュは事実上すべてのWordPressインストールで利用する必要があります。
メモリリークがあるかどうかを見分ける方法
AJAXを介して当社のWebサイトであるWordPressと通信する必要がある場合 いくつかの抽象化を提供します サーバーでリクエストを処理するとき。
これらの手法は、バックエンドツールプログラミングまたはフロントエンドフォーム送信で使用できますが、厳密に必要でない場合は避ける必要があります。
これは、これらのメカニズムを使用するために、「wp-admin」フォルダー内にあるファイルにPOSTリクエストを送信する必要があるためです。ほとんどの(すべてではないにしても)Wordpressプラグインには、フルページキャッシュもPOSTリクエストキャッシュもファイルマネージャー呼び出しもありません。
たとえば、ユーザーがホームページに移動したときに投稿をより動的に読み込む必要がある場合は、他のフロントエンドページを直接呼び出すと、キャッシュされるというメリットが得られます。
次に、ブラウザのJavaScriptを介して結果を解析できます。
はい、必要以上のデータを送信していますが、処理速度と応答時間の点で勝っています。
これらは、開発者がコーディングするときに考慮すべきいくつかのヒントです。 WordPress 。
プラグインやテーマが他のプラグインと共存するために必要であること、または共通のデータベースで数百または数千の他のサイトにサービスを提供するホスティング会社が当社のWebサイトにサービスを提供できることを忘れることがあります。
プラグインがどのように機能するかではなく、プラグインがその機能をどのように処理するか、またはプラグインでそれを行う方法に焦点を当てました。 効果的 。
前に説明したことにより、WordPressのパフォーマンスが低下する原因は、コードが悪く非効率的であることは明らかです。ただし、WordPressは、さまざまなAPIを通じて必要なすべての機能を提供し、多くの機能を構築するのに役立ちます。 プラス プラットフォームの全体的な速度を損なうことなく、開発プラグインとテーマ。