web-dev-qa-db-ja.com

投稿の掲載結果に対するカスタム投稿メタフィールドの効果

私は多くのカスタム定義されたメタフィールドを持つ投稿をしています。投稿ではget_post_metaを使って必要に応じてそれらを呼び出しています。私はそれを10回使っている10のメタフィールドのための手段。

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

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

10
Akhilesh

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

これが私のテストです

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

テスト投稿用に全部で5つのメタフィールドを作成しました。

  • Enclosure
  • First name
  • Last name
  • packages
  • post_views_count

私のテスト記事は530のIDを持っていました。投稿内では、投稿IDを設定するために$post->IDまたはget_the_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()のラッパーにすぎないことがわかります。だからこれはあなたが見る必要があるということです。 ソースコード for get_metadata() には、メタデータがキャッシュされることがわかります。

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

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

$a = get_post_meta(530);

記述するのが速いだけでなく、コードを繰り返すべきでもありません。もう1つ注意が必要なのは、2番目の方法ではすべてのメタフィールドを配列に保持しているため、アクセスや取得が非常に簡単にできることです。

例の問題として、var_dump( $a );を実行した場合の$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>";

どちらが表示されます

トムストーム

22
Pieter Goosen

get_post_metaを使ってすべてのメタフィールド値を一度に取得することができます。

$meta = get_post_meta( get_the_ID() );

これは与えられた投稿のすべてのメタ値を取得します。個別にフェッチする代わりにその配列を使用してください。

0
Nilambar

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

これはWP_Queryの呼び出しにも当てはまります。 WP_Queryを呼び出すとすぐに、WordPressは検索されたすべての投稿のメタデータを単一のクエリで取得します。

最悪の場合のシナリオは、あなたが以前にWordPressによって検索されたことがない個々の投稿IDに対してget_post_metaを呼び出すことです。この場合、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の結果です。

0
greenone83