Pemrograman dengan API
Pemrograman dengan APIMelengkapi WP-CLI

Melengkapi WP-CLI

WP-CLI adalah alat baris perintah untuk berinteraksi dengan WordPress, yang membantu kita mengotomatisasi tugas. Alat ini memungkinkan kita menginstal situs baru, membuat atau memperbarui postingan, mengaktifkan plugin, mengubah opsi, dan masih banyak lagi.

Perintah WP-CLI dapat disarangkan:

  1. Jalankan perintah WP-CLI yang mengembalikan ID dari suatu sumber daya
  2. Suntikkan ID tersebut ke dalam perintah WP-CLI lain, untuk menjalankan operasi pada sumber daya tersebut

Misalnya, skrip ini menemukan ID untuk postingan dengan slug tertentu, dan memperbarui meta-nya:

wp post meta set $(wp post list --name="hello-world" --format=ids) _wp_page_template about.php

Skrip ini berulang kali membuat item menu dan menetapkan ID-nya sebagai induk untuk item menu baru lainnya, sehingga mendefinisikan hierarki mereka ("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 dapat memperluas kemampuan WordPress untuk mencari data. Oleh karena itu, kita juga dapat menggunakan Gato GraphQL untuk menemukan data yang kita butuhkan, dan menyuntikkannya ke WP-CLI.

Query-query berikut akan mendemonstrasikan cara melakukannya.

Menjalankan query GraphQL dari terminal

Mari kita gunakan sebuah query GraphQL untuk menemukan pengguna dengan locale Spanyol, dan menjalankan perintah WP-CLI pada pengguna tersebut.

Pertama-tama kita batasi hasilnya hanya untuk 1 pengguna (melalui 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")
  }
}

Di terminal, kita dapat menggunakan curl (atau alat serupa) untuk menjalankan query terhadap server GraphQL, dengan mengirimkan data berikut:

  • Gunakan metode POST
  • Tipe konten yang diterima adalah application/json
  • Isi permintaan adalah kamus dengan entri "query" dan query GraphQL (dan jika diperlukan, juga entri "variables" dan "operationName")
  • String query harus diformat: Semua " harus di-escape menjadi \", dan baris baru harus diganti dengan \n
  • Arahkan ke URL endpoint dari Gato GraphQL (baik endpoint tunggal, maupun endpoint kustom tertentu)
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/

Ini akan mencetak respons langsung di terminal:

{"data":{"users":[{"id":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}

Mengekstrak ID dari respons GraphQL

Mirip dengan melakukan --field=ID, --format=ids atau --porcelain di WP-CLI, kita perlu menemukan cara untuk mengekstrak bagian data spesifik yang kita butuhkan dari respons GraphQL. Dalam contoh ini, yaitu ID pengguna.

Kita tetapkan respons GraphQL ke variabel lingkungan (seperti GRAPHQL_RESPONSE), dan identifikasi ID pengguna dengan alias tertentu (seperti 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/)

Dengan menjalankan echo $GRAPHQL_RESPONSE kita dapat melihat respons:

{"data":{"users":[{"spanishLocaleUserID":3,"name":"Subscriber Bennett","locale":"es_AR"}]}}

Selanjutnya, kita jalankan grep dengan regex yang cocok dengan pola "spanishLocaleUserID":{ID}, dan ekstrak ID ke variabel lingkungan 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)

Sekarang, kita dapat menyuntikkan nilai variabel ini ke WP-CLI:

wp user update "$(echo $SPANISH_LOCALE_USER_ID)" --locale=fr_FR

Membuat query GraphQL lebih mudah dibaca

Saat memformat query GraphQL untuk dimasukkan ke curl, query tersebut menjadi sulit dibaca.

Salah satu solusinya adalah menerapkan transformasi menggunakan perintah bash, seperti tr dan 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/)

Menambahkan penyorotan sintaks pada query GraphQL

Iterasi lebih lanjut dari langkah sebelumnya adalah menempatkan query GraphQL di file .gql terpisah, yang kemudian dapat diedit dengan editor (seperti VSCode) dan memanfaatkan fitur penyorotan sintaksnya:

# 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")
  }
}

Kemudian, kita baca isi file ini menggunakan 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/)