Effetto meta campo post personalizzato sulle prestazioni sul post


10

Ho i post che hanno molti metacampi personalizzati. Sui post li sto chiamando su richiesta utilizzando get_post_meta. Mezzi per 10 meta campi Lo sto usando 10 volte.

Lo sto facendo bene? Significa, c'è qualche problema di prestazioni con il metodo sopra e se sì, allora come ridurre il numero di chiamate.

Sono a conoscenza della risposta disponibile qui: campi personalizzati e prestazioni che spiegano l'uso di "query singola". Ma non è chiaro e sano, quindi chiedere di nuovo se qualcuno sa e vuole condividere in dettaglio.

Risposte:


25

Per rispondere a questo, sono andato e ho fatto alcuni test su questo, e i risultati sono stati davvero strabilianti.

Ecco il mio test

A te stesso, imposta una pagina di prova. Basta semplicemente copiare page.php, rinominarlo ed eliminare il loop. Ora crea una nuova pagina nel back-end. Prima di iniziare, prova il timer con informazioni vuote per ottenere la quantità di query senza dati

Ho creato 5 metacampi per un post di prova,

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

Il mio post di prova aveva un ID di 530. All'interno di un post puoi semplicemente usare $post->IDo get_the_ID()impostare l'ID del post

Quindi il mio primo test è stato il seguente:

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

che mi ha dato i seguenti risultati

1 query in 0,00195 secondi.

Il mio secondo test è stato il seguente:

<?php               
       timer_start();       

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

che, sorprendentemente, ha dato lo stesso risultato

1 query in 0,00195 secondi.

Se guardi il codice sorgente di get_post_meta(), vedrai che get_post_meta()è semplicemente un wrapper per get_metadata(). Quindi questo è dove devi guardare. Il codice sorgente per get_metadata(), vedrai che i metadati vengono memorizzati nella cache.

Quindi sulla tua domanda su quale utilizzare e sulle prestazioni, la risposta sarà, dipende da te. Hai visto la prova nei risultati

Secondo la mia opinione personale, se hai bisogno di recuperare 10 campi di metadati (o nel mio caso 5), usa il secondo approccio nella mia risposta.

$a = get_post_meta(530);

Non è solo più veloce da scrivere, ma non dovresti ripetere il codice. Un altro punto da notare qui, il secondo approccio contiene tutti i metacampi in un array a cui è possibile accedere e recuperare facilmente

Proprio come esempio, ecco il mio output da $ase faccio 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"
  }
}

Ora puoi accedere a uno qualsiasi dei metadati restituiti nel tuo post come segue:

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

Quale verrà visualizzato

Tom Storm


4
Questo si chiama 'Walk the Talk'. Risposta meravigliosa
Akhilesh,

1
Piacere mio, felice che abbia funzionato per te. Buon divertimento :-)
Pieter Goosen

1
Questo è molto carino. Mi piacerebbe invece vedere un test simile incentrato sulle meta degli utenti personalizzati.
Christine Cooper

1
Sicuramente vale la pena farlo ;-). Vedrò cosa posso fare nei prossimi giorni, avrò un paio di giorni frenetici in anticipo ora @ChristineCooper
Pieter Goosen

1
Bello! Per favore taggami su questo thread con un link nel caso finissi per farlo!
Christine Cooper

0

È possibile utilizzare get_post_metaper recuperare tutti i valori del meta campo contemporaneamente.

$meta = get_post_meta( get_the_ID() );

In questo modo verranno recuperati tutti i meta valori del post specificato. Usa quell'array invece di recuperarlo singolarmente.


0

Come affermato da Pieter Goosen, tutti i metadati per un post vengono memorizzati nella cache quando si richiedono metadati per la prima volta.

Questo vale anche per qualsiasi chiamata a WP_Query. Non appena chiami WP_Query, WordPress recupera i metadati per tutti i post recuperati in una singola query.

Lo scenario peggiore è che si richiedono get_post_metasingoli ID post che non sono stati recuperati da WordPress in precedenza. In questo caso, ogni chiamata a get_post_metasi tradurrà in una singola query.

Una traccia di esempio da una query wp_postmetaall'interno di 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)

Come puoi vedere, la chiamata proviene dall'interno get_postse recupera i metadati per 2 post, che è il risultato dell'originale WP_Query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.