Integrare WP-CLI
WP-CLI è uno strumento da riga di comando per interagire con WordPress, che ci aiuta ad automatizzare le attività . Ci permette di installare un nuovo sito, creare o aggiornare articoli, attivare plugin, modificare le opzioni e molto altro ancora.
I comandi WP-CLI possono essere annidati:
- Eseguire un comando WP-CLI che restituisce l'ID di una risorsa
- Iniettare quell'ID in un altro comando WP-CLI, per eseguire un'operazione su quella risorsa
Ad esempio, questo script trova l'ID dell'articolo con un certo slug e ne aggiorna i metadati:
wp post meta set $(wp post list --name="hello-world" --format=ids) _wp_page_template about.phpQuesto script crea ripetutamente un elemento di menu e ne imposta l'ID come genitore di un altro nuovo elemento di menu, definendo così la loro gerarchia ("Most ancestor menu item" > "Parent menu item" > "Child menu item"):
wp menu item add-custom bottom-menu "Child menu item" https://bbc.com --parent-id=$(wp menu item add-post bottom-menu 1 --title="Parent menu item" --parent-id=$(wp menu item add-post bottom-menu 1 --title="Most ancestor menu item" --porcelain) --porcelain)Gato GraphQL può potenziare le capacità di WordPress nella ricerca dei dati. In questo modo, possiamo anche usare Gato GraphQL per trovare i dati di cui abbiamo bisogno e iniettarli in WP-CLI.
Le seguenti queries dimostreranno come farlo.
Eseguire una query GraphQL dal terminale
Usiamo una query GraphQL per trovare gli utenti con il locale spagnolo ed eseguiamo un comando WP-CLI su quell'utente.
Per prima cosa limitiamo il risultato a un solo utente (tramite pagination: { limit: 1 }):
query {
users(
filter: {
metaQuery: {
key: "locale",
compareBy: {
stringValue: {
value: "es_[A-Z]+"
operator: REGEXP
}
}
}
},
pagination: {
limit: 1
}
) {
id
name
locale: metaValue(key: "locale")
}
}Nel terminale, possiamo usare curl (o uno strumento simile) per eseguire una query contro il server GraphQL, trasmettendo i seguenti dati:
- Eseguire il metodo
POST - Il tipo di contenuto accettato è
application/json - Il corpo è un dizionario con la voce
"query"e la query GraphQL (e, se necessario, anche le voci"variables"e"operationName") - La stringa della query deve essere formattata: tutte le
"devono essere convertite in escape come\", e i ritorni a capo devono essere sostituiti con\n - Puntare verso l'URL dell'endpoint di Gato GraphQL (sia l'endpoint singolo, sia un endpoint personalizzato)
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"query": "query {\n users(\n filter: {\n metaQuery: {\n key: \"locale\",\n compareBy: {\n stringValue: {\n value: \"es_[A-Z]+\"\n operator: REGEXP\n }\n }\n }\n },\n pagination: {\n limit: 1\n }\n ) {\n id\n name\n locale: metaValue(key: \"locale\")\n }\n}"}' \
https://mysite.com/graphql/Questo mostra la risposta direttamente nel terminale:
{"data":{"users":[{"id":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}Estrarre l'ID dalla risposta GraphQL
In modo simile all'uso di --field=ID, --format=ids o --porcelain in WP-CLI, dobbiamo trovare un modo per estrarre il dato specifico di cui abbiamo bisogno dalla risposta GraphQL. In questo esempio, si tratta dell'ID dell'utente.
Assegniamo la risposta GraphQL a una variabile d'ambiente (come GRAPHQL_RESPONSE) e identifichiamo l'ID dell'utente con un alias particolare (come spanishLocaleUserID):
GRAPHQL_RESPONSE=$(curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"query": "query {\n users(\n filter: {\n metaQuery: {\n key: \"locale\",\n compareBy: {\n stringValue: {\n value: \"es_[A-Z]+\"\n operator: REGEXP\n }\n }\n }\n },\n pagination: {\n limit: 1\n }\n ) {\n spanishLocaleUserID: id\n name\n locale: metaValue(key: \"locale\")\n }\n}"}' \
https://mysite.com/graphql/)Eseguendo echo $GRAPHQL_RESPONSE possiamo visualizzare la risposta:
{"data":{"users":[{"spanishLocaleUserID":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}Successivamente, eseguiamo grep con una regex corrispondente al pattern "spanishLocaleUserID":{ID} ed estraiamo l'ID nella variabile d'ambiente SPANISH_LOCALE_USER_ID:
SPANISH_LOCALE_USER_ID=$(echo $GRAPHQL_RESPONSE \
| grep -E -o '"spanishLocaleUserID\":(\d+)' \
| cut -d':' -f2- | cut -d'"' -f2- | rev | cut -d'"' -f2- | rev)Ora possiamo iniettare il valore di questa variabile in WP-CLI:
wp user update "$(echo $SPANISH_LOCALE_USER_ID)" --locale=fr_FRRendere la query GraphQL più leggibile
Durante la formattazione della query GraphQL per inserirla in curl, è diventata difficile da leggere.
Una soluzione consiste nell'applicare le trasformazioni utilizzando comandi bash, come tr e sed:
GRAPHQL_QUERY='
query {
users(
filter: {
metaQuery: {
key: "locale",
compareBy: {
stringValue: {
value: "es_[A-Z]+"
operator: REGEXP
}
}
}
},
pagination: {
limit: 1
}
) {
spanishLocaleUserID: id
name
locale: metaValue(key: "locale")
}
}
'
GRAPHQL_BODY="{\"query\": \"$(echo $GRAPHQL_QUERY | tr '\n' ' ' | sed 's/"/\\"/g')\"}"
GRAPHQL_RESPONSE=$(curl \
-X POST \
-H "Content-Type: application/json" \
-d $GRAPHQL_BODY \
https://mysite.com/graphql/)Aggiungere l'evidenziazione della sintassi alla query GraphQL
Un'ulteriore iterazione rispetto al passaggio precedente consiste nel collocare la query GraphQL in un file .gql separato, che può poi essere modificato con un editor (come VSCode) e beneficiare della sua evidenziazione della sintassi:
# This query is stored in file "find-user-with-spanish-locale.gql"
query {
users(
filter: {
metaQuery: {
key: "locale",
compareBy: {
stringValue: {
value: "es_[A-Z]+"
operator: REGEXP
}
}
}
},
pagination: {
limit: 1
}
) {
spanishLocaleUserID: id
name
locale: metaValue(key: "locale")
}
}Successivamente, leggiamo il contenuto di questo file utilizzando cat:
GRAPHQL_QUERY=$(cat find-user-with-spanish-locale.gql)
GRAPHQL_BODY="{\"query\": \"$(echo $GRAPHQL_QUERY | tr '\n' ' ' | sed 's/"/\\"/g')\"}"
GRAPHQL_RESPONSE=$(curl \
-X POST \
-H "Content-Type: application/json" \
-d $GRAPHQL_BODY \
https://mysite.com/graphql/)