Efecto del campo meta del post personalizado en el rendimiento del post

10

Tengo las publicaciones que tienen muchos campos de metadatos definidos. En las publicaciones los llamo a requerimiento usando get_post_meta . Significa para 10 campos de meta lo estoy usando 10 veces.

¿Lo estoy haciendo bien? Significa, ¿hay algún problema de rendimiento con el método anterior y, en caso afirmativo, cómo reducir el número de llamadas?

Soy consciente de la respuesta disponible aquí: Campos personalizados y rendimiento que explica que el uso de 'sola consulta'. Pero no está claro ni sonoro, así que vuelva a preguntar si alguien sabe y quiere compartir en detalle.

    
pregunta Akhilesh 31.10.2014 - 10:47

3 respuestas

19

Para responder a esto, he ido y hecho algunas pruebas al respecto, y los resultados fueron realmente alucinantes.

Aquí está mi prueba

Para esto, configúrese con una página de prueba. Simplemente copie page.php, renómbrelo y elimine el bucle. Ahora solo crea una nueva página en el back-end. Antes de comenzar, primero pruebe su temporizador con información vacía para obtener la cantidad de consultas sin datos

He creado 5 campos de metadatos en total para una publicación de prueba,

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

Mi publicación de prueba tenía un ID de 530 . Dentro de una publicación, simplemente puedes usar $post->ID o get_the_ID() para establecer la ID de la publicación

Así que mi primera prueba fue la siguiente:

<?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 dio los siguientes resultados

  

1 consultas en 0.00195 segundos.

Mi segunda prueba fue la siguiente:

<?php               
       timer_start();       

       $a = get_post_meta(530);
?>
<p><?php echo get_num_queries(); ?> queries in <?php timer_stop(1, 5); ?> seconds. </p>

que, sorprendentemente, dio el mismo resultado

  

1 consultas en 0.00195 segundos.

Si observa el código fuente para get_post_meta() , verá que get_post_meta() es simplemente un contenedor para get_metadata() . Así que esto es donde necesitas mirar. El código fuente para get_metadata() , verá que los metadatos se almacenan en caché.

Entonces, en su pregunta sobre cuál usar y sobre el rendimiento, la respuesta será, depende de usted. Has visto la prueba en los resultados

En mi opinión personal, si necesita recuperar 10 campos de metadatos (o en mi caso 5), use el segundo enfoque en mi respuesta.

$a = get_post_meta(530);

No solo es más rápido de escribir, sino que tampoco debes repetir el código. Otro punto a tener en cuenta aquí, el segundo enfoque contiene todos los metacampos en una matriz a la que se puede acceder y recuperar muy fácilmente

Como ejemplo, aquí está mi salida de $a si hago un 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"
  }
}

Ahora puede acceder a cualquiera de los metadatos devueltos en su publicación de la siguiente manera:

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

Que se mostrará

  

Tom Storm

    
respondido por el Pieter Goosen 01.11.2014 - 11:44
0

Puedes usar get_post_meta para obtener todos los valores de los metacampos a la vez.

$meta = get_post_meta( get_the_ID() );

Esto recuperará todos los valores meta de la publicación dada. Utilice esa matriz en lugar de obtener individualmente.

    
respondido por el Nilambar 31.10.2014 - 10:58
0

Como dijo Pieter Goosen, todos los metadatos de una publicación se almacenan en caché cuando solicitas metadatos por primera vez.

Esto también es cierto para cualquier llamada a WP_Query . Tan pronto como llama a WP_Query , WordPress recupera los metadatos de todas las publicaciones recuperadas en una sola consulta.

El peor escenario es que llame a get_post_meta para las ID de publicaciones individuales que WordPress no haya recuperado antes. En este caso, cada llamada a get_post_meta resultará en una sola consulta.

Un seguimiento de muestra de una consulta a wp_postmeta dentro de un 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 puede ver, la llamada se origina dentro de get_posts y recupera los metadatos de 2 publicaciones, que es el resultado del WP_Query original.

    
respondido por el greenone83 11.02.2015 - 22:22

Lea otras preguntas en las etiquetas