Tausende WooCommerce Produkte in Masse bearbeiten: Tempo, Speicher, Timeouts
Wenn Sie Tausende WooCommerce Produkte in Masse bearbeiten, ist die Zahl der Produkte selten das Problem. BEAR zeigt immer nur eine Seite der Tabelle und schreibt in kleinen Chargen, deshalb öffnet sich ein Katalog mit 60.000 Produkten fast so schnell wie einer mit 600. Dass der Editor langsam wird, ihm der Speicher ausgeht oder er mit einem 504 stehen bleibt, hat andere Ursachen: wie viele Taxonomien und Begriffe er darstellen muss, wie viele Variationen auf einer Seite landen, wie viel PHP-Speicher und Zeit der Server jeder Anfrage gibt und was andere Plugins bei jedem Speichern eines Produkts tun. Im Folgenden steht jeder dieser Punkte, woran Sie ihn erkennen und was Sie ändern können.
Was im Bulk-Editor tatsächlich Zeit kostet
- Taxonomien und Begriffe. Beim Öffnen der Editor-Seite werden die Bereiche Filter und Massenbearbeitung mit einem Dropdown für jede Produkt-Taxonomie (Kategorien, Schlagwörter, jedes Attribut, benutzerdefinierte Taxonomien) aufgebaut, das jeden Begriff enthält, auch ungenutzte. Die Feldliste lädt außerdem jedes Attribut mit allen seinen Begriffen. Zehntausend Begriffe bedeuten zehntausend Optionen, die der Server aufbauen und der Browser darstellen muss.
- Zeilen auf der Seite. Die Tabelle lädt nur die aktuelle Seite, aber jede Zeile ist ein vollständiges Produktobjekt, und bei eingeschaltetem Schalter Variationen (variations) wird auch jede Variation jedes variablen Produkts auf der Seite zu einer Zeile.
- Jeder Schreibvorgang. Eine Massenbearbeitung speichert Produkte über WooCommerce, und jedes Plugin, das am Speichern von Produkten hängt, läuft einmal pro Produkt.
- Die Grenzen des Servers. PHP-Speicher pro Anfrage, die Zeit, die eine Anfrage laufen darf, und die Zahl der Formularfelder, die PHP annimmt.
Die Gesamtzahl der Produkte beeinflusst nur, wie viele Chargen ein Massenlauf braucht, nicht, wie schnell sich die Seite öffnet.
Zu viele Taxonomien, Attribute oder Begriffe
Ein Shop mit einigen Hundert Kategorien und einigen Dutzend Attributen läuft problemlos. Ärger beginnt bei Tausenden Begriffen, und er hat typischerweise eine von drei Ursachen: ein Attribut oder eine Taxonomie mit einem eindeutigen Wert pro Produkt (eine UPC, ein Modellcode, eine Lieferantenreferenz), durch Importe duplizierte Attribute (Color, Colour, color-2) oder ein riesiger Kategoriebaum. Anzeichen sind eine Seite, die eine Minute zum Öffnen braucht, ein Browser-Tab, das beim Kategorie-Popup einfriert, oder Maximum call stack size exceeded in der Konsole.
Was Sie ändern können, beginnend mit der wirksamsten Maßnahme:
- Eindeutige Werte aus Taxonomien herausnehmen. Ein Wert, der zu einem einzigen Produkt gehört, ist ein Feld, kein Begriff. Halten Sie ihn in einem Meta-Feld und bearbeiten Sie ihn über den Tab Meta-Felder; löschen Sie dann die Taxonomie oder das Attribut.
- Attribute aufräumen. Führen Sie Duplikate zusammen und löschen Sie Begriffe, die nichts verwendet, unter Produkte > Attribute (Products > Attributes). Der Editor lädt auch leere Begriffe.
- Schwere Taxonomien aus den Bereichen heraushalten. Diese Filter-Hooks entfernen Taxonomien aus den Bereichen Filter und Massenbearbeitung; die Produkte behalten ihre Begriffe.
// Child theme functions.php or a code snippets plugin.
// BEAR: do not draw these taxonomies in the Filters and Bulk Edit panels.
function bear_skip_heavy_taxonomies( $taxonomies ) {
foreach ( array( 'pa_model-code', 'product_tag' ) as $slug ) { // your taxonomy slugs
unset( $taxonomies[ $slug ] );
}
return $taxonomies;
}
add_filter( 'woobe_filter_taxonomies', 'bear_skip_heavy_taxonomies' );
add_filter( 'woobe_bulkedit_taxonomies', 'bear_skip_heavy_taxonomies' );
Um alle Attribute auf einmal aus den beiden Bereichen herauszuhalten:
// BEAR: no attribute (pa_) drop-downs in the Filters and Bulk Edit panels.
add_filter( 'woobe_hide_filters_by_attribute', '__return_true' );
add_filter( 'woobe_hide_bulk_by_attribute', '__return_true' );
Schalten Sie außerdem im Tab Einstellungen (Settings) die Taxonomie-Spalten aus, die Sie nicht bearbeiten: Eine ausgeschaltete Spalte wird für keine Zeile gezeichnet. Bei Tausenden Kategorien ändern Sie Kategorien im Tab Massenbearbeitung (Bulk Edit) statt im Popup einer Tabellenzelle, das bei jedem Öffnen den gesamten Baum im Browser aufbauen muss; der Artikel zur Massenbearbeitung von Kategorien zeigt, wie.
Variationen vervielfachen die Zeilen
Der Schalter Variationen im Werkzeugbereich fügt der Tabelle die Variationen jedes variablen Produkts auf der Seite hinzu. Zehn Produkte mit je 300 Variationen sind 3.000 Zeilen: 3.000 Produktobjekte im PHP-Speicher für eine Anfrage und 3.000 Zeilen, die der Browser zeichnen muss. Produkte mit Hunderten Variationen sind der häufigste Grund für einen Speicherfehler bei der Tabellenanfrage.
- Filtern Sie vor dem Einschalten der Variationen nach Produkttyp = variabel und senken Sie die Zeilen pro Seite mit der Auswahl unter der Tabelle auf 10 oder 5. Die Dokumentation zu Variationen empfiehlt dasselbe.
- Bearbeiten Sie Variationen nicht Zeile für Zeile. Wählen Sie im Tab Massenbearbeitung bei eingeschaltetem Schalter die Attributkombinationen aus, die geändert werden sollen; die Operation läuft dann in Chargen über die Variationen aller gefilterten Produkte.
- Setzen Sie Standardanzahl der Produkte pro Seite (Default products count per page) in den Einstellungen auf einen moderaten Wert, damit sich der Editor nicht auf einer schweren Seite öffnet.
PHP-Speicher und Einstellungen, die sich nicht speichern lassen
Allowed memory size of 134217728 bytes exhausted im Debug-Protokoll, ein 500-Fehler beim Öffnen des Editors oder seines Tabs Einstellungen oder eine Tabellenanfrage, die scheitert, während andere Seiten funktionieren: Die Anfrage brauchte mehr Speicher, als PHP erlaubt. Erhöhen Sie das Limit in wp-config.php, oberhalb der Zeile, die besagt, dass hier das Bearbeiten endet:
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
WordPress kann den Speicher nur bis zum memory_limit von PHP selbst erhöhen, das der Host festlegt. Nennt der Fehler weiterhin die alte Zahl, bitten Sie den Host, memory_limit zu erhöhen, oder ändern Sie es im Hosting-Panel. Bei großen Katalogen sind 256 MB eine vernünftige Untergrenze; verringern Sie lieber Taxonomien und Variationen, statt den Wert endlos zu erhöhen.
Ein anderes Limit führt dazu, dass Einstellungen nur teilweise gespeichert werden. Jedes Attribut ist ein Feld im Tab Einstellungen, und jedes Feld sendet mehrere Werte, sodass ein Shop mit Hunderten Attributen beim Speichern Tausende Werte sendet. PHP behält die ersten max_input_vars (standardmäßig 1000) und verwirft den Rest stillschweigend, deshalb gehen Änderungen am Ende der Liste verloren. Erhöhen Sie max_input_vars im Hosting-Panel oder in der php.ini auf 5000 oder mehr, oder ziehen Sie die Felder, mit denen Sie arbeiten, an den Anfang der Liste.
Lange Massenläufe und 502- oder 504-Timeouts
Eine Massenbearbeitung läuft nicht als eine lange Anfrage. Der Server liefert zuerst die IDs der zu ändernden Produkte, dann sendet der Browser sie in Chargen zurück, eine Anfrage je Charge, und der Fortschrittsbalken rückt pro Charge vor. Ein 502 oder 504 mitten im Lauf bedeutet, dass eine Charge länger gedauert hat, als der Server erlaubt.
- Die Chargengröße senken. Anzahl der gleichzeitig verarbeiteten Beiträge (Number of posts processed at a time) im Tab Einstellungen reicht von 10 (für schwaches Shared Hosting) bis 100, mit 30 (optimal) als Standard. Halbieren Sie den Wert und starten Sie erneut. Kleinere Chargen dauern insgesamt länger, aber jede Anfrage bleibt kurz.
- Die Arbeit aufteilen. Führen Sie dieselbe Operation je Kategorie oder je Preisspanne aus. Der Verlauf (History) zeichnet jeden Lauf auf, sodass sich jeder einzeln zurücksetzen lässt.
- Zeitlimits des Servers. PHPs
max_execution_timeund die Timeouts des Webservers (ApacheTimeout, nginxfastcgi_read_timeoutoderproxy_read_timeout) entscheiden, wie lange eine Charge dauern darf. Viele Managed-Hosts haben ein festes Gateway-Limit; dort ist die Chargengröße die Einstellung, die Sie ändern. - Plugins, die am Speichern von Produkten hängen. Brauchen zehn Produkte bis zu einer Minute, geht die Zeit in andere Plugins: Suchindizes, Feeds, Synchronisations-Konnektoren, Page Builder, Cache-Leerungen. Plugins bei Massenbearbeitungen isolieren zeigt, wie Sie sie aus den Anfragen von BEAR heraushalten.
Bei einem Lauf, der auf halber Strecke stehen bleibt, sind die ersten Chargen bereits geschrieben. Sein Datensatz im Verlauf behält den Zustand terminated statt completed und zählt die bisher geschriebenen Produkte; setzen Sie ihn zurück oder führen Sie die Operation mit demselben Filter erneut aus, wenn sie sich gefahrlos zweimal anwenden lässt (neuen Wert setzen (set new) ist unbedenklich, um % erhöhen (increase by %) nicht).
Weitere Ursachen für eine langsame Editor-Seite
Das Autoren-Dropdown bei Shops mit vielen Benutzern
Beim Öffnen baut der Editor die Autorenliste für die Bereiche Filter und Massenbearbeitung auf, indem er WordPress nach jedem Benutzer fragt, dessen Rolle veröffentlichen darf. Bei einer Website mit sehr großer Benutzertabelle oder mit einem Plugin, das Benutzerabfragen umschreibt, kann allein diese Abfrage Minuten dauern und mit einem 504 enden, bevor die Seite erscheint. Der Filter woobe_users_args ersetzt die Abfrage, zum Beispiel durch die Benutzer, denen tatsächlich Produkte gehören:
// Child theme functions.php or a code snippets plugin.
// BEAR: list only users who already own products in the author drop-down.
add_filter( 'woobe_users_args', function ( $args ) {
global $wpdb;
$author_ids = get_transient( 'bear_product_author_ids' );
if ( false === $author_ids ) {
$author_ids = $wpdb->get_col( "SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'product'" );
set_transient( 'bear_product_author_ids', $author_ids, DAY_IN_SECONDS );
}
return array(
'fields' => array( 'ID', 'display_name' ),
'include' => empty( $author_ids ) ? array( 0 ) : array_map( 'intval', $author_ids ),
'orderby' => 'display_name',
);
} );
Ein Benutzer, dem noch kein Produkt gehört, erscheint erst in der Liste, wenn die zwischengespeicherte Liste einen Tag später abläuft; löschen Sie das Transient bear_product_author_ids, um sie sofort zu aktualisieren.
Leerung des Objekt-Caches und Admin-Optimierung
Auf Websites mit Redis oder Memcached leert BEAR den Objekt-Cache, bevor die Tabelle gezeichnet wird, sodass die ganze Website ihren Cache bei jedem Laden der Tabelle neu aufbaut. Bei einem stark besuchten großen Shop macht sich das bemerkbar; der Filter woobe_use_cache_flush schaltet es ab, mit dem Kompromiss, der in Bulk-Editor-Filter funktioniert nicht erklärt ist. Page-Cache- und Optimierungs-Plugins, die Skripte in wp-admin minimieren, zusammenfassen oder verzögern, bremsen jede Anfrage des Editors aus; schließen Sie /wp-admin/ von diesen Funktionen aus.
Checkliste für einen großen Katalog
- Keine Taxonomie enthält einen Begriff pro Produkt; doppelte Attribute sind zusammengeführt, ungenutzte Begriffe gelöscht.
- Taxonomien, nach denen Sie nie filtern oder in Masse bearbeiten, sind mit
woobe_filter_taxonomiesundwoobe_bulkedit_taxonomiesaus den Bereichen entfernt. - Die Zeilen pro Seite betragen 10 oder weniger, solange der Variationen-Schalter eingeschaltet ist.
- Das PHP-
memory_limitbeträgt 256 MB oder mehr, undmax_input_varsreicht für Ihren Tab Einstellungen. - Anzahl der gleichzeitig verarbeiteten Beiträge ist niedrig genug, dass keine Charge das Timeout des Servers erreicht.
- Um die Zeilen von BEAR in
wp_optionsmüssen Sie sich nicht kümmern: Die, die wachsen können, die Einstellungen pro Benutzer (woobe_options_plus Benutzer-ID) und der Speicher pro Benutzer (woobe_memory_plus Benutzer-ID), werden ohne Autoload geschrieben, sodass Shopseiten sie nie laden, und die Speicherzeilen enthalten nur den aktuellen Filter und die Massendaten, die nach einem Tag verfallen.
Ist der Editor nach diesen Änderungen noch immer langsam, eröffnen Sie ein Thema im BEAR-Support-Forum mit der Zahl der Produkte, den Variationen pro Produkt, den Taxonomien und Begriffen sowie dem Fehler, den der Server oder die Browser-Konsole zeigt.