Có một nhược điểm của việc sử dụng wp_defer_term_counting không?


11

Tôi có một cơ sở dữ liệu WordPress với hơn 2 triệu bài đăng. Bất cứ khi nào tôi chèn một bài viết mới, tôi phải gọi wp_set_object_termsmất hơn hai giây để thực thi. Tôi đã xem qua bài đăng này khuyên bạn nên gọi wp_defer_term_countingđể bỏ qua việc đếm hạn.

Có hậu quả nghiêm trọng nào đối với chức năng của WordPress nếu tôi sử dụng phương pháp này không?

Đây là mã từ bài viết chỉ trong trường hợp liên kết bị chết:

function insert_many_posts(){
  wp_defer_term_counting(true);
  $tasks = get_default_tasks(); 
  for ($tasks as $task){
     $post = array(
       'post_title' => $task[content],
       'post_author' => $current_user->ID,
       'post_content' => '',
       'post_type' => 'bpc_default_task',
       'post_status' => 'publish'
     );
     $task_id = wp_insert_post( $post );

     if ( $task[category] )
        //Make sure we're passing an int as the term so it isn't mistaken for a slug
        wp_set_object_terms( $task_id, array( intval( $category ) ), 'bpc_category' );
  }
}

Câu trả lời:


8

Dưới đây là một số suy nghĩ về vấn đề này, nhưng xin lưu ý rằng đây không phải là một câu trả lời có thể kết luận vì có thể có một số điều tôi đã bỏ qua tuy nhiên điều này sẽ cho bạn cái nhìn sâu sắc về các vấn đề tiềm năng.


Vâng, về mặt kỹ thuật có thể có hậu quả.

Trường hợp việc gọi wp_defer_term_counting(true)trở nên thực sự có lợi là khi bạn thực hiện việc chèn hàng loạt vào cơ sở dữ liệu của các bài đăng và các thuật ngữ được gán cho từng đối tượng như một phần của quy trình.

Trong trường hợp như vậy, bạn sẽ làm như sau:

wp_defer_term_counting(true); //defer counting terms

//mass insertion or posts and assignment of terms here

wp_defer_term_counting(false); //count terms after completing business logic

Bây giờ trong trường hợp của bạn, nếu bạn chỉ chèn một bài đăng tại một thời điểm, thì việc trì hoãn việc đếm thời hạn sẽ vẫn có lợi cho bạn tuy nhiên bằng cách không gọi wp_defer_term_counting(false)sau khi hoạt động của bạn có thể khiến bạn và các bên khác liên quan đến yêu cầu bị ràng buộc nếu bạn dựa vào thuật ngữ cho bất kỳ logic / xử lý khác, có điều kiện hoặc cách khác.

Để giải thích thêm, giả sử bạn làm như sau:

Giả sử chúng ta có 3 thuật ngữ trong một phân loại được gọi product_cat, ID cho các thuật ngữ đó lần lượt là 1 (tên hạn A), 2 (tên hạn B) và 3 (tên hạn C).

Mỗi thuật ngữ trên đã có số lượng thuật ngữ 5(chỉ cho ví dụ).

Sau đó, điều này xảy ra ...

wp_defer_term_counting(true); //defer counting terms

$post_id = wp_insert_post($data);

wp_set_object_terms($post_id, array(1, 2, 3), 'product_cat');

Sau đó, trong logic của bạn, bạn quyết định tìm nạp thuật ngữ vì bạn muốn đánh giá số lượng đối tượng được liên kết với thuật ngữ đó và thực hiện một số hành động khác dựa trên kết quả.

Vì vậy, bạn làm điều này ...

$terms = get_the_terms($post_id, 'product_cat');

//let's just grab the first term object off the array of returned results
//for the sake of this example $terms[0] relates to term_id 1 (A)
echo $terms[0]->count; //result 5

//dump output of $terms above
array (
  0 => 
  WP_Term::__set_state(array(
     'term_id' => 1,
     'name' => 'A',
     'slug' => 'a',
     'term_group' => 0,
     'term_taxonomy_id' => 1,
     'taxonomy' => 'product_cat',
     'description' => '',
     'parent' => 0,
     'count' => 5, //notice term count still equal to 5 instead of 6
     'filter' => 'raw',
  )),
)

Trong trường hợp ví dụ của chúng tôi, chúng tôi đã nói rằng tên thuật ngữ A (term_id 1) đã có 5 đối tượng được liên kết với nó, trong các từ khác đã có số hạng là 5.

Vì vậy, chúng tôi hy vọng counttham số trên đối tượng được trả lại ở trên là 6 nhưng vì bạn không gọi wp_defer_term_counting(false)sau thao tác của mình, nên số lượng thuật ngữ không được cập nhật cho các thuật ngữ áp dụng (thuật ngữ A, B hoặc C).

Do đó, đó là hậu quả của việc gọi wp_defer_term_counting(true)mà không gọi wp_defer_term_counting(false)sau khi hoạt động.

Bây giờ câu hỏi là tất nhiên, điều này có ảnh hưởng đến bạn? Điều gì xảy ra nếu bạn không có nhu cầu gọi get_the_termshoặc thực hiện một số hành động truy xuất thuật ngữ mà bạn sử dụng countgiá trị để thực hiện một số thao tác khác? Vâng, trong trường hợp tuyệt vời, không có vấn đề cho bạn .

Nhưng ... điều gì sẽ xảy ra nếu người khác bị cuốn vào set_object_termshành động trong wp_set_object_terms()hàm và họ đang dựa vào số thuật ngữ là chính xác? Bây giờ bạn thấy nơi hậu quả có thể phát sinh.

Hoặc nếu sau khi yêu cầu kết thúc, một yêu cầu khác được thực hiện lấy ra một thuật ngữ phân loại và sử dụng counttài sản trong logic kinh doanh của họ thì sao? Đó có thể là một vấn đề.

Mặc dù nghe có vẻ xa vời rằng countcác giá trị có thể gây hại rất nhiều, chúng ta không thể cho rằng cách dữ liệu đó sẽ được sử dụng dựa trên triết lý của chính chúng ta.

Cũng như được đề cập trong câu trả lời thay thế, số đếm như đã thấy trên bảng danh sách phân loại cũng sẽ không được cập nhật.

Trên thực tế, cách duy nhất để cập nhật số lượng thuật ngữ sau khi bạn trì hoãn việc đếm thời hạn và yêu cầu của bạn đã kết thúc là gọi thủ công wp_update_term_count($terms, $taxonomy)hoặc đợi cho đến khi ai đó thêm một thuật ngữ cho phân loại cụ thể thông qua giao diện người dùng phân loại hoặc lập trình.

Thức ăn cho suy nghĩ.


1
Tôi nghĩ rằng bạn tổng hợp này một cách xuất sắc. Tất cả phụ thuộc vào việc bạn sẽ sử dụng số lượng thuật ngữ thực tế đến mức nào tôi có thể nhận được thông qua mã nguồn có liên quan
Pieter Goosen

3
Vâng tôi nghĩ rằng đây là một câu hỏi thú vị vì vậy tôi phải đào sâu hơn ... dường như vấn đề duy nhất là nếu bạn yêu cầu số lượng chính xác trong cùng một yêu cầu và ngay cả sau khi yêu cầu kết thúc. Hãy suy nghĩ về điều này, nếu bất cứ ai đang dựa vào số lượng hạn cho bất kỳ logic kinh doanh nghiêm túc nào thì bạn không thể được đảm bảo rằng những gì bạn đang xem thực tế là số đếm chính xác. Bạn phải thử thủ công và cập nhật số đếm (ví dụ wp_update_term_count()) trước khi sử dụng giá trị của nó. Tôi không có ý tưởng đó sẽ là trường hợp.
Adam

Câu trả lời rất toàn diện. Vì tôi thực sự đang thực hiện chèn hàng loạt, từ những gì bạn đã giải thích, tôi cần lặp lại các điều khoản sau đó và gọi wp_update_term_count($terms, $taxonomy)từng từ, đúng không?
KalenGi

2
WordPress không bao giờ thất bại trong việc đánh thức một người thô lỗ. Tôi phải thừa nhận, đôi khi người ta học được nhiều câu trả lời như thế này hơn là chỉ nói chung về cốt lõi ;-)
Pieter Goosen

1
Nếu bạn đang thực hiện chèn hàng loạt, tôi sẽ chỉ wp_defer_term_counting(true) , LÀM MASS INSERT sau đó wp_defer_term_counting(false). Lý do duy nhất bạn sẽ gọi wp_update_term_count()trực tiếp là nếu bạn lưu trữ term_ids trong trạng thái tạm thời sau đó trì hoãn đếm hoàn toàn nhưng ví dụ: tắt yêu cầu AJAX đằng sau hậu trường, lấy tạm thời sau đó gọi thủ công wp_update_term_count()hoặc sử dụng công việc định kỳ hoặc tương tự. Nếu bạn đang ở trong cùng một yêu cầu (trước khi thực hiện hoàn toàn chấm dứt) thì hãy gọi wp_defer_term_counting(false)các cuộc gọi wp_update_term_count()dưới mui xe.
Adam

0

Điều này nên tương đối an toàn như là một hoạt động. Điều này đang trì hoãn việc đếm các thuật ngữ xuất hiện trên trang Chỉnh sửa phân loại. Vì vậy, nó không xuất hiện rằng sẽ có bất kỳ hậu quả nghiêm trọng.

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.