Efeito de meta-campo de postagem personalizado no desempenho da postagem

10

Eu tenho as postagens que têm muitos meta campos definidos personalizados. Nas postagens, estou chamando-os por exigência usando get_post_meta. Significa 10 campos de meta. Estou usando 10 vezes.

Eu estou fazendo a coisa certa? Significa, há algum problema de desempenho com o método acima e, se sim, como reduzir o número de chamadas.

Estou ciente da resposta disponível aqui: Campos personalizados e desempenho, o que explica o uso de 'consulta única'. Mas não é claro e correto, perguntando novamente se alguém sabe e deseja compartilhar em detalhes.

Akhilesh
fonte

Respostas:

25

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->IDou 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 $ase 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

Pieter Goosen
fonte
4
Isso é chamado de 'Walk the Talk'. Resposta maravilhosa.
Akhilesh
11
O prazer é meu, que bom que funcionou para você. Aproveite :-)
Pieter Goosen
11
Isso é muito legal. Eu adoraria ver um teste semelhante focado em meta personalizadas do usuário.
Christine Cooper
11
Definitivamente vale a pena fazê-lo ;-). Vai ver o que posso fazer nos próximos dias, ter um par agitado de dias em frente agora @ChristineCooper
Pieter Goosen
11
Agradável! Por favor, marque-me neste tópico com um link, caso você acabe fazendo isso!
Christine Cooper
0

Você pode usar get_post_metapara buscar todos os valores de meta campos de uma só vez.

$meta = get_post_meta( get_the_ID() );

Isso buscará todos os meta-valores da postagem especificada. Use essa matriz em vez de buscar individualmente.

Nilambar Sharma
fonte
0

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ê liga WP_Query, o WordPress busca os metadados para todas as postagens recuperadas em uma única consulta.

O pior cenário é que você solicita get_post_metaIDs de postagem individuais que não foram recuperados pelo WordPress antes. Nesse caso, cada chamada para get_post_metaresultará em uma única consulta.

Um rastreio de amostra de uma consulta para wp_postmetadentro de um 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)

Como você pode ver, a chamada se origina de dentro get_postse recupera metadados para 2 postagens, que é o resultado do original WP_Query.

greenone83
fonte