Efecto de campo de meta personalizado en el rendimiento de la publicación

10

Tengo las publicaciones que tienen muchos metacampos definidos personalizados. En las publicaciones los llamo a requerimiento usando get_post_meta. Significa 10 metacampos. 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 explican el uso de 'consulta única'. Pero no es claro y sólido, así que pregunta de nuevo si alguien sabe y quiere compartir en detalle.

Akhilesh
fuente

Respuestas:

24

Para responder a esto, fui y realicé algunas pruebas al respecto, y los resultados fueron realmente alucinantes.

Aqui esta mi prueba

Para esto, prepárese con una página de prueba. Simplemente copie page.php, cámbiele el nombre 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 ningún dato

He creado 5 metacampos 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 una identificación de 530. Dentro de una publicación, simplemente puede usar $post->IDo get_the_ID()configurar la ID de la publicación

Entonces 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>

lo 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 nos fijamos en el código fuente para get_post_meta(), verá que get_post_meta()es simplemente un contenedor para get_metadata(). Así que aquí es donde debes mirar. El código fuente de 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 escribir, sino que tampoco debe 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 fácilmente

Solo como ejemplo, aquí está mi salida de $asi hago unvar_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 mostrará

Tom Storm

Pieter Goosen
fuente
44
Esto se llama 'Walk the Talk'. Maravillosa respuesta.
Akhilesh
1
Un placer, me alegro de que te haya funcionado. Disfruta :-)
Pieter Goosen el
1
Esto esta muy bien. Me encantaría ver una prueba similar centrada en meta de usuario personalizado en su lugar.
Christine Cooper
1
Definitivamente vale la pena hacerlo ;-). Veré lo que puedo hacer en los próximos días, tengo un par de días agitados por delante ahora @ChristineCooper
Pieter Goosen
1
¡Agradable! ¡Por favor, etiquétame en este hilo con un enlace en caso de que termines haciéndolo!
Christine Cooper
0

Puede usar get_post_metapara buscar todos los valores de metacampo a la vez.

$meta = get_post_meta( get_the_ID() );

Esto obtendrá todos los meta valores de la publicación dada. Use esa matriz en lugar de buscar individualmente.

Nilambar Sharma
fuente
0

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

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

El peor de los casos es que get_post_metasolicite ID de publicaciones individuales que WordPress no haya recuperado antes. En este caso, cada llamada a get_post_metadará como resultado una sola consulta.

Una traza de muestra desde una consulta hasta wp_postmetadentro de 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 desde dentro get_postsy recupera metadatos para 2 publicaciones, que es el resultado del original WP_Query.

greenone83
fuente