Miałem kiedyś podobne problemy z niestandardowym importem CSV, ale skończyło się na użyciu niestandardowego kodu SQL dla wstawiania zbiorczego. Ale do tej pory nie widziałem tej odpowiedzi:
Zoptymalizować wstawianie i usuwanie wpisów dla operacji masowych?
używać, wp_defer_term_counting()
aby włączyć lub wyłączyć liczenie terminów.
Ponadto, jeśli sprawdzisz źródło wtyczki importera WordPress, zobaczysz te funkcje tuż przed importem zbiorczym:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
a następnie po wkładce zbiorczej:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
To może być coś do wypróbowania ;-)
Importowanie postów w wersji roboczej zamiast publikowania również przyspieszy, ponieważ powolny proces znajdowania unikalnego ślimaka dla każdego z nich jest pomijany. Można np. Opublikować je później w mniejszych krokach, ale należy pamiętać, że tego rodzaju podejście musiałoby w jakiś sposób oznaczać zaimportowane posty, więc nie publikujemy żadnych wersji roboczych później! Wymagałoby to starannego planowania i prawdopodobnie niestandardowego kodowania.
Jeśli istnieje np. Wiele podobnych tytułów postów (takich samych post_name
) do zaimportowania, wp_unique_post_slug()
może stać się powolny z powodu iteracji zapytania pętli w celu znalezienia dostępnego ślimaka. Może to generować ogromną liczbę zapytań db.
Od WordPress 5.1 pre_wp_unique_post_slug
filtr jest dostępny, aby uniknąć iteracji pętli dla ślimaka. Zobacz bilet podstawowy nr 21112 . Oto przykład:
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
);
Jeśli spróbujemy np. $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
Z $suffix
as $post_id
, to zauważymy, że $post_id
zawsze 0
dotyczy to nowych postów, zgodnie z oczekiwaniami. Istnieją różne sposoby generowania unikalnych liczb w PHP, na przykład uniqid( '', true )
. Ale używaj tego filtra ostrożnie, aby upewnić się, że masz unikalne ślimaki. Możemy na przykład uruchomić zapytanie dotyczące liczby grup, post_name
aby się upewnić.
Inną opcją byłoby użycie WP-CLI, aby uniknąć przekroczenia limitu czasu. Zobacz np. Moją odpowiedź opublikowaną na temat tworzenia 20 000 postów lub stron przy użyciu pliku .csv?
Następnie możemy uruchomić nasz niestandardowy skrypt importu PHP import.php
za pomocą komendy WP-CLI:
wp eval-file import.php
Unikaj także importowania dużej liczby hierarchicznych typów postów, ponieważ bieżący interfejs użytkownika wp-admin nie radzi sobie z tym dobrze. Zobacz np. Niestandardowy typ postu - lista postów - biały ekran śmierci
Oto świetna wskazówka od @otto:
Przed wstawieniem zbiorczym wyłącz autocommit
tryb jawnie:
$wpdb->query( 'SET autocommit = 0;' );
Po wstawieniu luzem uruchom:
$wpdb->query( 'COMMIT;' );
Myślę również, że dobrym pomysłem byłoby wykonanie pewnych czynności porządkowych, takich jak:
$wpdb->query( 'SET autocommit = 1;' );
Nie testowałem tego na MyISAM, ale to powinno działać na InnoDB .
Jak wspomniano przez @kovshenin, ta wskazówka nie zadziała w MyISAM .