Complementando WP-CLI
WP-CLI es una herramienta de línea de comandos para interactuar con WordPress, que nos ayuda a automatizar tareas. Nos permite instalar un nuevo sitio, crear o actualizar entradas, activar plugins, modificar las opciones, y mucho más.
Los comandos de WP-CLI pueden anidarse:
- Ejecuta un comando WP-CLI que devuelve el ID de algún recurso
- Inyecta ese ID en otro comando WP-CLI, para ejecutar una operación sobre ese recurso
Por ejemplo, este script encuentra el ID de la entrada con cierto slug, y actualiza su meta:
wp post meta set $(wp post list --name="hello-world" --format=ids) _wp_page_template about.phpEste script crea repetidamente un elemento de menú y establece su ID como padre de otro nuevo elemento de menú, definiendo así su jerarquía ("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 puede ampliar las capacidades de WordPress para buscar datos. Como tal, también podemos usar Gato GraphQL para encontrar los datos que necesitamos, e inyectarlos en WP-CLI.
Las siguientes consultas demostrarán cómo hacerlo.
Ejecutando una consulta GraphQL desde el terminal
Vamos a usar una consulta GraphQL para encontrar usuarios con locale español, y ejecutar un comando WP-CLI sobre ese usuario.
Primero limitamos el resultado a solo 1 usuario (vía 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")
}
}En el terminal, podemos usar curl (o una herramienta similar) para ejecutar una consulta contra el servidor GraphQL, pasando los siguientes datos:
- Ejecuta el método
POST - El content type aceptado es
application/json - El cuerpo es un diccionario con la entrada
"query"y la consulta GraphQL (y, si se necesita, también las entradas"variables"y"operationName") - La cadena de consulta debe estar formateada: todas las
"deben escaparse como\", y los saltos de línea deben sustituirse por\n - Apunta contra la URL del endpoint de Gato GraphQL (ya sea el endpoint único, o algún endpoint personalizado)
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/Esto imprime la respuesta directamente en el terminal:
{"data":{"users":[{"id":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}Extrayendo el ID de la respuesta GraphQL
De forma similar a hacer --field=ID, --format=ids o --porcelain en WP-CLI, necesitamos encontrar una forma de extraer la pieza específica de datos que necesitamos de la respuesta GraphQL. En este ejemplo, esa es el ID del usuario.
Asignamos la respuesta GraphQL a una variable de entorno (como GRAPHQL_RESPONSE), e identificamos el ID del usuario con un alias particular (como 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/)Ejecutando echo $GRAPHQL_RESPONSE podemos visualizar la respuesta:
{"data":{"users":[{"spanishLocaleUserID":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}A continuación, ejecutamos grep con un regex que coincida con el patrón "spanishLocaleUserID":{ID}, y extraemos el ID a la variable de entorno 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)Ahora, podemos inyectar el valor de esta variable en WP-CLI:
wp user update "$(echo $SPANISH_LOCALE_USER_ID)" --locale=fr_FRHaciendo la consulta GraphQL más legible
Al formatear la consulta GraphQL para introducirla en curl, se volvió difícil de leer.
Una solución es aplicar las transformaciones usando comandos bash, como tr y 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/)Añadiendo resaltado de sintaxis a la consulta GraphQL
Una iteración adicional del paso anterior es colocar la consulta GraphQL en un archivo .gql aparte, que entonces puede editarse con un editor (como VSCode) y usar su resaltado de sintaxis:
# 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")
}
}Luego, leemos el contenido de este archivo usando 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/)