Когда-то у меня были похожие проблемы с пользовательским импортом в CSV, но в итоге я использовал некоторый пользовательский SQL для массовой вставки. Но я не видел этот ответ к тому времени:
Оптимизировать пост вставки и удаления для массовых операций?
использовать, wp_defer_term_counting()
чтобы включить или отключить подсчет сроков.
Также, если вы проверите источник для плагина импорта WordPress, вы увидите эти функции непосредственно перед массовым импортом:
wp_defer_term_counting( true );
wp_defer_comment_counting( true );
а затем после основной вставки:
wp_defer_term_counting( false );
wp_defer_comment_counting( false );
Так что это может быть что-то попробовать ;-)
Импорт сообщений в виде черновика вместо публикации также ускорит процесс, поскольку медленный процесс поиска уникального слагаемого для каждого из них пропускается. Можно, например, опубликовать их позже небольшими шагами, но учтите, что при таком подходе нужно каким-то образом пометить импортированные записи, поэтому мы не будем публиковать черновики позже! Это потребует тщательного планирования и, скорее всего, некоторого пользовательского кодирования.
Если, например, post_name
нужно импортировать много похожих заголовков (одинаковых ), то это wp_unique_post_slug()
может замедлиться из-за итерации цикла, чтобы найти доступную порцию. Это может генерировать огромное количество запросов БД.
Начиная с WordPress 5.1, pre_wp_unique_post_slug
фильтр доступен, чтобы избежать итерации цикла для слага. Смотрите основной билет # 21112 . Вот пример:
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
);
Если вы попробуете, например, $override_slug = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"
с $suffix
as $post_id
, то мы бы отметили, что $post_id
всегда 0
для новых сообщений, как и ожидалось. Существуют различные способы генерирования уникальных чисел в PHP, например uniqid( '', true )
. Но используйте этот фильтр осторожно, чтобы убедиться, что у вас есть уникальные слизни. Мы могли бы, например, запустить запрос на подсчет группы потом, post_name
чтобы быть уверенным.
Другой вариант - использовать WP-CLI, чтобы избежать тайм-аута. См., Например, мой ответ, опубликованный для создания 20000 сообщений или страниц с использованием файла .csv?
Затем мы можем запустить наш собственный скрипт импорта PHP import.php
с помощью команды WP-CLI:
wp eval-file import.php
Также избегайте импорта большого количества иерархических типов записей, так как текущий пользовательский интерфейс wp-admin плохо с этим справляется. См. Например, Пользовательский тип сообщения - список сообщений - белый экран смерти
Вот отличный совет от @otto:
Перед массовыми вставками отключите autocommit
режим явно:
$wpdb->query( 'SET autocommit = 0;' );
После массовых вставок запустите:
$wpdb->query( 'COMMIT;' );
Я также думаю, что было бы неплохо заняться уборкой, например:
$wpdb->query( 'SET autocommit = 1;' );
Я не проверял это на MyISAM, но это должно работать на InnoDB .
Как упомянул @kovshenin, этот совет не сработает для MyISAM .