Hiệu ứng trường meta bài tùy chỉnh về hiệu suất trên bài


10

Tôi có các bài đăng có nhiều trường meta được xác định tùy chỉnh. Trên bài viết tôi đang gọi họ theo yêu cầu sử dụng get_post_meta. Có nghĩa là cho 10 trường meta tôi đang sử dụng nó 10 lần.

Tôi làm đúng không? Có nghĩa là, có bất kỳ vấn đề hiệu suất với phương pháp trên và nếu có thì làm thế nào để giảm số lượng cuộc gọi.

Tôi biết câu trả lời có sẵn ở đây: Trường tùy chỉnh và hiệu suất giải thích rằng việc sử dụng 'truy vấn duy nhất'. Nhưng nó không rõ ràng và âm thanh nên hỏi lại nếu ai đó biết và muốn chia sẻ chi tiết.

Câu trả lời:


24

Để trả lời điều này, tôi đã thực hiện một số thử nghiệm về vấn đề này và kết quả thực sự rất tuyệt vời.

Đây là bài kiểm tra của tôi

Để điều này chính mình, thiết lập cho mình với một trang thử nghiệm. Chỉ cần sao chép page.php, đổi tên nó và xóa vòng lặp. Bây giờ chỉ cần tạo một trang mới ở phía sau. Trước khi bắt đầu, trước tiên hãy kiểm tra bộ đếm thời gian của bạn với thông tin trống để có được số lượng truy vấn mà không có bất kỳ dữ liệu nào

Tôi đã tạo hoàn toàn 5 trường meta cho một bài kiểm tra,

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

Bài kiểm tra của tôi đã có một ID của 530. Trong một bài đăng, bạn chỉ cần sử dụng $post->IDhoặc get_the_ID()để đặt ID bài đăng

Vì vậy, thử nghiệm đầu tiên của tôi là như sau:

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

đã cho tôi kết quả như sau

1 truy vấn trong 0,00195 giây.

Bài kiểm tra thứ hai của tôi như sau:

<?php               
       timer_start();       

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

trong đó, đáng ngạc nhiên đã cho kết quả tương tự

1 truy vấn trong 0,00195 giây.

Nếu bạn nhìn vào các mã nguồn cho get_post_meta(), bạn sẽ thấy rằng get_post_meta()chỉ đơn giản là chỉ là một wrapper cho get_metadata(). Vì vậy, đây là bạn cần phải nhìn. Các mã nguồn cho get_metadata(), bạn sẽ thấy rằng các siêu dữ liệu được lưu trữ.

Vì vậy, về câu hỏi của bạn về việc sử dụng và về hiệu suất, câu trả lời sẽ là tùy thuộc vào bạn. Bạn đã thấy bằng chứng trong kết quả

Theo ý kiến ​​cá nhân của tôi, nếu bạn cần truy xuất 10 trường dữ liệu meta, (hoặc trong trường hợp của tôi 5), hãy sử dụng phương pháp thứ hai trong câu trả lời của tôi.

$a = get_post_meta(530);

Nó không chỉ nhanh hơn để viết, mà bạn cũng không nên lặp lại mã. Một điểm khác cần lưu ý ở đây, cách tiếp cận thứ hai chứa tất cả các trường meta trong một mảng có thể dễ dàng truy cập và truy xuất

Cũng giống như vấn đề, đây là đầu ra của tôi $anếu tôi làmvar_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"
  }
}

Bây giờ bạn có thể truy cập bất kỳ dữ liệu meta nào được trả lại trong bài đăng của mình như sau:

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

Cái nào sẽ hiển thị

Cơn bão Tom


4
Điều này được gọi là 'Đi bộ nói chuyện'. Câu trả lời tuyệt vời.
Akhilesh

1
Niềm vui của tôi, rất vui vì nó làm việc cho bạn Thưởng thức :-)
Pieter Goosen

1
Điều này là rất tốt đẹp. Thay vào đó, tôi rất thích thấy một thử nghiệm tương tự tập trung vào meta của người dùng tùy chỉnh.
Christine Cooper

1
Chắc chắn giá trị làm điều đó ;-). Sẽ thấy những gì tôi có thể làm trong vài ngày tới, có một vài ngày bận rộn phía trước bây giờ @ChristineCooper
Pieter Goosen

1
Đẹp! Vui lòng gắn thẻ cho tôi trên chủ đề này với một liên kết trong trường hợp bạn kết thúc nó!
Christine Cooper

0

Bạn có thể sử dụng get_post_metađể tìm nạp tất cả các giá trị trường meta cùng một lúc.

$meta = get_post_meta( get_the_ID() );

Điều này sẽ lấy tất cả các giá trị meta của bài đăng nhất định. Sử dụng mảng đó thay vì tìm nạp riêng lẻ.


0

Như Pieter Goosen đã nêu, tất cả dữ liệu meta cho một bài đăng được lưu trong bộ nhớ cache khi bạn yêu cầu bất kỳ dữ liệu meta nào lần đầu tiên.

Điều này cũng đúng cho bất kỳ cuộc gọi đến WP_Query. Ngay khi bạn gọi WP_Query, WordPress tìm nạp dữ liệu meta cho tất cả các bài đăng được truy xuất trong một truy vấn duy nhất.

Trường hợp xấu nhất là bạn gọi get_post_metacho ID bài đăng cá nhân chưa được WordPress truy xuất trước đó. Trong trường hợp này, mỗi cuộc gọi đến get_post_metasẽ dẫn đến một truy vấn duy nhất.

Một dấu vết mẫu từ một truy vấn vào wp_postmetabên trong 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)

Như bạn có thể thấy, cuộc gọi bắt nguồn từ bên trong get_postsvà truy xuất dữ liệu meta cho 2 bài đăng, đó là kết quả của bản gốc WP_Query.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.