jak programowo aktualizować opcje serializowane?

15

Chcę zautomatyzować aktualizację opcji wtyczek. Są rzeczy, które często powtarzam.

Dzięki wp-cli wiem, że mogę aktualizować proste opcje takie jak to:

php wp-cli.phar option update blog_public 1

Jednak niektóre opcje wtyczek zapisują swoje opcje w serializowanym ciągu.

Przykład zserializowanej wartości_opcji w 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:"";}

Jak zaktualizować te opcje?

Lalo
źródło

Odpowiedzi:

14

Rozwiązałem to sam, oto jak to zrobić:

Jeśli chcesz programowo zaktualizować opcje serializowane:

pobierz wp-cli z wp-cli.org

Dowiedz się, jaki jest „klucz” używanych opcji. W tym przykładzie kluczem jest „wp_smtp_options”

Jeśli nie znasz klucza, wyszukaj w tabeli wp_options i spróbuj go rozgryźć.

Przykład: select * from wp_options where option_name like '%smtp%'

Teraz, gdy znasz swój klucz, użyj tego polecenia, aby zapisać konfigurację w pliku json:

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

Za każdym razem, gdy chcesz przywrócić tę konfigurację, użyj tego polecenia

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

Uwagi:

  • działa w WAMPSERVER64
  • współpracuje ze znakami Unicode, takimi jak ñ á é
  • możesz mieć plik json z wypełnieniami i spacjami, dla czytelności

Byłoby wspaniale nie używać do tego celu pliku pośredniego. Czy ktoś wie jak to zrobić?

Lalo
źródło
1
Dzięki - świetna robota. Jeśli ktoś próbuje napisać skrypt, nie wymagając plików zewnętrznych, możesz po prostu wstawić JSON w option updatewierszu jako pojedyncze cudzysłowy. Zobacz moją implementację w linii 61 tutaj: gist.github.com/squarecandy/cfdead55ca1d84496044
squarecandy
zobacz moją odpowiedź na „jeden liniowiec”
Laurent,
13

WP-CLI jest zdecydowanie odpowiedzią na to pytanie po aktualizacji do wersji 1.4.0, która wprowadziła komendy „ pluck” i „ patch” do uzyskiwania dostępu do szeregowanych danych w WordPress.

Polecenie typu pluck przyjmuje ten format w celu przechwytywania wartości zserializowanych

wp option pluck <key> <key-name>

Na przykład w opcji active_plugins możesz pobrać pierwszy przedmiot

wp option pluck active_plugins 0

Polecenie patch przyjmuje ten format do wstawiania, aktualizowania lub usuwania wartości zserializowanych (działanie)

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

Usunięcie pierwszej active_plugin wyglądałoby tak

wp option patch delete active_plugins 0

Ta sama poprawka i łatka zostały również dodane dla innych poleceń, takich jak postmeta, możesz teraz użyć WP-CLI, aby zrobić fajne pętle do programowej aktualizacji danych serializowanych WordPress

Mike Andreasen
źródło
2
To powinna być zaakceptowana odpowiedź.
Evan Mattson,
6

Oto jak to zrobić w skrypcie 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
źródło
0

WP-CLI polecenie optionużywa WordPress' Opcje API aby wykonywać swoje zadania. Biorąc pod uwagę, np. Z podkomendą update, prawidłowe wejście, arraypowinieneś być w stanie to zrobić za pomocą WP-CLI. Powinieneś skorzystać z --formatparametru tutaj, aby upewnić się, że otrzymasz to samo, jsondziała ogólnie dobrze dla updatepodkomendy. Uwaga: podkomenda getpowinna zwrócić opcję niezserializowaną, ponieważ używany jest interfejs API opcji, który można następnie zapisać, zmodyfikować i / lub przenieść / skonfigurować w innych / nowych instalacjach.

Nicolai
źródło
To nie działa: wp option get wp_smtp_options > savedconfiguration.txt wp option update wp_smtp_options < savedconfiguration.txt Pierwsze polecenie zapisuje jako tablicę, ale drugie nie przyjmuje tablicy. Myślę, że powinienem najpierw serializować, czy wiesz jak to zrobić?
lalo
Czy próbowałeś wykorzystać formatparametr? @lalo edit: właśnie widziałem, że to rozgryzłeś ...
Nicolai
w wp-cli.org nie mówi, jakie są dostępne opcje formatparametru. Zastanawiam się, czy byłoby to możliwe bez konieczności używania pliku pośredniego, jak napisałem w odpowiedzi.
lalo
Musisz spojrzeć na źródło, aby uzyskać pełny przegląd formatparametru, który czasami różni się od polecenia (pod-) do (pod-) polecenia. Z pewnością jest to możliwe, na przykład poprzez napisanie skryptu bash i przechowywanie danych w zmiennej. @lalo
Nicolai
oto kod źródłowy, ale nie rozumiem, gdzie są --formatdostępne opcje: github.com/wp-cli/wp-cli/blob/master/php/commands/…
lalo