私は多くのカスタム定義されたメタフィールドを持つ投稿をしています。投稿ではget_post_meta
を使って必要に応じてそれらを呼び出しています。私はそれを10回使っている10のメタフィールドのための手段。
私はそれを正しくやっていますか?つまり、上記の方法にパフォーマンス上の問題はありますか。その場合は、呼び出し回数を減らす方法があります。
私はここで利用可能な答えを知っています: カスタムフィールドとパフォーマンス これは '単一クエリ'の使用を説明しています。しかし、それは明確で健全ではないので、誰かが知っていて詳細に共有したいかどうかをもう一度尋ねる。
これに答えるために、私はこれについていくつかのテストを行って実行しましたが、結果は実際には気が遠くなるようなものでした。
これを自分で行うには、テストページを用意してください。単に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>";
どちらが表示されます
トムストーム
get_post_meta
を使ってすべてのメタフィールド値を一度に取得することができます。
$meta = get_post_meta( get_the_ID() );
これは与えられた投稿のすべてのメタ値を取得します。個別にフェッチする代わりにその配列を使用してください。
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
の結果です。