Задать вопрос
@easycode
не боюсь задавать глупые вопросы ))

Долгий wp_insert_post() при массовой вставке (создании) записей в WordPress — как ускорить?

Переношу сайт-каталог на платформу WordPress.
В итоге в WordPress имеется 4580 рубрик, с вложенностью до 4-х уровней.
А также в результате переноса должно быть создано более 50 тыс. записей.
Код создания записи выглядит примерно так:

<?php
 function saveSchool($url)
    {
        $start_time = microtime(true);
		
		// здесь подготовка переменных для массива $post - не интересно...
        
        $post = array(
          'comment_status' => 'open',
          'ping_status' => 'open',
          'post_author' => 1, 
          'post_category' => array($this->currCatId),
          'post_content' => $content, 
          'post_date' => $date_pub, 
          'post_date_gmt' => gmdate('Y-m-d H:i:s', strtotime($date_pub)), 
          'post_excerpt' => '', 
          'post_name' => '', 
          'post_status' => 'publish',
          'post_title' => $title, 
          'post_type' => 'post',
        );
        
        $post_id = wp_insert_post( $post );  
        
        if (!is_wp_error($post_id) && $post_id > 0) {            
            add_post_meta($post_id, 'url', $url);
            add_post_meta($post_id, 'address', $data['address']);
            add_post_meta($post_id, 'phone', $data['phone']);
            
            $this->_echo("Запись $post_id сохранена" . sprintf(" - %.3f с", microtime(true)-$start_time)); 
            
        } else {
            $this->_echo("ОШИБКА создания поста: {$article['title']} / " . $post_id->get_error_message(), 'red');
            $this->_log("ОШИБКА создания поста: {$article['title']} / " . $post_id->get_error_message());
            return null;
        }
    }


Однако столкнулся с такой ситуацией: изначально время выполнения wp_insert_post стало расти!
Сейчас скрипт продолжает работать, в базу добавлено всего то 2000 записей, а функции wp_insert_post и add_post_meta выполняются по 10 секунд и время растет каждый раз при увеличении количества записей.

Время выполнения трех функций add_post_meta() не более 0,05 секунд., проблема в wp_insert_post()

Удивительно еще и то что встречаются wp_insert_post() вставляющие запись за 0.440 секунд, на ряду с другими, которые делают это за более чем 10 секунд.

Я сначала думал что это какой-нибудь плагин у меня такую доп. нагрузку на wp_insert_post создает, отключил все плагины, удалил все ping-сервисы, естественно отключил механизм ревизий записей в WordPress - но ничего не помогло. Ясное дело что проблема в wp_insert_post и add_post_meta, неужели придется реализовывать вставку через прямые SQL-запросы не используя функционал WordPress ? Может есть какие-то подводные камни у wp_insert_post или с таблицей posts нужно что-то сделать? Может настройки MySQL подкрутить?
  • Вопрос задан
  • 1232 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@easycode Автор вопроса
не боюсь задавать глупые вопросы ))
Решение найдено. Посмотрел в логи MySQL, а там куча запросов вида:
SELECT post_name FROM wp_posts WHERE post_name = 'труляля-765' AND post_type = 'post' AND ID != 0 LIMIT 1

далее в массиве для wp_insert_post обратил внимание на
'post_name' => '',
тот самый slug используемый в URL'е (ЧПУ WordPress'а).
быстренько добавил генератор уникальных значений post_name и запросы полетели (максимум 0,5 секунд).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Vovanys
@Vovanys
проверь как ведет себя MySQL при вставке когда запускаешь wp_insert_post, включи slow log
м.б. как временный перенести таблицы в оперативу, а потом обратно на диск.
так же смотри чего в php происходит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы