Existe uma desvantagem de usar wp_defer_term_counting?

12

Eu tenho um banco de dados WordPress com mais de 2 milhões de posts. Sempre que eu insiro um novo post eu tenho que chamar wp_set_object_terms , que leva mais de dois segundos para executar. Eu me deparei com esta postagem , que recomenda chamar wp_defer_term_counting para ignorar a contagem de termos.

Há sérias conseqüências para o funcionamento do WordPress se eu usar essa abordagem?

Aqui está o código da postagem, caso o link falhe:

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' );
  }
}
    
por KalenGi 07.03.2016 / 15:24

2 respostas

8

Aqui estão algumas reflexões sobre o assunto, mas observe que esta não é de forma alguma uma resposta conclusiva, pois pode haver algumas coisas que negligenciei, mas isso deve lhe dar uma visão das possíveis dificuldades.

Sim, tecnicamente pode haver consequências.

Onde chamar wp_defer_term_counting(true) se torna realmente benéfico é quando, por exemplo, você está realizando uma inserção em massa no banco de dados de postagens e atribuiu termos a cada objeto como parte do processo.

Nesse caso, você faria o seguinte:

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

Agora, no seu caso, se você estiver inserindo apenas uma postagem por vez, adiar a contagem de termos ainda o beneficiará. No entanto, não chame wp_defer_term_counting(false) depois que sua operação deixar você e outras partes envolvidas com a solicitação em um ligar se você confiar na contagem de termos para qualquer outra lógica / processamento, condicional ou de outra forma.

Para explicar mais, digamos que você faça o seguinte:

Suponha que temos 3 termos dentro de uma taxonomia chamada product_cat , os IDs para esses termos são 1 (nome do termo A), 2 (nome do termo B) e 3 (nome do termo C) respectivamente.

Cada um dos termos acima já tem uma contagem de termos de 5 (apenas para o exemplo).

Então isso acontece ...

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

Depois, em sua lógica, você decide buscar o termo porque deseja avaliar a quantidade de objetos associados a esse termo e realizar alguma outra ação com base no resultado.

Então você faz isso ...

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

No caso do nosso exemplo, dissemos que o nome do termo A (term_id 1) já tem 5 objetos associados a ele, em outras palavras já tem uma contagem de termos de 5.

Portanto, esperamos que o parâmetro count no objeto retornado acima seja 6, mas como você não chamou wp_defer_term_counting(false) após sua operação, as contagens de termos não foram atualizadas para os termos aplicáveis (termo A, B ou C ).

Portanto, essa é a consequência de chamar wp_defer_term_counting(true) sem chamar wp_defer_term_counting(false) após sua operação.

Agora, a questão é, claro, isso afeta você? E se você não precisar chamar get_the_terms ou executar alguma ação que recupere o termo onde você usa o valor count para executar alguma outra operação? Bem, nesse caso, ótimo, não há problema para você .

Mas ... e se outra pessoa estiver conectada à ação set_object_terms na função wp_set_object_terms() e estiver confiando que a contagem de termos está correta? Agora você vê onde as conseqüências podem surgir.

Ou, se após o término da solicitação, outra solicitação for executada, recuperando um termo de taxonomia e fazendo uso da propriedade count em sua lógica de negócios? Isso pode ser um problema.

Embora possa parecer muito improvável que count possam ser muito prejudiciais, não podemos assumir a forma como esses dados serão usados com base em nossa própria filosofia.

Além disso, conforme mencionado na resposta alternativa, a contagem, conforme vista na tabela da lista de taxonomia, também não será atualizada.

Na verdade, a única maneira de atualizar as contagens de termos depois de adiar a contagem de término e sua solicitação foi chamar manualmente wp_update_term_count($terms, $taxonomy) ou aguardar até que alguém adicione um termo para a taxonomia especificada por meio da interface da taxonomia ou de forma programática.

Alimento para o pensamento.

    
por userabuser 08.03.2016 / 12:26
0

Isso deve ser relativamente seguro como uma operação. Isso está adiando a contagem de termos que aparece na página Editar Taxonomia. Então, não parece que haveria sérias conseqüências.

    
por phatskat 07.03.2016 / 15:40