Ich hatte vor einiger Zeit ähnliche Probleme mit einem benutzerdefinierten CSV-Import, habe jedoch letztendlich einige benutzerdefinierte SQL-Anweisungen für die Masseneinfügung verwendet. Aber ich hatte diese Antwort bis dahin noch nicht gesehen:
Post Insert und Delete für Bulk-Operationen optimieren?
benutzen wp_defer_term_counting()
, um die Zählung von Begriffen zu aktivieren oder zu deaktivieren.
Auch wenn Sie den Quellcode für das WordPress-Import-Plugin auschecken, sehen Sie diese Funktionen unmittelbar vor dem Massenimport:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
und dann nach dem Bulk Insert:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Das könnte man also ausprobieren ;-)
Beiträge als Entwurf importieren statt veröffentlichen beschleunigt die Arbeit ebenfalls, da der langsame Prozess, für jeden einen eindeutigen Slug zu finden, übersprungen wird. Man könnte sie zB später in kleineren Schritten veröffentlichen, aber beachten Sie, dass diese Art der Vorgehensweise die importierten Beiträge irgendwie markieren müsste, damit wir später nicht nur irgendwelche Entwürfe veröffentlichen! Dies würde eine sorgfältige Planung und höchstwahrscheinlich eine benutzerdefinierte Codierung erfordern.
Wenn zB viele ähnliche Post-Titel (gleich post_name
) importiert werden sollen, dannwp_unique_post_slug()
kann dies aufgrund der Iteration der Schleifenabfrage langsam werden, um einen verfügbaren Slug zu finden. Dies kann möglicherweise eine große Anzahl von Datenbankabfragen erzeugen.
Seit WordPress 5.1 ist der pre_wp_unique_post_slug
Filter verfügbar, um die Schleifeniteration für den Slug zu vermeiden. Siehe Kernticket # 21112 . Hier ist ein Beispiel:
add_filter( 'pre_wp_unique_post_slug',
function( $override_slug, $slug, $post_id, $post_status, $post_type, $post_parent ) {
// Set a unique slug value to shortcircuit the slug iteration loop.
// $override_slug = ...
return $override_slug;
}, 10, 6
);
Wenn man es zB $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
mit $suffix
as versucht $post_id
, dann würden wir feststellen, dass dies erwartungsgemäß $post_id
immer 0
für neue Beiträge gilt. Es gibt jedoch verschiedene Möglichkeiten, eindeutige Zahlen in PHP zu generieren, wie z uniqid( '', true )
. Verwenden Sie diesen Filter jedoch mit Sorgfalt, um sicherzustellen, dass Sie eindeutige Schnecken haben. Wir könnten zB später eine Gruppenzählungsabfrage durchführen post_name
, um sicherzugehen.
Eine andere Möglichkeit wäre die Verwendung von WP-CLI , um eine Zeitüberschreitung zu vermeiden. Siehe z. B. meine Antwort für das Erstellen von 20.000 Posts oder Pages mit einer CSV-Datei?
Dann können wir unser benutzerdefiniertes PHP-Importskript import.php
mit dem WP-CLI-Befehl ausführen :
wp eval-file import.php
Vermeiden Sie auch den Import einer großen Anzahl hierarchischer Beitragstypen, da die aktuelle Benutzeroberfläche von wp-admin dies nicht gut handhabt. Siehe zB Benutzerdefinierter Beitragstyp - Liste der Beiträge - weißer Bildschirm des Todes
Hier ist der großartige Tipp von @otto:
Vor Bulk - Einsätze , deaktivieren Sie den autocommit
Modus explizit:
$wpdb->query( 'SET autocommit = 0;' );
Führen Sie nach den Masseneinfügungen Folgendes aus:
$wpdb->query( 'COMMIT;' );
Ich denke auch, dass es eine gute Idee wäre, etwas Haushalt zu führen wie:
$wpdb->query( 'SET autocommit = 1;' );
Ich habe dies nicht auf MyISAM getestet, aber dies sollte auf InnoDB funktionieren .
Wie von @kovshenin erwähnt, würde dieser Tipp für MyISAM nicht funktionieren .