web-dev-qa-db-ja.com

Wp-cliを使って 'array'オプションを更新する方法

ライブサイトと開発サイトの同期を自動化するためのbashスクリプトを作成しようとしています。プロダクションデータベースのエクスポートや開発サイトでのURLのインポート/更新など、基本的なことはわかっていますが、データが配列として保存されているオプションの更新には手助けが必要です。

特に、私はwp-cliを使用してWoocommerceのStripe設定を変更したいです。

私は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',
)

s:2:"no"s:3:"yes"に更新してDBに直接問い合わせることで得た直列化された値を使用しようとしましたが、それは値を正しく保存していないようでした:

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";}'

さらに、私が変更したいのは'testmode' => 'no'から'testmode' => 'yes'までの唯一の情報なので、シリアライズされた配列全体をハードコーディングするなどの解決策は私の状況ではうまくいきません。

Wpcliを使用して配列の1つの値だけを更新する方法はありますか?私の考えでは、それは次のようになります。

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

上記のコメントのmiloからの助言のおかげで、私はこの 似たような質問 を見ました。

Laurentによる回答があります。これは基本的にwp-cliを使ってオプションを取得し、それをインラインphpプログラムにパイプし、調整してからwp-cliにパイプバックするというものです。私はその考えを取り、私のクローニングスクリプトの兄弟ファイル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

使い方は次のようになります。

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

特にこの質問のために:

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

明らかにこれは迅速で汚れており、Edgeのすべてのケースを扱うことはできません。このようにbashとphpが混在しているのは見た目も気分もいいし、bash内の文字列に関するすべてのものと同様に、YMMVです。

6
passionsplay