WP All Import — это самый лучший в своей нише WordPress-плагин для импорта XML, XLS, который можно, например, использовать для синхронизации товарного каталога WooCommerce с данными 1С.
Что же с ним не так?
WP All Import не использует WP-Cron
в полной мере, а требует явного вызова wp-cron.php
со своими параметрами.
Фактически он требует двух вызовов: первый, так называемый триггер, запускающий импорт, и второй — шаг итерации импорта (тик), в котором обрабатывается очередная порция данных.
Разработчики рекомендуют тика ставить время повторения около 2 минут, но на практике этого времени может не хватить. Увеличение же этого времени приводит к увеличению пауз в импорте и росту общего времени импорта. В результате оно реально может вырасти до нескольких часов на больших объемах данных.
Хоть WP All Import и умеет скачивать файлы у поставщика, но работает только с кодировкой UTF-8
, а большинство российских поставщиков дают те же CSV файлы в Windows-1251
. Загрузки все равно требуют дополнительной обработки.
Всё это явно просится быть перенесённым на уровень серверного ПО, а не выполняться в админке WordPress
или вызываться wget
ом по крону. Но, к сожалению, этот плагин не умеет работать ни с WP-CLI
, ни в командной строке. Так как же быть?
Решение было найдено в виде поста «WP All Import cron from CLI«.
Идея, реализованная Rolandow, заключается в прямом вызове PHP CLI сначала триггера, а потом последовательном вызове тиков WP All Import с секундной задержкой до тех пор, пока очередной тик не скажет, что импортировать больше нечего.
Какие плюсы данного подхода?
- Так как всё выполняется через CLI — лимитов никаких нет
- Веб-сервер (Apache, nGinx) не грузится
- Тики итераций идут вплотную, не образуя дыр по времени
- Данное решение удобно вешается на крон
Импорт, который до переделок занимал 10 часов и выполнялся в браузере (при этом он должен был быть в открытом состоянии), после указанной доработки — стал бегать за час-полтора. Прирост по скорости налицо.
Также стоит сказать отдельное спасибо Ивану Никитину за прекрасную доработку данного решения и доведения его до продуктового состояния.
Итак, чтобы всё это заработало, в скрипте задать следующие переменные:
- JOB_ID — номер задания WP All Import (берется в админке WP All Import)
- KEY — ключ для запуска (берется там же)
- LOGFILE — имя и расположение файла лога
- CURLOG — имя временного лога (он жизненно необходим для работы!)
- ROOT_DIR — путь к руту сайта
Собственно, доработанный bash-скрипт:
#!/bin/bash SITE="your-site.ru" JOB_ID=999 KEY="Your-Key" LOGFILE=/var/www/$SITE/logs/wp-all-import.log CURLOG=/var/www/$SITE/logs/wp-all-import-$JOB_ID.tmp ROOT_DIR=/var/www/$SITE/www DONE=0 function log { echo "$(date): $*" >>$LOGFILE } echo "WP All Import:" $SITE " job id:" $JOB_ID cd $ROOT_DIR log "Start import for job id $JOB_ID" php -e -r 'parse_str("import_key='$KEY'&import_id='$JOB_ID'&action=trigger", $_GET); include "wp-cron.php";' >>$LOGFILE 2>&1 sleep 1 while [ $DONE -eq 0 ] do php -e -r 'parse_str("import_key='$KEY'&import_id='$JOB_ID'&action=processing", $_GET); include "wp-cron.php";' >$CURLOG 2>&1 cat $CURLOG >>$LOGFILE DONE=$(grep 'is not triggered' $CURLOG | wc -l) sleep 1 done rm $CURLOG log "End of import for jobId" $JOB_ID log "" log ""
Комментарии и вопросы приветствуются.
Ссылки
Источник: https://www.kobzarev.com/wordpress/wp-all-import-cli/