Чтобы ответить на это, я пошел и сделал несколько тестов по этому вопросу, и результаты на самом деле было ошеломляющим.
Вот мой тест
Для этого сами создайте себе тестовую страницу. Просто скопируйте page.php, переименуйте его и удалите цикл. Теперь просто создайте новую страницу в конце. Прежде чем начать, сначала проверьте ваш таймер с пустой информацией, чтобы получить количество запросов без каких-либо данных
Я создал 5 мета-полей для тестового поста,
enclosure
,
First name
,
Last name
,
packages
и
post_views_count
Мой тестовый пост имел идентификационный номер 530
. Внутри сообщения вы можете просто использовать $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>
который дал мне следующие результаты
1 запрос за 0.00195 секунд.
Мой второй тест был следующим:
<?php
timer_start();
$a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>
что неожиданно дало тот же результат
1 запрос за 0.00195 секунд.
Если вы посмотрите на исходный код для get_post_meta()
, вы увидите, что get_post_meta()
это просто оболочка для get_metadata()
. Так что это, где вы должны посмотреть. Исходный код для get_metadata()
, вы увидите , что метаданные кэшироваться.
Так что на ваш вопрос о том, что использовать и о производительности, ответ будет, это зависит от вас. Вы видели доказательство в результатах
По моему личному мнению, если вам нужно получить 10 полей метаданных (или в моем случае 5), используйте второй подход в моем ответе.
$a = get_post_meta(530);
Это не только быстрее писать, но вы также не должны повторять код. Еще один момент, на который следует обратить внимание: второй подход содержит все мета-поля в массиве, к которым очень легко получить доступ и получить
Как пример, вот мой вывод, $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>";
Который будет отображать
Том Сторм
Вы можете использовать,
get_post_meta
чтобы получить все значения метаполя одновременно.Это извлечет все мета значения данного поста. Используйте этот массив вместо выборки по отдельности.
источник
Как заявил Питер Гусен, все метаданные для одного поста кэшируются при первом запросе метаданных.
Это также верно для любых звонков
WP_Query
. Как только вы позвонитеWP_Query
, WordPress извлекает метаданные для всех полученных сообщений в одном запросе.В худшем случае вы вызываете
get_post_meta
отдельные идентификаторы постов, которые не были извлечены WordPress ранее. В этом случае каждый вызовget_post_meta
приведет к одному запросу.Образец след от запроса к
wp_postmeta
внутриWP_Query
:Как видите, вызов происходит изнутри
get_posts
и извлекает метаданные для 2 сообщений, что является результатом оригиналаWP_Query
.источник