wp_defer_term_counting 사용의 단점이 있습니까?


11

2 백만 개가 넘는 게시물이있는 WordPress 데이터베이스가 있습니다. 새 게시물을 삽입 할 때마다 wp_set_object_terms2 초 이상 걸리는 전화 를해야합니다. 내가 건너 온 이 게시물에 호출하는 것이 좋습니다 wp_defer_term_counting용어 계산을 건너 뛸 수 있습니다.

이 방법을 사용하면 WordPress의 기능에 심각한 결과가 있습니까?

링크가 끊어진 경우를 대비하여 게시물의 코드는 다음과 같습니다.

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' );
  }
}

답변:


8

여기 에이 문제에 대한 몇 가지 생각이 있지만, 내가 간과 한 것이 있지만 결론을 내릴 수는 없지만 결정적인 대답은 아닙니다.


예, 기술적으로 결과가있을 수 있습니다.

호출 wp_defer_term_counting(true)이 진정으로 유익한 곳은 예를 들어 게시물 데이터베이스에 대량 삽입을 수행하고 프로세스의 일부로 각 객체에 용어를 할당하는 경우입니다.

이 경우 다음을 수행하십시오.

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

이제 귀하의 경우에 한 번에 하나의 게시물 만 삽입하는 경우 기간 계산을 연기하면 wp_defer_term_counting(false)운영에 귀하와 다른 당사자가 요청에 관여하는 경우 귀하와 다른 당사자가 구속력 을 갖도록 한 후에 전화를하지 않아도 도움이 됩니다. 조건부 또는 기타 다른 논리 / 처리에 대한 용어 수.

더 자세히 설명하기 위해 다음을 수행한다고 가정 해 봅시다.

분류법 내에이라는 용어가 3 개 있다고 가정 product_cat하면 해당 용어의 ID는 각각 1 (용어 이름 A), 2 (용어 이름 B) 및 3 (용어 이름 C)입니다.

위의 각 용어에는 이미 용어 개수가 있습니다 5(예제 만 해당).

그러면 이런 일이 ...

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');

그런 다음 나중에 논리에서 해당 용어와 연관된 오브젝트의 양을 평가하고 결과에 따라 다른 조치를 수행하기 때문에 용어를 페치하기로 결정합니다.

그래서 당신은 이것을합니다 ...

$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',
  )),
)

이 예의 경우, 용어 이름 A (term_id 1)에는 이미 5 개의 개체가 연결되어 있으며, 다시 말해 용어 개수는 5입니다.

따라서 count위의 반환 된 객체에 대한 매개 변수는 6 일 것으로 예상 되지만 wp_defer_term_counting(false)작업 후에 호출하지 않았기 때문에 적용 가능한 용어 (A, B 또는 C)에 대한 용어 개수가 업데이트되지 않았습니다.

따라서 그것은 수술 후 전화 하지 않고 전화를 한 결과 입니다 .wp_defer_term_counting(true)wp_defer_term_counting(false)

이제 질문은 물론입니다. 이것이 당신에게 영향을 줍니까? 값을 get_the_terms사용하여 count다른 작업을 수행 하는 용어를 검색하는 작업 을 호출 하거나 수행 할 필요가없는 경우 어떻게 합니까? 이 경우에는 큰 문제가되지 않습니다 .

하지만 ... 만약 누군가 다른 사람이 set_object_termswp_set_object_terms()기능 에서 행동에 푹 빠졌고 그들이 정확한 용어 개수에 의존한다면 어떨까요? 이제 결과가 어디에서 발생할 수 있는지 알 수 있습니다.

또는 요청이 종료 된 후 분류 용어를 검색 count하고 비즈니스 논리에서 해당 속성을 사용하는 다른 요청이 수행되면 어떻게됩니까? 문제가 될 수 있습니다.

이 것을 지금까지 가져온 들릴 수도 있지만 count값이 많은 해 될 수있다, 우리는 데이터가 우리 자신의 철학을 바탕으로 사용되는 방식을지지 않습니다.

또한 대체 답변에서 언급했듯이 분류 목록 테이블에 표시된 카운트도 업데이트되지 않습니다.

실제로 용어 계산을 연기하고 요청이 종료 된 후 용어 수를 업데이트하는 유일한 방법은 wp_update_term_count($terms, $taxonomy)누군가 분류 체계 UI를 통해 또는 프로그래밍 방식으로 주어진 분류 체계에 대한 용어를 추가 할 때까지 수동으로 호출 하거나 대기하는 것입니다.

생각할 거리.


1
나는 당신이 이것을 훌륭하게 요약한다고 생각합니다. 관련 소스 코드를 통해 발굴 할 수있는 한 실제 용어 수를 사용할지 여부에 따라 다릅니다.
Pieter Goosen

3
네, 이것이 흥미로운 질문이라고 생각했기 때문에 더 깊이 파고 들었습니다 ... 동일한 요청 동안 그리고 요청이 종료 된 후에도 정확한 용어 수를 요구하는 것이 유일한 문제인 것 같습니다. 누군가가 심각한 비즈니스 로직에 대한 용어 수에 의존하고 있다면 실제로보고있는 것이 실제로 정확한 수임을 보장 할 수 없었습니다. wp_update_term_count()값을 사용하기 전에 카운트 (예 :)를 수동으로 시도하고 업데이트해야 합니다. 나는 그것이 사실인지 전혀 몰랐다.
Adam

매우 포괄적 인 답변. 실제로 대량 삽입을하고 있기 때문에 나중에 설명 한 용어를 반복 wp_update_term_count($terms, $taxonomy)하고 각각에 대해 호출해야한다고 설명 한 것에서 정확합니까?
KalenGi

2
워드 프레스는 절대로 무례한 깨우침을주지 않습니다. 나는 인정해야한다. 가끔은 일반적으로 핵심을 채우는 것보다 이와 같은 질문에 대한 답을 더 많이 배워야한다. ;-)
Pieter Goosen

1
대량 삽입 작업을 수행하는 경우 wp_defer_term_counting(true), DO MASS INSERT 를 수행하십시오 wp_defer_term_counting(false). wp_update_term_count()직접 호출하는 이유 는 term_ids를 과도 상태로 저장 한 다음 완전히 계산을 연기하지만, 예를 들어 장면 뒤에서 AJAX 요청을 발생시키는 경우, 과도 상태를 잡고 수동으로 호출 wp_update_term_count()하거나 cron-job 또는 이와 유사한 것을 사용하기 때문입니다. 동일한 요청 (실행이 완전히 종료되기 전에)에 있다면 어쨌든 후드 아래에서 전화를 wp_defer_term_counting(false)겁니다 wp_update_term_count().
Adam

0

이것은 작업으로서 비교적 안전해야합니다. 이는 분류 편집 페이지에 나타나는 용어 ​​수를 연기하는 것입니다. 따라서 심각한 결과가 발생하지는 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.