Niestandardowy wpływ meta pola post na wydajność posta

10

Mam posty, które mają wiele niestandardowych pól meta. Na postach dzwonię do nich na żądanie get_post_meta. Oznacza 10 pól meta. Używam go 10 razy.

Czy robię to dobrze? Oznacza, czy jest jakikolwiek problem z wydajnością powyższej metody, a jeśli tak, to w jaki sposób zmniejszyć liczbę połączeń.

Znam odpowiedź dostępną tutaj: pola niestandardowe i wydajność, która wyjaśnia, że ​​użycie „pojedynczego zapytania”. Ale nie jest to jasne i prawidłowe, więc ponownie zapytaj, czy ktoś wie i chce się szczegółowo podzielić.

Akhilesh
źródło

Odpowiedzi:

25

Aby odpowiedzieć na to pytanie, poszedłem i przeprowadziłem kilka testów, a wyniki były naprawdę oszałamiające.

Oto mój test

Aby to zrobić, skonfiguruj się ze stroną testową. Wystarczy skopiować page.php, zmienić jego nazwę i usunąć pętlę. Teraz po prostu utwórz nową stronę w zapleczu. Zanim zaczniesz, najpierw przetestuj licznik czasu z pustymi informacjami, aby uzyskać liczbę zapytań bez żadnych danych

Utworzyłem łącznie 5 pól meta dla stanowiska testowego,

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

Mój post testowy miał identyfikator 530. Wewnątrz posta możesz po prostu użyć $post->IDlub get_the_ID()ustawić identyfikator posta

Mój pierwszy test był następujący:

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

co dało mi następujące wyniki

1 zapytań w 0,00195 sekund.

Mój drugi test był następujący:

<?php               
       timer_start();       

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

co zaskakująco dało ten sam wynik

1 zapytań w 0,00195 sekund.

Jeśli spojrzeć na kod źródłowy dla get_post_meta()zobaczysz, że get_post_meta()jest po prostu tylko dla wrapper get_metadata(). Więc to jest to, gdzie musisz spojrzeć. Kod źródłowy dla get_metadata()zobaczysz, że metadane uzyskać buforowane.

Więc na twoje pytanie dotyczące tego, którego użyć i na temat wydajności, odpowiedź brzmi: to zależy od ciebie. Widziałeś dowód w wynikach

Moim osobistym zdaniem, jeśli chcesz pobrać 10 pól metadanych (lub w moim przypadku 5), zastosuj drugie podejście w mojej odpowiedzi.

$a = get_post_meta(530);

Pisanie jest nie tylko szybsze, ale również nie powinieneś powtarzać kodu. Należy również zwrócić uwagę na to, że drugie podejście zawiera wszystkie pola meta w tablicy, do których można bardzo łatwo uzyskać dostęp

Na przykład, oto mój wynik z, $ajeśli zrobię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"
  }
}

Możesz teraz uzyskać dostęp do dowolnych zwróconych metadanych w swoim poście w następujący sposób:

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

Który wyświetli się

Tom Storm

Pieter Goosen
źródło
4
Nazywa się to „Walk the Talk”. Cudowna odpowiedź.
Akhilesh
1
Cała przyjemność po mojej stronie, cieszę się, że ci się udało. Ciesz się :-)
Pieter Goosen
1
To jest bardzo miłe. Chciałbym zobaczyć podobny test koncentrujący się na niestandardowych meta użytkownika.
Christine Cooper
1
Zdecydowanie warto to zrobić ;-). Zobaczę, co mogę zrobić w ciągu kilku najbliższych dni, męczę się kilka dni przed @ @ ChristineCooper
Pieter Goosen
1
Miły! Proszę otaguj mnie w tym wątku linkiem na wypadek, gdybyś to zrobił!
Christine Cooper
0

Możesz użyć, get_post_metaaby pobrać wszystkie wartości pól meta naraz.

$meta = get_post_meta( get_the_ID() );

Spowoduje to pobranie wszystkich meta wartości danego postu. Użyj tej tablicy zamiast pobierania pojedynczo.

Nilambar Sharma
źródło
0

Jak stwierdził Pieter Goosen, wszystkie metadane dla jednego postu są buforowane, gdy żądasz metadanych po raz pierwszy.

Dotyczy to również wszelkich połączeń z WP_Query. Jak tylko zadzwonisz WP_Query, WordPress pobiera metadane dla wszystkich pobranych postów w jednym zapytaniu.

Najgorszym scenariuszem jest to, że dzwonisz get_post_metapo indywidualne identyfikatory postów, które nie były wcześniej pobierane przez WordPress. W takim przypadku każde wywołanie do get_post_metaspowoduje pojedyncze zapytanie.

Przykładowy ślad z zapytania do wp_postmetawewnątrz 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)

Jak widać, połączenie pochodzi z wewnątrz get_postsi pobiera metadane dla 2 postów, co jest wynikiem oryginału WP_Query.

greenone83
źródło