WooCommerce Bulk-Editor Filter funktioniert nicht oder geht auf Seite 2 verloren
Wenn der Filter im WooCommerce Bulk-Editor nicht funktioniert, ist das Symptom fast immer dasselbe: Die erste Seite der Tabelle zeigt die richtigen Produkte, und Seite 2, eine geänderte Zeilenzahl pro Seite, ein Klick auf die Sortierung oder der Schalter für Variationen bringen den ganzen Katalog zurück. In den meisten Fällen ist der Filter selbst in Ordnung. Kaputt ist der Ort auf dem Server, an dem BEAR den Filter zwischen den Anfragen aufbewahrt, und deshalb kann eine Massenbearbeitung, die für 200 gefilterte Produkte gedacht war, am Ende in jedes Produkt des Shops schreiben. Im Folgenden steht, wie dieser Speicher funktioniert, welche Einstellung das seit Version 2.2.2 behebt, welches alte Code-Snippet diese Einstellung stillschweigend aushebeln kann und in welchen Fällen der Filter genau wie vorgesehen arbeitet und trotzdem etwas liefert, das Sie nicht erwartet haben.
Wie der Bulk-Editor einen Filter zwischen den Seiten behält
Wenn Sie auf Filtern (Filter) klicken, sendet der Browser die Bedingungen einmal. BEAR speichert sie auf dem Server unter einem zufälligen Schlüssel, und die Seite merkt sich nur diesen Schlüssel. Jede weitere Anfrage, also Seite 2, eine neue Seitenlänge, die Sortierung, der Schalter Variationen (variations), die Massenbearbeitung oder der Export, sendet nur den Schlüssel, und der Server liest die Bedingungen aus dem Speicher zurück. Liefert der Speicher nichts, gibt es nichts, wonach gefiltert werden könnte, und die Abfrage läuft auf allen Produkten.
Damit ist der Zähler unter der Tabelle die wichtigste Zahl auf dem Bildschirm. Zeige 1 bis 50 von 226 Einträgen (Showing 1 to 50 of 226 entries) direkt nach dem Filtern und dann von 5720 Einträgen auf Seite 2 bedeutet, dass der Filter zwischen den beiden Anfragen verloren gegangen ist. Der Tab Massenbearbeitung zeigt keinen Zähler; er sagt Massenbearbeitung wird angewendet auf: die gefilterten Produkte (Bulk editing will be applied to: the filtered products) und liest den Filter aus demselben Speicher. Springt also der Zähler, erfasst eine filterbasierte Massenbearbeitung oder ein Export in diesem Moment den gesamten Katalog.
Sehen Sie vor jeder Massenbearbeitung durchführen (Do Bulk Edit) auf einem Filter auf den Zähler. Ist ein Lauf bereits auf die falschen Produkte gegangen, öffnen Sie den Tab Verlauf: Jede Massenoperation wird mit den vorherigen Werten aufgezeichnet und lässt sich als ein Datensatz zurücksetzen.
Zwei Dinge löschen einen Filter absichtlich. Das Neuladen der Editor-Seite startet eine neue Seite ohne Schlüssel, der Filter ist dann weg; speichern Sie ihn als Filterprofil, wenn Sie ihn erneut brauchen. Und ein gespeicherter Filter läuft einen Tag nach seiner Anwendung ab, ein über Nacht geöffneter Tab braucht den Filter also erneut, bevor der nächste Massenlauf startet.
Die Lösung: Plugin-Speicher auf Option stellen
Öffnen Sie den Tab Einstellungen von BEAR und suchen Sie in der Spalte Allgemeine Einstellungen den Eintrag Plugin-Speicher (Plugin memory storage). Er hat zwei Werte: Option (empfohlen) und Transient. Wählen Sie Option (empfohlen) und klicken Sie auf Alle Einstellungen speichern (Save all settings). Die Einstellung gilt für den gesamten Shop, und nur ein Administrator kann sie ändern. Es gibt sie seit Version 2.2.2; aktualisieren Sie BEAR zuerst, wenn Sie sie nicht sehen.
Darum ist das wichtig:
- Option hält den Filter, die Massendaten und den Fortschrittszähler des Massenlaufs in einer Zeile der Tabelle
wp_optionspro Benutzer, benanntwoobe_memory_plus Benutzer-ID, mit ausgeschaltetem Autoload, sodass sie auf Shopseiten nie geladen wird. Eine Datenbankzeile kann nicht verdrängt werden. Caches können ihre Kopie davon verwerfen, und die nächste Anfrage liest sie einfach erneut aus der Datenbank. - Transient ist die frühere Arbeitsweise von BEAR. Auf einer Website ohne persistenten Objekt-Cache ist ein Transient ebenfalls eine Datenbankzeile und funktioniert. Mit Redis oder Memcached hält WordPress Transients nur im Cache und schreibt sie nie in die Datenbank (siehe Transients API), sodass alles, was den Cache leert, den Filter zerstört. Der Transient-Schlüssel wurde außerdem aus der IP-Adresse des Besuchers gebildet, die sich hinter manchen Proxys und CDNs zwischen Anfragen ändert und von Kollegen in einem Büro geteilt wird.
Option ist der Standard bei Neuinstallationen und bei aktualisierten Installationen, die nie einen anderen Wert gespeichert haben. Springt der Zähler trotz ausgewähltem Option weiter, ist der nächste Abschnitt der wahrscheinlichste Grund.
Alte woobe_storage_type-Snippets überschreiben die Einstellung
Jahrelang bestand die Antwort auf einen verlorenen Filter aus einer Zeile in der functions.php des Themes, die den Speicher über den Filter woobe_storage_type auf 'session' oder 'transient' umstellte. Dieser Filter existiert weiterhin und läuft, nachdem die Einstellung gelesen wurde: Was das Snippet zurückgibt, gewinnt, ganz gleich, was in den Einstellungen ausgewählt ist. Eine Website, die das Snippet vor Jahren hinzugefügt hat, läuft nach dem Update weiter mit Sessions oder Transients, während der Tab Einstellungen Option anzeigt.
Durchsuchen Sie das aktive Theme, das Child-Theme, mu-plugins und Code-Snippet-Plugins nach woobe_storage_type. Ein typischer Überrest sieht so aus:
add_filter('woobe_storage_type', function($type) {
return 'session'; // or 'transient'
});
Löschen Sie es und wählen Sie dann den Speicher in den Einstellungen. Session wird dort nicht mehr angeboten: Es hängt von der PHP- und WooCommerce-Sitzungsverwaltung des Servers ab und war von den dreien bei einer Reihe von AJAX-Anfragen das unzuverlässigste. Behalten Sie ein Snippet nur, wenn ein Test auf Ihrer Website zeigt, dass die Einstellung allein nicht funktioniert, und lassen Sie es in diesem Fall 'option' zurückgeben, damit es wenigstens den Speicher erzwingt, der eine Cache-Leerung übersteht.
Redis, Memcached und andere Caches
Die Leerung des Objekt-Caches und woobe_use_cache_flush
Bevor die Tabellenzeilen aufgebaut werden, ruft BEAR wp_cache_flush() auf, damit die Tabelle aktuelle Werte zeigt und nicht, was vor Ihrer letzten Änderung im Cache lag. Ohne persistenten Objekt-Cache leert das nur den Speicher der aktuellen Anfrage und kostet nichts. Mit Redis, Memcached oder Object Cache Pro leert es bei jedem Laden der Tabelle den gesamten Cache der Website, und genau das hat früher den Transient mit dem Filter gelöscht.
Steht der Speicher auf Option, berührt die Leerung den Filter nicht mehr. Sie kostet den Rest der Website aber weiterhin bei jedem Laden der Tabelle einen Neuaufbau des Caches. Auf einem Shop mit persistentem Objekt-Cache können Sie die Leerung abschalten:
// Child theme functions.php or a code snippets plugin.
// BEAR: do not flush the persistent object cache before drawing the products table.
add_filter( 'woobe_use_cache_flush', '__return_false' );
Der Kompromiss: Ein gerade geänderter Wert kann in der Tabelle gelegentlich noch seine alte Version zeigen, bis Sie neu laden. Das Shop-Frontend ist in beiden Fällen nicht betroffen. Der Hook ist zusammen mit den anderen Optionen auf Codeebene unter Weitere Einstellungen (implizit) aufgeführt.
Ein persistenter Objekt-Cache ist oft aktiv, ohne dass ihn jemand installiert hat: Managed Hosts und Hosting-Panels aktivieren Redis oder Memcached für Sie. Zeigt Plugins im wp-admin eine Liste Drop-ins mit object-cache.php, haben Sie einen.
Page-, Admin- und Optimierungs-Caches
Page-Caches wie WP Rocket, LiteSpeed Cache oder WP-Optimize, CDN-Regeln wie eine Cloudflare-Regel „alles cachen“ und Caches auf Hosting-Ebene dürfen /wp-admin/ oder /wp-admin/admin-ajax.php nie zwischenspeichern. Die Editor-Seite und jede Tabellenanfrage laufen über diese Adressen, und ein Administrator muss das Ergebnis der gerade vorgenommenen Änderung sehen, nicht eine gespeicherte Kopie. Die Standardeinstellungen der bekannten Plugins schließen sie bereits aus; suchen Sie bei eigenen Regeln, Server-Caches bei Managed Hosting und Funktionen zur „Admin-Optimierung“. Funktioniert der Filter bei ausgeschaltetem Caching und scheitert bei eingeschaltetem, fügen Sie die Ausschlüsse hinzu und leeren Sie jeden Cache.
Wenn der Filter nichts oder die falschen Produkte liefert
Manche Ergebnisse, die nach einem kaputten Filter aussehen, sind der Filter, der genau tut, was von ihm verlangt wurde.
Eine übergeordnete Kategorie enthält ihre Unterkategorien nicht
Das Filtern nach einer Kategorie findet die Produkte, die diesem Begriff zugeordnet sind. Ein Produkt, das nur Shoes > Sneakers zugeordnet ist, wird von Shoes nicht gefunden. Wählen Sie die Unterkategorien ebenfalls aus oder lassen Sie den Filter für die Taxonomien Ihrer Wahl auch die untergeordneten Begriffe einbeziehen:
// Child theme functions.php or a code snippets plugin.
// BEAR: filtering by a parent term also finds products of its child terms.
add_filter( 'woobe_filter_include_children', function ( $include, $taxonomy ) {
if ( in_array( $taxonomy, array( 'product_cat' ), true ) ) {
return true;
}
return $include;
}, 10, 2 );
Die Suche mit GENAU braucht den ganzen Titel
Die Verhaltensweisen der Textsuche sind ENTHÄLT (LIKE), GENAU (EXACT), NICHT (NOT), BEGINNT MIT (BEGIN) und ENDET MIT (END). GENAU vergleicht mit dem vollständigen Titel, ohne Groß- und Kleinschreibung zu beachten: Ein Wort aus einem Titel mit fünf Wörtern findet nichts. Verwenden Sie ENTHÄLT für einen Teil des Titels. Um mehrere Texte gleichzeitig zu suchen, siehe mehrere Titel im Suchfeld.
Ein exakter regulärer Preis findet nichts
Im Bereich des regulären Preises ist der untere Wert eingeschlossen und der obere ausgeschlossen, sodass 46.90 bis 46.90 ein leerer Bereich ist. Geben Sie 46.90 bis 46.91 ein. Auch die Preise von Variationen werden durchsucht: Ein variables Produkt erscheint, wenn eine seiner Variationen im Bereich liegt.
„Hervorgehoben“ ist ein Feld, kein Meta-Schlüssel
WooCommerce speichert Hervorgehoben (Featured) nicht in den Post-Meta, deshalb findet ein benutzerdefiniertes Meta-Feld, das im Tab Meta-Felder unter einem Namen wie featured angelegt wurde, nichts und kann den Filter stören, in dem es verwendet wird. Löschen Sie ein solches Feld und aktivieren Sie stattdessen die eingebaute Spalte Hervorgehoben in den Einstellungen.
Themes und Plugins, die Produktabfragen verändern
BEAR wählt Produkte mit einer normalen WordPress-Abfrage aus, daher verändert jeder Code, der Produktabfragen im Admin-Bereich oder in AJAX-Anfragen ändert, auch die Ergebnisse des Editors. Themes, die ihre eigene Standardsortierung der Produkte erzwingen, Suchplugins, die die Produktsuche umschreiben, und Transliterations-Plugins, die Text in Abfragen verändern, haben schon dazu geführt, dass der Filter den ganzen Katalog oder zufällige Produkte lieferte. Öffnen Sie auf der Editor-Seite die Browser-Konsole (F12) und prüfen Sie zuerst auf rote Fehler. Stellen Sie dann die Standardsortierung der Produkte in WooCommerce auf eine normale zurück und testen Sie, oder finden Sie das Plugin mit der Methode aus Plugins bei Massenbearbeitungen isolieren, die ein solches Plugin auch dauerhaft von den Anfragen von BEAR fernhalten kann.
Checkliste: prüfen, ob der Filter hält
- BEAR ist auf die aktuelle Version aktualisiert, und Plugin-Speicher steht auf Option (empfohlen).
- Im Theme, Child-Theme, in den mu-plugins oder in einem Snippet-Plugin ist kein
woobe_storage_type-Snippet übrig, es sei denn, es gibt'option'zurück. - Laden Sie die Editor-Seite neu, wenden Sie einen Filter an und notieren Sie die Zahl unter der Tabelle.
- Gehen Sie auf Seite 2, ändern Sie die Zeilen pro Seite, klicken Sie zum Sortieren auf eine Spalte und schalten Sie Variationen ein und aus. Die Zahl muss gleich bleiben.
- Markieren Sie zwei Produkte, führen Sie eine kleine Massenbearbeitung darauf aus und prüfen Sie den Datensatz im Verlauf. Führen Sie dann die eigentliche Operation auf dem Filter aus.
Ändert sich die Zahl trotz ausgewähltem Option und ohne Snippet weiterhin, eröffnen Sie ein Thema im BEAR-Support-Forum mit der BEAR-Version, den verwendeten Caching- und Objekt-Cache-Plugins und den beiden Zahlen, die Sie sehen.