Compléter WP-CLI
WP-CLI est un outil en ligne de commande pour interagir avec WordPress, qui nous aide à automatiser des tâches. Il nous permet d'installer un nouveau site, de créer ou de mettre à jour des articles, d'activer des plugins, de modifier les options, et bien plus encore.
Les commandes WP-CLI peuvent être imbriquées :
- Exécuter une commande WP-CLI qui retourne l'ID d'une ressource
- Injecter cet ID dans une autre commande WP-CLI, pour exécuter une opération sur cette ressource
Par exemple, ce script trouve l'ID de l'article avec un certain slug, et met à jour ses métadonnées :
wp post meta set $(wp post list --name="hello-world" --format=ids) _wp_page_template about.phpCe script crée répétitivement un élément de menu et définit son ID comme parent d'un nouvel élément de menu, définissant ainsi leur hiérarchie ("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 peut augmenter les capacités de WordPress pour la recherche de données. Ainsi, nous pouvons également utiliser Gato GraphQL pour trouver les données dont nous avons besoin, et les injecter dans WP-CLI.
Les requêtes suivantes montreront comment procéder.
Exécuter une requête GraphQL depuis le terminal
Utilisons une requête GraphQL pour trouver les utilisateurs avec le locale espagnol, et exécutons une commande WP-CLI sur cet utilisateur.
Nous limitons d'abord le résultat à un seul utilisateur (via 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")
}
}Dans le terminal, nous pouvons utiliser curl (ou un outil similaire) pour exécuter une requête contre le serveur GraphQL, en transmettant les données suivantes :
- Exécuter la méthode
POST - Le type de contenu accepté est
application/json - Le corps est un dictionnaire avec l'entrée
"query"et la requête GraphQL (et, si nécessaire, également les entrées"variables"et"operationName") - La chaîne de requête doit être formatée : toutes les
"doivent être échappées en\", et les sauts de ligne doivent être remplacés par\n - Pointer vers l'URL de l'endpoint de Gato GraphQL (soit l'endpoint unique, soit un endpoint personnalisé)
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/Cela affiche la réponse directement dans le terminal :
{"data":{"users":[{"id":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}Extraire l'ID de la réponse GraphQL
De manière similaire à l'utilisation de --field=ID, --format=ids ou --porcelain dans WP-CLI, nous devons trouver un moyen d'extraire la donnée spécifique dont nous avons besoin de la réponse GraphQL. Dans cet exemple, il s'agit de l'ID de l'utilisateur.
Nous assignons la réponse GraphQL à une variable d'environnement (comme GRAPHQL_RESPONSE), et identifions l'ID de l'utilisateur avec un alias particulier (comme 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/)En exécutant echo $GRAPHQL_RESPONSE, nous pouvons visualiser la réponse :
{"data":{"users":[{"spanishLocaleUserID":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}Ensuite, nous exécutons grep avec une regex correspondant au motif "spanishLocaleUserID":{ID}, et extrayons l'ID dans la variable d'environnement 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)Maintenant, nous pouvons injecter la valeur de cette variable dans WP-CLI :
wp user update "$(echo $SPANISH_LOCALE_USER_ID)" --locale=fr_FRRendre la requête GraphQL plus lisible
Lors du formatage de la requête GraphQL pour la saisir dans curl, elle est devenue difficile à lire.
Une solution consiste à appliquer les transformations à l'aide de commandes bash, comme tr et 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/)Ajouter la coloration syntaxique à la requête GraphQL
Une itération supplémentaire par rapport à l'étape précédente consiste à placer la requête GraphQL dans un fichier .gql séparé, qui peut ensuite être modifié avec un éditeur (tel que VSCode) et bénéficier de sa coloration syntaxique :
# 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")
}
}Ensuite, nous lisons le contenu de ce fichier en utilisant 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/)