Gibt es einen Nachteil bei der Verwendung von wp_defer_term_counting?

11

Ich habe eine WordPress-Datenbank mit über 2 Millionen Beiträgen. Immer wenn ich einen neuen Beitrag einfüge, muss ich anrufen, wp_set_object_termswas mehr als zwei Sekunden dauert. Ich bin auf diesen Beitrag gestoßen, wp_defer_term_countingin dem empfohlen wird, anzurufen , um die Begriffszählung zu überspringen.

Gibt es schwerwiegende Konsequenzen für die Funktionsweise von WordPress, wenn ich diesen Ansatz verwende?

Hier ist der Code aus dem Beitrag für den Fall, dass der Link nicht mehr funktioniert:

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
quelle

Antworten:

8

Hier sind einige Gedanken zu diesem Thema, aber bitte beachten Sie, dass dies keineswegs eine schlüssige Antwort ist, da es einige Dinge gibt, die ich übersehen habe. Dies sollte Ihnen jedoch einen Einblick in die möglichen Fallstricke geben.


Ja, technisch könnte es Konsequenzen geben.

Der Aufruf ist wp_defer_term_counting(true)wirklich nützlich, wenn Sie beispielsweise im Rahmen des Prozesses eine Masseneinfügung in die Datenbank mit Beiträgen und zugewiesenen Begriffen für jedes Objekt durchführen.

In einem solchen Fall würden Sie Folgendes tun:

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

Wenn Sie in Ihrem Fall immer nur einen Beitrag gleichzeitig einfügen, profitieren Sie immer noch davon, wenn Sie die Laufzeitzählung verschieben, wenn Sie nicht anrufen, wp_defer_term_counting(false)nachdem Ihre Operation Sie und andere an der Anfrage beteiligte Parteien in einer Bindung zurücklassen könnte, wenn Sie sich auf die verlassen Termanzahl für jede andere Logik / Verarbeitung, bedingt oder anderweitig.

Nehmen wir zur weiteren Erläuterung Folgendes an:

Angenommen, wir haben 3 Begriffe innerhalb einer Taxonomie product_cat, die aufgerufen werden. Die IDs für diese Begriffe sind 1 (Begriffsname A), 2 (Begriffsname B) und 3 (Begriffsname C).

Jeder der oben genannten Begriffe hat bereits eine Laufzeitanzahl von 5(nur für das Beispiel).

Dann passiert das ...

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

Später in Ihrer Logik entscheiden Sie sich dann, den Begriff abzurufen, da Sie die Anzahl der mit diesem Begriff verknüpften Objekte bewerten und basierend auf dem Ergebnis eine andere Aktion ausführen möchten.

Also machst du das ...

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

In unserem Beispiel haben wir gesagt, dass dem Termnamen A (term_id 1) bereits 5 Objekte zugeordnet sind, mit anderen Worten bereits eine Termanzahl von 5.

Wir würden also erwarten, dass der countParameter für das oben zurückgegebene Objekt 6 ist. Da Sie jedoch wp_defer_term_counting(false)nach Ihrer Operation nicht aufgerufen haben, wurden die Begriffszählungen für die zutreffenden Begriffe (Begriff A, B oder C) nicht aktualisiert.

Daher ist dies die Folge eines Anrufs wp_defer_term_counting(true)ohne Anruf wp_defer_term_counting(false)nach Ihrer Operation.

Nun stellt sich natürlich die Frage, ob Sie davon betroffen sind. Was ist, wenn Sie keine get_the_termsAktion aufrufen oder ausführen müssen, die den Begriff abruft, bei dem Sie den countWert verwenden, um eine andere Operation auszuführen? Na in diesem Fall super, kein Problem für dich .

Aber ... was ist, wenn jemand anderes an der set_object_termsAktion in der wp_set_object_terms()Funktion festhält und sich darauf verlässt, dass die Anzahl der Begriffe korrekt ist? Jetzt sehen Sie, wo die Konsequenzen entstehen könnten.

Oder was ist, wenn nach Beendigung der Anforderung eine andere Anforderung ausgeführt wird, die einen Taxonomiebegriff abruft und die countEigenschaft in ihrer Geschäftslogik verwendet? Das könnte ein Problem sein.

Es mag weit hergeholt klingen, dass countWerte viel Schaden anrichten könnten, aber wir können nicht davon ausgehen, wie solche Daten basierend auf unserer eigenen Philosophie verwendet werden.

Wie in der alternativen Antwort erwähnt, wird auch die Anzahl in der Taxonomielistentabelle nicht aktualisiert.

Die einzige Möglichkeit, die Anzahl der Begriffe zu aktualisieren, nachdem Sie die Anzahl der Begriffe verschoben und Ihre Anfrage beendet haben, besteht darin, manuell anzurufen wp_update_term_count($terms, $taxonomy)oder zu warten, bis jemand einen Begriff für die angegebene Taxonomie entweder über die Taxonomie-Benutzeroberfläche oder programmgesteuert hinzufügt.

Denkanstöße.

Adam
quelle
1
Ich denke, Sie fassen das hervorragend zusammen. Es hängt alles davon ab, ob Sie die tatsächliche Anzahl der Begriffe verwenden, soweit ich mit dem Durchsuchen des zugehörigen Quellcodes beginnen kann
Pieter Goosen
3
Ja, ich dachte, dies sei eine interessante Frage, also musste ich tiefer graben ... anscheinend ist das einzige Problem, wenn Sie während derselben Anfrage und auch nach Beendigung der Anfrage eine genaue Laufzeitzählung benötigen. Wenn sich jemand jemals auf die Begriffszählung für eine ernsthafte Geschäftslogik verlässt, kann Ihnen nicht garantiert werden, dass das, was Sie betrachten, tatsächlich die richtige Anzahl ist. Sie müssten manuell versuchen, die Anzahl zu aktualisieren (z. B. wp_update_term_count()), bevor Sie den Wert verwenden. Ich hatte keine Ahnung, dass dies der Fall sein würde.
Adam
Sehr umfassende Antwort. Da ich tatsächlich eine Masseneinfügung mache, muss ich nach dem, was Sie erklärt haben, die Begriffe anschließend durchlaufen und wp_update_term_count($terms, $taxonomy)jeden aufrufen , richtig?
KalenGi
2
WordPress weckt immer wieder unhöflich. Ich muss zugeben, manchmal lernt man mehr, solche Fragen zu beantworten, als nur im Kern herumzuspielen ;-)
Pieter Goosen
1
Wenn Sie Masseneinsatz tun, würde ich nur wp_defer_term_counting(true), DO MASS INSERT dann wp_defer_term_counting(false). Der einzige Grund, warum Sie wp_update_term_count()direkt aufrufen würden, besteht darin, dass Sie die term_ids in einem Transienten gespeichert und dann die Zählung vollständig verschoben haben, aber beispielsweise eine AJAX-Anforderung hinter den Kulissen auslösen, den Transienten abrufen wp_update_term_count()und dann manuell einen Cron-Job oder ähnliches aufrufen oder verwenden. Wenn Sie sich in derselben Anfrage befinden (bevor die Ausführung vollständig beendet ist), rufen Sie trotzdem wp_defer_term_counting(false)Anrufe wp_update_term_count()unter der Haube an.
Adam
0

Dies sollte als Operation relativ sicher sein. Dadurch wird die Anzahl der Begriffe verschoben, die auf der Seite Taxonomie bearbeiten angezeigt werden. Es scheint also keine ernsthaften Konsequenzen zu geben.

Phatskat
quelle