Проблема
Мы все были в такой ситуации, и многие вопросы на этом сайте нуждаются в подобном решении. Вы должны либо обновить базу данных, либо автоматически вставить много данных, конвертировать meta_keys
или что-то подобное.
Конечно, в работающей системе, основанной на лучших практиках, этого не должно происходить.
Но как бы то ни было, я хотел бы услышать ваше личное решение этой проблемы и почему вы выбрали свое.
Вопрос
Как реализовать одноразовые скрипты в вашей (работающей) установке WordPress?
Проблема здесь в основном из-за следующих причин:
- Скрипты, вставляющие данные, не должны запускаться более одного раза
- Скрипты, которые требуют большого количества ресурсов, не должны запускаться в то время, когда их нельзя контролировать
- Они не должны быть запущены случайно
Причина, которую я спрашиваю
У меня есть своя практика, я собираюсь опубликовать ее в ответах. Поскольку я не знаю, является ли это лучшим решением, я бы хотел узнать о вашем. Кроме того, это вопрос, который часто задают в контексте других вопросов, и было бы здорово иметь ресурс, собирающий идеи.
с нетерпением жду учиться у вас :)
источник
wp-cron
запланированных событиях.Ответы:
Я для себя использую комбинацию из:
Состав
Я использую файл (
onetime.php
) в моей include-папкеinc
, которая включена вfunctions.php
и удалена оттуда после использования.Файл для самого скрипта
По моему
onetime.php
моя функцияf711_my_onetime_function()
размещена. Как это может быть любая функция. Я предполагаю, что ваш скрипт протестирован и работает правильно.Чтобы добиться контроля над выполнением скрипта, я использую оба
Контроль возможностей
Чтобы другие пользователи не могли случайно выполнить мой скрипт:
или
переходный процесс
чтобы я не мог случайно выполнить сценарий более одного раза.
Файл для выполнения скрипта в моей функции
f711_my_onetime_function()
будет выглядеть так:Причина, по которой я установил переходный процесс сразу после проверки, существует ли он, заключается в том, что я хочу, чтобы функция выполнялась после того, как скрипт был заблокирован от повторного использования.
Если мне нужен какой-либо вывод из моей функции, я либо распечатываю его как комментарий в нижнем колонтитуле, либо иногда я даже фильтрую содержимое.
Время блокировки установлено на 10 минут, но может быть скорректировано в соответствии с вашими потребностями.
уборка
После успешного выполнения моего сценария я удаляю
include
сfunctions.php
и удаляюonetime.php
с сервера. Поскольку я использовал время ожидания для переходного процесса, мне не нужно очищать базу данных, но, конечно, вы также можете удалить переходный процесс после удаления файла.источник
Вы также можете сделать это:
запустить
onetime.php
и переименовать его после выполнения.источник
Для этого я создал скрипт Phing для командной строки, это не что иное, как загрузка внешнего скрипта для запуска. Причина, по которой я использовал его через CLI, заключается в следующем:
Таким образом, вы можете использовать Phing или PHP CLI и спать по ночам. WP-CLI также является хорошей альтернативой, хотя я забыл, если вы можете использовать его вне веб-корня.
Поскольку это популярный пост, вот пример скрипта: https://github.com/wycks/WordPhing (run.php)
источник
Еще один довольно простой способ запуска одноразового скрипта - сделать это с помощью плагина MU.
Поместите код в некоторый файл PHP (например,
one-time.php
), который вы загружаете в папку ваших плагинов MU (по умолчанию/wp-content/mu-plugins
), настройте права доступа к файлу, запустите плагин (то есть, в соответствии с выбранным вами хуком, вам просто нужно посетить веб-интерфейс / backend), и все готово.Вот образец:
Без комментариев и прочего, это выглядит так:
источник
В идеальных условиях я бы зашёл на сервер и сам выполнил функцию с помощью wp-cli.
Однако это часто невозможно, поэтому я стараюсь установить переменную $ _GET и подключить ее к 'init', например:
затем нажмите
и отключите крючок, когда это будет сделано.
источник
Иногда я использовал функцию, подключенную к деактивации плагина.
Смотрите здесь Обновление старых ссылок на довольно постоянные ссылки Пользовательский тип сообщения
Как только плагины могут активировать только администраторы, возможен побочный эффект.
Нет необходимости удалять файл после деактивации, он не будет включен в wordress. В зависимости, если вы хотите запустить его снова, вы можете. Активация и деактивация снова.
И иногда я использовал переходный процесс, как в ответе @fischi. Например, запрос здесь для создания продуктов woocommerce из изображений или здесь Удаление / замена тегов img в содержимом сообщений для автоматически публикуемых сообщений.
Комбинация обоих может быть альтернативой.
источник
Определенно вы можете, просто создайте свой одноразовый код в качестве плагина.
Проблема, как мне активировать этот плагин, не нажимая ссылку Активировать?
просто добавить
activate_plugins('onetime/index.php');
вfunctions.php
или Использование должно использовать плагины, http://codex.wordpress.org/Must_Use_Plugins
Попробуйте выполнить разные действия, например, когда вы хотите запустить одноразовый плагин,
admin_init - после init admin
init - wordpress init
wp - когда WordPress загружен
источник
Другой способ - установить глобальный wp_option, когда работа будет выполнена, и проверять эту опцию каждый раз, когда выполняется ловушка инициализации.
Естественно, вам не нужно иметь этот код навсегда (даже если это простое чтение из базы данных), поэтому вы, вероятно, сможете удалить код, когда работа будет завершена. Также вы можете вручную изменить значение этой опции на 0, если вам нужно повторно выполнить код.
источник
Мой подход немного отличается в этом. Мне нравится добавлять свой одноразовый скрипт как функцию в файл function.php моей темы и запускать его по определенному GET-запросу.
Чтобы запустить это, просто посетите URL "www.sitename.com/?linkupdate"
До сих пор это работает нормально для меня ...
Есть ли у этого метода недостатки? Просто интересуюсь...
источник
Я просто использую одну пользовательскую страницу шаблона продукта, которую я не использую и не подключена ни к чему на общедоступном сервере.
Например, если у меня есть страница отзыва, которая не является активной (в черновом режиме и т. Д.), Но подключена, например, к одному шаблону страницы
single-testimonial.php
- я могу разместить там функции, загрузить страницу с помощью функции apreview
и т. Д. запущен один раз. Также очень легко вносить изменения в функцию в случае отладки.Это действительно легко, и я предпочитаю его использовать,
init
потому что у меня больше контроля над тем, когда и как он был запущен. Просто мои предпочтения.источник
На случай, если это поможет, это то, что я сделал, и это работает хорошо:
источник