web-dev-qa-db-fra.com

Comment mettre à jour une option 'array' en utilisant wp-cli

J'essaie d'écrire un script bash pour automatiser la synchronisation d'un site actif sur un site de développement. J'ai les notions de base, telles que l'exportation de la base de données de production et l'importation/la mise à jour des URL dans le site de dev, mais j'ai besoin d'aide pour mettre à jour une option dont les données sont enregistrées sous la forme d'un tableau.

Plus précisément, je souhaite modifier le paramètre Stripe de Woocommerce à l'aide de wp-cli.

Je peux voir l'option utilisant wp-cli:

$ wp option get woocommerce_stripe_settings
array (
  'enabled' => 'yes',
  'title' => 'Credit Card (Stripe)',
  'description' => 'Pay with your credit card via Stripe.',
  'testmode' => 'no',
  'test_secret_key' => 'sk_test_xxxxxxxxxxxxxxxxxx',
  'test_publishable_key' => 'pk_test_xxxxxxxxxxxxxxxxxx',
  'secret_key' => 'sk_live_xxxxxxxxxxxxxxxxxx',
  'publishable_key' => 'pk_live_xxxxxxxxxxxxxxxxxx',
  'capture' => 'yes',
  'stripe_checkout' => 'no',
  'allow_remember_me' => 'yes',
  'stripe_checkout_locale' => 'en',
  'stripe_bitcoin' => 'no',
  'stripe_checkout_image' => '',
  'saved_cards' => 'yes',
  'logging' => 'no',
  'Apple_pay_domain_set' => 'yes',
  'statement_descriptor' => 'Statement From',
  'request_payment_api' => 'no',
  'Apple_pay' => 'yes',
  'Apple_pay_button' => 'black',
  'Apple_pay_button_lang' => 'en',
)

J'ai essayé d'utiliser la valeur sérialisée obtenue en interrogeant directement la base de données, en mettant à jour le s:2:"no" en s:3:"yes", mais cela ne semblait pas enregistrer correctement la valeur:

wp option update woocommerce_stripe_settings 'a:22:{s:7:"enabled";s:3:"yes";s:5:"title";s:20:"Credit Card (Stripe)";s:11:"description";s:37:"Pay with your credit card via Stripe.";s:8:"testmode";s:3:"yes";s:15:"test_secret_key";s:32:"sk_test_xxxxxxxxxxxxxxxxxxxxxxxx";s:20:"test_publishable_key";s:32:"pk_test_xxxxxxxxxxxxxxxxxxxxxxxx";s:10:"secret_key";s:32:"sk_live_xxxxxxxxxxxxxxxxxxxxxxxx";s:15:"publishable_key";s:32:"pk_live_xxxxxxxxxxxxxxxxxxxxxxxx";s:7:"capture";s:3:"yes";s:15:"stripe_checkout";s:2:"no";s:17:"allow_remember_me";s:3:"yes";s:22:"stripe_checkout_locale";s:2:"en";s:14:"stripe_bitcoin";s:2:"no";s:21:"stripe_checkout_image";s:0:"";s:11:"saved_cards";s:3:"yes";s:7:"logging";s:2:"no";s:20:"Apple_pay_domain_set";s:3:"yes";s:20:"statement_descriptor";s:50:"                                                  ";s:19:"request_payment_api";s:2:"no";s:9:"Apple_pay";s:3:"yes";s:16:"Apple_pay_button";s:5:"black";s:21:"Apple_pay_button_lang";s:2:"en";}'

De plus, le seul élément d'information que je souhaite modifier est le suivant: 'testmode' => 'no' est devenu 'testmode' => 'yes' - une solution consistant à coder en dur l'ensemble du tableau sérialisé ne fonctionnera donc pas dans ma situation et me paraît de toute façon très fragile.

Est-il possible de mettre à jour une seule valeur d'un tableau à l'aide de wpcli? Dans mon esprit, cela ressemblerait à quelque chose comme:

$ wp option update woocommerce_stripe_settings['testmode'] yes
2
passionsplay

Merci à un conseil de milo dans les commentaires ci-dessus, j’ai regardé cette question similaire .

Laurent a fourni une réponse qui donne l'option à wp-cli, le transfère à un programme php en ligne, fait les ajustements puis le renvoie à wp-cli. J'ai repris cette idée et l'ai généralisée en créant un fichier apparenté à mon script de clonage: update-array-option.sh.

#!/bin/bash

option_name=$1
option_key=$2
option_value=$3

wp option get ${option_name} --format=json | php -r "
\$option = json_decode( fgets(STDIN) );
\$option->${option_key} = \"${option_value}\";
print json_encode(\$option);
" | wp option set ${option_name} --format=json

L'utilisation devient alors:

./update-array-option.sh <option-name> <option-key> <value>

Spécifiquement pour cette question:

./update-array-option.sh woocommerce_stripe_settings testmode yes

Évidemment, cela est rapide et sale et ne gérera pas tous les cas Edge. Mélanger bash/php comme ça, et comme pour tout ce qui concerne les chaînes dans bash, YMMV, est visiblement dégoûtant.

6
passionsplay