Para responder a isso, fiz alguns testes e os resultados foram realmente impressionantes.
Aqui está o meu teste
Para isso, configure-se com uma página de teste. Basta copiar o page.php, renomeá-lo e excluir o loop. Agora, basta criar uma nova página no back-end. Antes de começar, primeiro teste seu cronômetro com informações vazias para obter a quantidade de consultas sem dados
Eu criei 5 campos meta para um post de teste,
enclosure
,
First name
,
Last name
,
packages
e
post_views_count
Meu post de teste tinha um ID de 530
. Dentro de uma postagem, você pode simplesmente usar $post->ID
ou get_the_ID()
definir o ID da postagem
Então, meu primeiro teste foi o seguinte:
<?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>
o que me deu os seguintes resultados
1 consultas em 0,00195 segundos.
Meu segundo teste foi o seguinte:
<?php
timer_start();
$a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>
que, surpreendentemente, deu o mesmo resultado
1 consultas em 0,00195 segundos.
Se você olhar para o código-fonte para get_post_meta()
, você verá que get_post_meta()
é simplesmente um invólucro para get_metadata()
. Então é isso que você precisa olhar. O código-fonte para get_metadata()
, você verá que os metadados são armazenados em cache.
Portanto, em sua pergunta sobre qual usar e sobre o desempenho, a resposta será: depende de você. Você viu a prova nos resultados
Na minha opinião pessoal, se você precisar recuperar 10 campos de metadados (ou no meu caso 5), use a segunda abordagem na minha resposta.
$a = get_post_meta(530);
Não é apenas mais rápido escrever, mas você também não deve repetir o código. Outro ponto a ser observado aqui, a segunda abordagem contém todos os meta-campos em uma matriz que pode ser acessada e recuperada com muita facilidade
Como exemplo, aqui está minha saída $a
se eu fizer umavar_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"
}
}
Agora você pode acessar qualquer um dos metadados retornados em sua postagem da seguinte maneira:
echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";
Qual exibirá
Tom Storm
Você pode usar
get_post_meta
para buscar todos os valores de meta campos de uma só vez.Isso buscará todos os meta-valores da postagem especificada. Use essa matriz em vez de buscar individualmente.
fonte
Como Pieter Goosen afirmou, todos os metadados de uma postagem são armazenados em cache quando você solicita metadados pela primeira vez.
Isso também é válido para todas as chamadas para
WP_Query
. Assim que você ligaWP_Query
, o WordPress busca os metadados para todas as postagens recuperadas em uma única consulta.O pior cenário é que você solicita
get_post_meta
IDs de postagem individuais que não foram recuperados pelo WordPress antes. Nesse caso, cada chamada paraget_post_meta
resultará em uma única consulta.Um rastreio de amostra de uma consulta para
wp_postmeta
dentro de umWP_Query
:Como você pode ver, a chamada se origina de dentro
get_posts
e recupera metadados para 2 postagens, que é o resultado do originalWP_Query
.fonte