Intereting Posts
do_shortcode с настраиваемым полем Добавление кнопки «Архив» на страницу сообщений для администраторов Клиент не может видеть обновленный динамический контент Удалить роль администратора из списка пользователей «Автор» на отдельном почтовом экране Можете ли вы настроить таргетинг на widget_class в register_sidebar? JQuery нужно определить в <head>, но Gravity Forms определяет его в <footer> Отключить действие wp_enqueue_styles для определенной страницы Запуск cron каждые 24 часа по Гринвичу -8 Как скрыть W3 Total Cache от не админов? Переключить заголовок «Сократить» Как получить сообщения, опубликованные за последние два дня с помощью WP_Query? Как я могу связать пользователей через несколько поддоменов? Как создать структуру permalink% category% /% postname% / work для пользовательского типа сообщений? Создание CSV с PHP внутри каталога плагина Как заменить или отобразить специальные символы из плагина JSON API

wp_insert_post чрезвычайно медленный на большой таблице, прямой запрос очень быстро

Стол моих сообщений составляет около 600 тыс., И я не считаю это большим. В любом случае wp_insert_post становится очень медленным. Я пытаюсь импортировать огромный список информации о гостинице в Должности. Список около 1500K большой. Вставка сообщений начинается хорошо с 200-400 сообщений в секунду, но она резко падает до abp 20-10 сообщений в секунду, когда она достигает 400K сообщений.

Когда я делаю прямой запрос в таблице сообщений, он снова вставляет 400 сообщений в секунду. Поэтому я пришел к выводу, что wp_insert_post значительно замедляет работу.

Я попробовал некоторые «трюки», чтобы улучшить скорость wp_insert_post, например:

wp_defer_term_counting( false ); wp_defer_comment_counting( false ); $wpdb->query( 'SET autocommit = 0;' ); 

и после массового импорта:

 wp_defer_term_counting( true ); wp_defer_comment_counting( true ); $wpdb->query( 'SET autocommit = 1;' ); $wpdb->query( 'COMMIT;' ); 

но это не помогает улучшить скорость вставки, на самом деле улучшения нет.

Может кто-нибудь, пожалуйста, объясните мне, что «проверка» в функции wp_insert_post замедляет ее?

Это столбец «post_name» AKA slug? он должен быть уникальным, не так ли? Есть ли еще какие-то столбцы?

Я хотел бы знать, что проверено, или что НУЖНО проверяться, потому что я серьезно подумываю о переопределении функции wp_insert_post с моим собственным, чтобы ускорить процесс.

заранее спасибо

edit – добавлен мой цикл:

 foreach($hotels as $key => $hotel) { $slug = $hotel->HotelName; $title = $hotel->HotelName; if ($hotel->translation == NULL) { $description = $hotel->Overview; } else { $description = $hotel->translation; } $hotel_id = wp_insert_post( array( //'ID' => $hotel->id, 'post_mime_type' => $hotel->id, 'comment_status' => 'closed', 'ping_status' => 'closed', 'post_author' => $author_id, 'post_name' => $slug, 'post_title' => $title, 'post_status' => 'publish', 'post_type' => 'hotel', 'post_content' => $description, ) ); } 

Solutions Collecting From Web of "wp_insert_post чрезвычайно медленный на большой таблице, прямой запрос очень быстро"

Попробуйте изменить базу данных, чтобы улучшить скорость поиска поля post_name …

 ALTER TABLE `wp_posts` ADD INDEX (`post_name`); 

Вы хотите избежать записи собственной wp_insert_post() поскольку в неожиданных местах есть небольшие трюки, которые становятся настоящей головной болью для отладки позже.

вы должны отменить код, который вы должны добавить для импорта

 wp_defer_term_counting( true ); wp_defer_comment_counting( true ); 

не устанавливайте его ложным, и после импорта вы установите его true, вы должны сделать oppsite вещь
у меня была такая же проблема, чтобы вставить 50 сообщений, на которые ушло около 7 минут, после того, как я добавил этот код для wp_insert_post, потребовалось всего 7 секунд
и вы можете добавить это тоже

 define( 'WP_IMPORTING', true ); 

и после того, как вы импортировали сообщение, добавьте это и запустите скрипт

 wp_defer_term_counting( false ); wp_defer_comment_counting( false );