Efeito personalizado de meta-campo sobre o desempenho no post

10

Eu tenho as postagens que têm muitos campos meta personalizados. Nas postagens, estou chamando-os de requisito usando get_post_meta . Meios para 10 campos de meta Eu estou usando isto 10 vezes.

Estou fazendo certo? Significa que 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 que explica que o uso de 'consulta única'. Mas não está claro e está tão perguntando novamente se alguém sabe e quer compartilhar em detalhes.

    
por Akhilesh 31.10.2014 / 10:47

3 respostas

19

Para responder a isso, fiz alguns testes sobre isso e os resultados foram realmente impressionantes.

Aqui está o meu teste

Para si mesmo, prepare-se com uma página de teste. Basta simplesmente copiar 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 nenhum dado

Eu criei 5 meta-campos para um teste,

  • enclosure ,
  • First name ,
  • Last name ,
  • packages e
  • post_views_count

Minha publicação de teste tinha um ID de 530 . Dentro de uma postagem, você pode simplesmente usar $post->ID ou get_the_ID() para definir a ID do post

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>

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.

Então, na 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 facilmente acessada e recuperada

Apenas como exemplo, aqui está minha saída de $a se eu fizer um 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"
  }
}

Agora você pode acessar qualquer um dos metadados retornados em sua postagem da seguinte forma:

echo $a['First name'][0] . " " . $a['Last name'][0] . "<br>";

Que exibirá

  

Tom Storm

    
por Pieter Goosen 01.11.2014 / 11:44
0

Você pode usar get_post_meta para buscar todos os valores de campo meta de uma só vez.

$meta = get_post_meta( get_the_ID() );

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

    
por Nilambar 31.10.2014 / 10:58
0

Como Pieter Goosen declarou, todos os metadados de um post são armazenados em cache quando você solicita metadados pela primeira vez.

Isso também é válido para qualquer chamada para WP_Query . Assim que você chamar WP_Query , o WordPress buscará os metadados de todas as postagens recuperadas em uma única consulta.

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

Um rastreamento de amostra de uma consulta para wp_postmeta dentro 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 é originária de get_posts e recupera metadados de duas postagens, que é o resultado do original WP_Query .

    
por greenone83 11.02.2015 / 22:22