C'è un aspetto negativo nell'utilizzo di wp_defer_term_counting?


11

Ho un database WordPress con oltre 2 milioni di post. Ogni volta che inserisco un nuovo post devo chiamare wp_set_object_termsche richiede più di due secondi per essere eseguito. Mi sono imbattuto in questo post che consiglia di chiamare wp_defer_term_countingper saltare il conteggio dei termini.

Ci sono serie conseguenze sul funzionamento di WordPress se utilizzo questo approccio?

Ecco il codice dal post nel caso in cui il link si interrompa:

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

Risposte:


8

Ecco alcune riflessioni sulla questione, ma tieni presente che questa non è affatto una risposta conclusiva in quanto potrebbero esserci alcune cose che ho trascurato, tuttavia ciò dovrebbe darti un'idea dei potenziali gotchas.


Sì, tecnicamente potrebbero esserci delle conseguenze.

Il punto in cui la chiamata wp_defer_term_counting(true)diventa veramente vantaggioso è quando, ad esempio, si esegue un inserimento di massa nel database di post e si assegnano termini a ciascun oggetto come parte del processo.

In tal caso, faresti quanto segue:

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

Nel tuo caso, se stai inserendo solo un post alla volta, il rinvio del conteggio dei termini ti trarrà comunque beneficio se non chiamerai wp_defer_term_counting(false)dopo che l'operazione potrebbe lasciare te e o altre parti coinvolte nella richiesta in un vincolo se fai affidamento sul conteggio dei termini per qualsiasi altra logica / elaborazione, condizionale o meno.

Per spiegare ulteriormente, supponiamo che tu faccia quanto segue:

Supponiamo di avere 3 termini all'interno di una tassonomia chiamata product_cat, gli ID per questi termini sono rispettivamente 1 (nome del termine A), 2 (nome del termine B) e 3 (nome del termine C).

Ciascuno dei termini sopra ha già un conteggio dei termini di 5(solo per l'esempio).

Quindi questo succede ...

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

Successivamente, nella tua logica, decidi di recuperare il termine perché desideri valutare la quantità di oggetti associati a quel termine ed eseguire altre azioni in base al risultato.

Quindi fai questo ...

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

Nel caso del nostro esempio, abbiamo detto che il termine nome A (term_id 1) ha già 5 oggetti associati ad esso, in altre parole ha già un conteggio dei termini di 5.

Quindi ci aspettiamo che il countparametro sull'oggetto restituito sopra sia 6 ma poiché non hai chiamato wp_defer_term_counting(false)dopo l'operazione, i conteggi dei termini non sono stati aggiornati per i termini applicabili (termine A, B o C).

Pertanto, questa è la conseguenza della chiamata wp_defer_term_counting(true)senza chiamare wp_defer_term_counting(false)dopo l'operazione.

Ora la domanda è ovviamente, questo ti influenza? Cosa succede se non è necessario chiamare get_the_termso eseguire alcune azioni che recuperano il termine in cui si utilizza il countvalore per eseguire un'altra operazione? Bene in quel caso fantastico, nessun problema per te .

Ma ... cosa succede se qualcun altro è agganciato set_object_termsall'azione nella wp_set_object_terms()funzione e si basano sul conteggio dei termini corretto? Ora vedi dove potrebbero sorgere le conseguenze.

O cosa succede se dopo che la richiesta è terminata, viene eseguita un'altra richiesta che recupera un termine di tassonomia e fa uso della countproprietà nella loro logica aziendale? Questo potrebbe essere un problema.

Sebbene possa sembrare inverosimile che i countvalori possano essere molto dannosi, non possiamo supporre il modo in cui tali dati verranno utilizzati in base alla nostra filosofia.

Inoltre, come indicato nella risposta alternativa, il conteggio riportato nella tabella degli elenchi di tassonomia non verrà aggiornato.

In effetti, l'unico modo per aggiornare il conteggio dei termini dopo aver rinviato il conteggio dei termini e la richiesta è terminata è chiamare manualmente wp_update_term_count($terms, $taxonomy)o attendere fino a quando qualcuno aggiunge un termine per la tassonomia data tramite l'interfaccia utente della tassonomia o programmaticamente.

Cibo per la mente.


1
Penso che lo riassumi brillantemente. Dipende tutto se hai intenzione di utilizzare il conteggio dei termini effettivi per quanto posso imparare a scavare attraverso il codice sorgente correlato
Pieter Goosen

3
Sì, ho pensato che fosse una domanda interessante, quindi ho dovuto approfondire ... sembra che l'unico problema sia se si richiede un conteggio dei termini accurato durante la stessa richiesta e anche dopo che la richiesta è terminata. Vieni a pensarci, se qualcuno si affida mai al conteggio dei termini per una qualsiasi logica aziendale seria, non potresti essere certo che ciò che stai guardando è in realtà il conteggio corretto. Dovresti provare manualmente ad aggiornare il conteggio (ad es. wp_update_term_count()) Prima di utilizzare il suo valore. Non avevo idea che sarebbe stato il caso.
Adam

Risposta molto esauriente. Dal momento che sto effettivamente facendo un inserto di massa, da quello che hai spiegato ho bisogno di scorrere i termini in seguito e chiamare wp_update_term_count($terms, $taxonomy)ciascuno, giusto?
KalenGi

2
WordPress non manca mai di dare un brusco risveglio. Devo ammetterlo, a volte si impara di più a rispondere a domande come queste piuttosto che riempirsi di noia in generale ;-)
Pieter Goosen

1
Se stai facendo inserto di massa, vorrei solo wp_defer_term_counting(true), DO MASSA INSERT poi wp_defer_term_counting(false). L'unica ragione per chiamare wp_update_term_count()direttamente è se hai archiviato i term_ids in un transitorio, quindi differisci completamente il conteggio ma, ad esempio, fai scattare una richiesta AJAX dietro le quinte, prendi il transitorio e poi chiama manualmente wp_update_term_count()o usa un cron-job o simile. Se si è nella stessa richiesta (prima che l'esecuzione venga terminata completamente), si devono comunque chiamare le wp_defer_term_counting(false)chiamate wp_update_term_count().
Adam

0

Questo dovrebbe essere relativamente sicuro come operazione. Questo sta rinviando il conteggio dei termini che appare nella pagina Modifica tassonomia. Quindi, non sembra che ci sarebbero conseguenze gravi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.