como atualizar opções serializadas programaticamente?

15

Quero automatizar a atualização das opções do plug-in. Há algumas coisas que repito muito.

Com o wp-cli , sei que posso atualizar opções simples como esta:

php wp-cli.phar option update blog_public 1

No entanto, algumas opções de plug-in salvam suas opções em uma sequência serializada.

Exemplo de option_value serializado em wp_options:

a:9:{s:4:"from";s:21:"[email protected]";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:"[email protected]";s:8:"password";s:13:"xxx";s:10:"deactivate";s:0:"";}

Como atualizar essas opções?

lalo
fonte

Respostas:

14

Resolvi eu mesmo, é assim que se faz:

Se você deseja atualizar programaticamente as opções serializadas:

faça o download do wp-cli em wp-cli.org

Descubra qual é a "chave" para as opções que você está usando. Neste exemplo, a chave é "wp_smtp_options"

Se você não souber a chave, procure na tabela wp_options e tente descobrir.

Exemplo: select * from wp_options where option_name like '%smtp%'

Agora que você conhece sua chave, use este comando para salvar sua configuração no arquivo json:

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

Sempre que você desejar que essa configuração seja restaurada, use este comando

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

Notas:

  • trabalha em WAMPSERVER64
  • trabalha com caracteres unicode como ñ á é
  • você pode ter seu arquivo json com preenchimentos e espaços, para legibilidade

Seria ótimo não precisar usar um arquivo intermediário para esse fim. Alguém sabe como fazer isso?

lalo
fonte
1
Obrigado - ótimo trabalho. Se alguém estiver tentando escrever um script sem precisar de arquivos externos, basta colocar o json na option updatelinha entre aspas simples. Ver a minha aplicação na linha 61 aqui: gist.github.com/squarecandy/cfdead55ca1d84496044
squarecandy
veja minha resposta para um "one liner"
Laurent
13

O WP-CLI é definitivamente a resposta para isso após a atualização para a 1.4.0, que introduziu os comandos de remoção e correção para acessar dados serializados no WordPress.

O comando pluck usa esse formato para capturar valores serializados

wp option pluck <key> <key-name>

Por exemplo, na opção active_plugins, você pode pegar o primeiro item

wp option pluck active_plugins 0

O comando patch usa esse formato para inserir, atualizar ou remover valores serializados (a ação)

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

Excluir o primeiro active_plugin ficaria assim

wp option patch delete active_plugins 0

A mesma ação e correção também foram adicionadas a outros comandos, como o postmeta; agora você pode usar o WP-CLI para fazer alguns loops legais para atualizar programaticamente os dados serializados do WordPress.

Mike Andreasen
fonte
2
Essa deve ser a resposta aceita.
Evan Mattson
6

Aqui está como eu faço isso em um script bash:

wp option get wp_smtp_options --format=json | php -r '
$var = json_decode( fgets(STDIN) );
$var->from = "[email protected]";
$var->fromname = "me";
print json_encode($var);
' | wp option set wp_smtp_options --format=json
Laurent
fonte
0

O comando WP-CLIoption usa a API de opções do WordPress para fazer seu trabalho. Dado, por exemplo, com o subcomando update, uma entrada correta arraye você deve conseguir fazer isso com o WP-CLI. Você deve usar o --formatparâmetro aqui, para garantir o mesmo, jsongeralmente funciona bem para o updatesubcomando. Observe que o subcomando getdeve retornar a opção não serializada, porque a API Options é usada, que você pode salvar, modificar e / ou transferir / configurar em outras / novas instalações.

Nicolai
fonte
Isso não funciona: o wp option get wp_smtp_options > savedconfiguration.txt wp option update wp_smtp_options < savedconfiguration.txt primeiro comando salva como matriz, mas o segundo não aceita uma matriz. Eu acho que eu deveria serializá-lo primeiro, você sabe como fazer isso?
Lalo
Você tentou alavancar o formatparâmetro? @lalo edit: apenas vi você descobri-lo ..
Nicolai
em wp-cli.org não diz quais são as opções disponíveis para o formatparâmetro. Gostaria de saber se isso seria possível sem ter que usar um arquivo intermediário, como escrevi na minha resposta.
Lalo 21/08
Você precisa olhar a fonte para obter uma visão geral completa do formatparâmetro, que às vezes difere do comando (sub) para o comando (sub). Certamente é possível, por exemplo, escrevendo um script bash e armazenando os dados em uma variável. @lalo
Nicolai
aqui está o código-fonte, mas não entendo onde estão --formatas opções disponíveis: github.com/wp-cli/wp-cli/blob/master/php/commands/...
lalo