У мене були подібні проблеми колись тому зі спеціальним імпортом 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()
можуть стати повільними, завдяки ітерації запитів циклу, щоб знайти доступний слизь. Це, можливо, може генерувати величезну кількість db запитів.
Оскільки 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 .