Existe uma desvantagem de usar wp_defer_term_counting?

11

Eu tenho um banco de dados WordPress com mais de 2 milhões de posts. Sempre que insiro um novo post, tenho que ligar, o wp_set_object_termsque leva mais de dois segundos para ser executado. Me deparei com este post que recomenda ligar wp_defer_term_countingpara ignorar a contagem de termos.

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

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

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

Respostas:

8

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


Sim, tecnicamente pode haver consequências.

Onde a chamada wp_defer_term_counting(true)se torna realmente benéfica é quando, por exemplo, você está executando uma inserção em massa no banco de dados de postagens e termos atribuídos 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 de cada vez, adiar a contagem de termos ainda o beneficiará, mas não ligará wp_defer_term_counting(false)depois que sua operação puder deixar você e outras partes envolvidas com a solicitação em um vínculo se você confiar no contagem de termos para qualquer outra lógica / processamento, condicional ou não.

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

Suponha que tenhamos 3 termos em 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á possui uma contagem de termos 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');

Posteriormente, em sua lógica, você decide buscar o termo porque deseja avaliar a quantidade de objetos associados a esse termo e executar 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á possui 5 objetos associados, ou seja, já possui uma contagem de termos 5.

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

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

Agora, a pergunta é obviamente: isso afeta você? E se você não precisar chamar get_the_termsou executar alguma ação que recupere o termo em que você usa o countvalor para executar alguma outra operação? Bem, nesse caso , ótimo, não há problema para você .

Mas ... e se alguém estiver ligado à set_object_termsação na wp_set_object_terms()função e confiar que o termo contagem está correto? Agora você vê onde as consequências podem surgir.

Ou, se depois que a solicitação for encerrada, outra solicitação é executada que recupera um termo de taxonomia e faz uso da countpropriedade em sua lógica de negócios? Isso pode ser um problema.

Embora possa parecer absurdo que os countvalores possam causar muito dano, não podemos assumir a maneira como esses dados serão usados ​​com base em nossa própria filosofia.

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

De fato, a única maneira de atualizar as contagens de termos após adiar a contagem de termos e sua solicitação terminar é ligar wp_update_term_count($terms, $taxonomy)ou aguardar manualmente até que alguém adicione um termo para a taxonomia especificada, via interface de taxonomia ou programaticamente.

Alimento para o pensamento.

Adão
fonte
1
Eu acho que você resume isso de forma brilhante. Tudo depende se você estiver indo para fazer uso da contagem real termo, tanto quanto eu posso pegar cavar através de código-fonte relacionado
Pieter Goosen
3
Sim, eu pensei que essa era uma pergunta interessante, por isso tive que me aprofundar ... parece que o único problema é se você precisar de uma contagem precisa de termos durante a mesma solicitação e mesmo depois que a solicitação terminar. Venha para pensar sobre isso, se alguém está contando com o prazo de contagem para qualquer lógica de negócios séria, então você não pode ter certeza de que o que você está olhando é de fato o número correto. Você precisaria tentar atualizar manualmente a contagem (por exemplo wp_update_term_count()) antes de usar seu valor. Eu não tinha ideia de que seria o caso.
Adam
Resposta muito abrangente. Como na verdade estou fazendo uma inserção em massa, pelo que você explicou, preciso percorrer os termos posteriormente e chamar wp_update_term_count($terms, $taxonomy)cada um deles, correto?
KalenGi
2
O WordPress nunca falha ao dar a alguém um despertar rude. Devo admitir, um às vezes saiba mais responder perguntas como estas que apenas encher em torno do núcleo em geral ;-)
Pieter Goosen
1
Se você estiver fazendo inserção em massa, eu faria wp_defer_term_counting(true), INSERIR EM MASSA então wp_defer_term_counting(false). O único motivo pelo qual você ligaria wp_update_term_count()diretamente é se você armazenou os term_ids em um transitório e adiou a contagem inteiramente, mas, por exemplo, ative uma solicitação AJAX nos bastidores, pegue o transitório e chame manualmente wp_update_term_count()ou use um cron-job ou similar. Se você estiver na mesma solicitação (antes que a execução termine totalmente), faça as wp_defer_term_counting(false)chamadas de wp_update_term_count()qualquer maneira.
Adam
0

Isso deve ser relativamente seguro como uma operação. Isso está adiando a contagem de termos que aparece na página Editar taxonomia. Portanto, não parece que haja consequências sérias.

phatskat
fonte