как обновить сериализованные параметры программно?

15

Я хочу автоматизировать обновление параметров плагина. Есть некоторые вещи, которые я повторяю много раз.

С помощью wp-cli я знаю, что могу обновить простые опции, например:

php wp-cli.phar option update blog_public 1

Однако некоторые параметры плагина сохраняют свои параметры в сериализованной строке.

Пример сериализованного option_value в wp_options:

a:9:{s:4:"from";s:21:"xx@xxx.com";s:8:"fromname";s:51:"xxx";s:4:"host";s:13:"smtp.xx.com";s:10:"smtpsecure";s:3:"ssl";s:4:"port";s:3:"465";s:8:"smtpauth";s:3:"yes";s:8:"username";s:21:"xx@xxx.com";s:8:"password";s:13:"xxx";s:10:"deactivate";s:0:"";}

Как обновить эти параметры?

Лало
источник

Ответы:

14

Решил сам, вот как это сделать:

Если вы хотите программно обновить сериализованные опции:

скачать wp-cli с wp-cli.org

Узнайте, что является «ключом» к опциям, которые вы используете. В этом примере ключ "wp_smtp_options"

Если вы не знаете ключ, найдите в таблице wp_options и попытайтесь выяснить это.

Пример: select * from wp_options where option_name like '%smtp%'

Теперь, когда вы знаете свой ключ, используйте эту команду для сохранения вашей конфигурации в файл json:

php wp-cli.phar option get wp_smtp_options --format=json > my_saved_config.txt

Всякий раз, когда вы хотите, чтобы эта конфигурация была восстановлена, используйте эту команду

php wp-cli.phar option update wp_smtp_options --format=json < my_saved_config.txt

Примечания:

  • работает в WAMPSERVER64
  • работает с символами Юникода, такими как ñ é é
  • Вы можете иметь свой JSON-файл с отступами и пробелами, для разборчивости

Было бы здорово не использовать промежуточный файл для этой цели. Кто-нибудь знает, как это сделать?

Лало
источник
1
Спасибо - отличная работа. Если кто-то пытается написать скрипт, не требуя внешних файлов, вы можете просто поместить json в option updateстроку в одинарных кавычках. См. Мою реализацию в строке 61 здесь: gist.github.com/squarecandy/cfdead55ca1d84496044
squarecandy
см. мой ответ для "одного лайнера"
Лоран
13

WP-CLI определенно является ответом на это после обновления до 1.4.0, в котором были введены команды pluck и patch для доступа к сериализованным данным в WordPress.

Команда pluck использует этот формат для захвата сериализованных значений.

wp option pluck <key> <key-name>

Например, в опции active_plugins вы можете получить первый элемент

wp option pluck active_plugins 0

Команда patch использует этот формат для вставки, обновления или удаления сериализованных значений (действие)

wp option patch <action> <key> <key-name> <value>

Удаление первого active_plugin будет выглядеть так

wp option patch delete active_plugins 0

То же самое дополнение и патч были также добавлены для других команд, таких как postmeta, теперь вы можете использовать WP-CLI, чтобы сделать несколько крутых циклов для программного обновления сериализованных данных WordPress.

Майк Андреасен
источник
2
Это должен быть принятый ответ.
Эван Маттсон,
6

Вот как я это делаю в скрипте bash:

wp option get wp_smtp_options --format=json | php -r '
$var = json_decode( fgets(STDIN) );
$var->from = "email@email.com";
$var->fromname = "me";
print json_encode($var);
' | wp option set wp_smtp_options --format=json
Laurent
источник
0

WP-CLI команда optionдействительно использует WordPress' Options API , чтобы делать свою работу. Учитывая, например, подкоманду update, правильный ввод, arrayвы должны быть в состоянии сделать это с WP-CLI. Вы должны использовать этот --formatпараметр здесь, чтобы убедиться, что вы получаете то же самое, в jsonцелом работает нормально для updateподкоманды. Обратите внимание, что подкоманда getдолжна возвращать вам вариант не сериализованным, поскольку используется API параметров, который затем можно сохранять, изменять и / или передавать / настраивать в других / новых установках.

Nicolai
источник
Это не работает: wp option get wp_smtp_options > savedconfiguration.txt wp option update wp_smtp_options < savedconfiguration.txt первая команда сохраняет как массив, а вторая не принимает массив. Я думаю, что я должен сначала сериализовать это, вы знаете, как это сделать?
Лало
Вы пытались использовать formatпараметр? @lalo edit: только что видел, как ты понял это
Николай
в wp-cli.org не сказано, какие доступны параметры для formatпараметра. Интересно, возможно ли это без использования промежуточного файла, как я написал в своем ответе.
Лало
Вы должны посмотреть на источник, чтобы получить полный обзор formatпараметра, который иногда отличается от (под) команды до (под) команды. Это, безусловно, возможно, например, написав сценарий bash и сохранив данные в переменной. @lalo
Николай
Вот исходный код, но я не понимаю, где --formatдоступны варианты: github.com/wp-cli/wp-cli/blob/master/php/commands/…
lalo