¿Cómo actualizar las opciones serializadas mediante programación?

15

Quiero automatizar la actualización de las opciones del complemento. Hay algunas cosas que repito mucho.

Con wp-cli sé que puedo actualizar opciones simples como esta:

php wp-cli.phar option update blog_public 1

Sin embargo, algunas opciones de complementos guardan sus opciones en una cadena serializada.

Ejemplo de valor_opción serializado en 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:"";}

¿Cómo actualizar esas opciones?

lalo
fuente

Respuestas:

14

Lo resolví yo mismo, así es como lo hago:

Si desea actualizar programáticamente las opciones serializadas:

descargue wp-cli desde wp-cli.org

Descubra cuál es la "clave" para las opciones que está utilizando. En este ejemplo, la clave es "wp_smtp_options"

Si no conoce la clave, busque en la tabla wp_options e intente averiguarlo.

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

Ahora que conoce su clave, use este comando para guardar su configuración en el archivo json:

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

Siempre que desee restaurar esa configuración, use este comando

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

Notas:

  • trabaja en WAMPSERVER64
  • funciona con caracteres unicode como ñ á é
  • puedes tener tu archivo json con rellenos y espacios, para legibilidad

Sería genial no tener que usar un archivo intermedio para este propósito. ¿Alguien sabe cómo hacerlo?

lalo
fuente
1
Gracias, buen trabajo. Si alguien está tratando de escribir un script sin requerir archivos externos, simplemente puede poner el json en la option updatelínea entre comillas simples. Vea mi implementación en la línea 61 aquí: gist.github.com/squarecandy/cfdead55ca1d84496044
squarecandy
mira mi respuesta para un "one liner"
Laurent
13

WP-CLI es definitivamente la respuesta a esto después de la actualización a 1.4.0 que introdujo los comandos de arranque y parche para acceder a datos serializados en WordPress.

El comando pluck toma este formato para obtener valores serializados

wp option pluck <key> <key-name>

Por ejemplo, en la opción active_plugins puede tomar el primer elemento

wp option pluck active_plugins 0

El comando parche toma este formato para insertar, actualizar o eliminar valores serializados (la acción)

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

Eliminar el primer active_plugin se vería así

wp option patch delete active_plugins 0

También se agregaron el mismo pluck y parche para otros comandos como postmeta, ahora puede usar WP-CLI para hacer algunos bucles geniales para actualizar los datos serializados de WordPress mediante programación

Mike Andreasen
fuente
2
Esta debería ser la respuesta aceptada.
Evan Mattson
6

Así es como lo hago en un 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
fuente
0

El comando WP-CLIoption usa la API de opciones de WordPress para hacer su trabajo. Dado, por ejemplo, con el subcomando update, una entrada correcta, una array, debería poder hacer esto con WP-CLI. Debe usar el --formatparámetro aquí, para asegurarse de obtener el mismo, jsongeneralmente funciona bien para el updatesubcomando. Tenga en cuenta que el subcomando getdebe devolverle la opción sin serializar, porque se usa la API de Opciones, que luego puede guardar, modificar y / o transferir / configurar en otras / nuevas instalaciones.

Nicolai
fuente
Esto no funciona: el wp option get wp_smtp_options > savedconfiguration.txt wp option update wp_smtp_options < savedconfiguration.txt primer comando se guarda como una matriz, pero el segundo no acepta una matriz. Supongo que debería serializarlo primero, ¿sabes cómo hacerlo?
lalo
¿Intentaste aprovechar el formatparámetro? @lalo edit: acabo de ver que lo descubriste ..
Nicolai
en wp-cli.org no dice cuáles son las opciones disponibles para el formatparámetro. Me pregunto si podría ser posible sin tener que usar un archivo intermedio como escribí en mi respuesta.
lalo
Debe mirar la fuente para obtener una visión general completa del formatparámetro, que a veces difiere del (sub) comando al (sub) comando. Seguramente es posible, por ejemplo, escribiendo un script bash y almacenando los datos en una variable. @lalo
Nicolai
aquí está el código fuente, pero no entiendo dónde están --formatlas opciones disponibles: github.com/wp-cli/wp-cli/blob/master/php/commands/…
lalo