投稿のパフォーマンスに対するカスタム投稿メタフィールドの影響


10

多くのカスタム定義されたメタフィールドを持つ投稿があります。投稿では、を使用して要件についてそれらを呼び出していますget_post_meta。10メタフィールドの意味私はそれを10回使用しています。

私はそれを正しくやっていますか?つまり、上記の方法でパフォーマンスの問題はありますか。ある場合は、呼び出しの数を減らす方法を教えてください。

私はここで利用できる答えを知っています:「単一クエリ」の使用を説明するカスタムフィールドとパフォーマンス。しかし、それは明確ではないので、誰かが知っていて詳細を共有したいかどうかをもう一度尋ねます。

回答:


25

これに答えるために、私はこれに行っていくつかのテストを行いましたが、結果は実際に驚くべきものでした。

これが私のテストです

これを行うには、テストページを設定します。単にpage.phpをコピーし、名前を変更してループを削除するだけです。次に、バックエンドで新しいページを作成します。開始する前に、まず空の情報でタイマーをテストして、データのないクエリの量を取得します

テストポスト用に5つのメタフィールドを作成しました。

  • enclosure
  • First name
  • Last name
  • packages そして
  • post_views_count

テスト投稿のIDはでした530。投稿内では、$post->IDまたはget_the_ID()を使用して、投稿IDを設定できます。

だから私の最初のテストは次のとおりでした:

<?php               
       timer_start();       

       $a = get_post_meta(530, 'enclosure', true);
       $b = get_post_meta(530, 'First name', true);
       $c = get_post_meta(530, 'Last name', true);
       $d = get_post_meta(530, 'packages', true);
       $e = get_post_meta(530, 'post_views_count', true);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

次の結果が得られました

0.00195秒で1クエリ。

私の2番目のテストは次のとおりです。

<?php               
       timer_start();       

       $a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

意外にも同じ結果が得られました

0.00195秒で1クエリ。

ソースコードget_post_meta()見ると、それget_post_meta()は単にのラッパーにすぎないことがわかりますget_metadata()。だから、これはあなたが見る必要があったのです。のソースコードget_metadata()見ると、メタデータがキャッシュされていることがわかります。

どちらを使用するか、そしてパフォーマンスについてのあなたの質問では、答えはあなた次第です。あなたは結果の証拠を見てきました

私の個人的な意見では、10個のメタデータフィールド(または私の場合は5個)を取得する必要がある場合は、2番目の方法を使用します。

$a = get_post_meta(530);

書くのが速いだけでなく、コードを繰り返さないでください。ここでもう1つ注意すべき点として、2番目のアプローチは、すべてのメタフィールドを配列に保持し、非常に簡単にアクセスおよび取得できる

ちょうど例の問題として、$a私がした場合の私の出力は次のとおりですvar_dump( $a );

array(9) {
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1414838328:1"
  }
  ["_edit_last"]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  ["_custom_sidebar_per_page"]=>
  array(1) {
    [0]=>
    string(7) "default"
  }
  ["post_views_count"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["packages"]=>
  array(1) {
    [0]=>
    string(1) "0"
  }
  ["repeatable_names"]=>
  array(1) {
    [0]=>
    string(79) "a:1:{i:0;a:3:{s:4:"role";s:4:"fool";s:4:"name";s:6:"Pieter";s:3:"url";s:0:"";}}"
  }
  ["enclosure"]=>
  array(1) {
    [0]=>
    string(105) "http://localhost/wordpress/wp-content/uploads/2014/09/Nissan-Navara-Tough-City.avi
13218974
video/avi
"
  }
  ["First name"]=>
  array(1) {
    [0]=>
    string(3) "Tom"
  }
  ["Last name"]=>
  array(1) {
    [0]=>
    string(5) "Storm"
  }
}

次のように、投稿で返されたメタデータにアクセスできます。

echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";

どちらが表示されます

トムストーム


4
これは「ウォーク・ザ・トーク」と呼ばれています。素晴らしい答え。
Akhilesh

1
よろしくお願いします。うまくいきました。お楽しみください:-)
ピーター・グーセン

1
これはすごく素敵。代わりに、カスタムユーザーメタに焦点を当てた同様のテストを見たいです。
クリスティンクーパー

1
間違いなくやる価値があります;-)。私が今後数日で何ができるかを見て、今から数日を忙しくします@ChristineCooper
Pieter Goosen

1
いいね!このスレッドで私にタグ付けしてください。
クリスティンクーパー

0

を使用get_post_metaして、すべてのメタフィールド値を一度にフェッチできます。

$meta = get_post_meta( get_the_ID() );

これは、指定された投稿のすべてのメタ値をフェッチします。個別にフェッチするのではなく、その配列を使用します。


0

Pieter Goosenが述べたように、初めてメタデータを要求すると、1つの投稿のすべてのメタデータがキャッシュされます。

これは、の呼び出しにも当てはまりますWP_QueryWP_QueryWordPressはを呼び出すとすぐに、取得したすべての投稿のメタデータを1つのクエリでフェッチします。

最悪のシナリオは、get_post_meta以前にWordPressによって取得されていない個々の投稿IDを呼び出すことです。この場合、への呼び出しごとget_post_metaに1つのクエリになります。

クエリからwp_postmeta内部へのサンプルトレースWP_Query

SELECT post_id, meta_key, meta_value 
    FROM wp_postmeta 
    WHERE post_id IN (491,347) 
    ORDER BY meta_id ASC

#0 /wp-includes/wp-db.php(1567): wpdb->_do_query('SELECT post_id,...')
#1 /wp-includes/wp-db.php(1958): wpdb->query('SELECT post_id,...')
#2 /wp-includes/meta.php(814): wpdb->get_results('SELECT post_id,...', 'ARRAY_A')
#3 /wp-includes/post.php(5546): update_meta_cache('post', Array)
#4 /wp-includes/post.php(5529): update_postmeta_cache(Array)
#5 /wp-includes/query.php(3614): update_post_caches(Array, 'post', true, true)
#6 /wp-includes/query.php(3836): WP_Query->get_posts()
#7 /wp-includes/query.php(3946): WP_Query->query(Array)
#8 /wp-content/plugins/***/***.php(134): WP_Query->__construct(Array)

ご覧のように、呼び出しは内部から発生しget_posts、元のの結果である2つの投稿のメタデータを取得しますWP_Query

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