Bir API ile Kodlama
Bir API ile KodlamaWP-CLI'yi Tamamlama

WP-CLI'yi Tamamlama

WP-CLI, WordPress ile etkileşim kurmak için kullanılan bir komut satırı aracıdır ve görevleri otomatikleştirmemize yardımcı olur. Yeni bir site kurmamıza, gönderi oluşturmamıza veya güncellememize, eklentileri etkinleştirmemize, seçenekleri değiştirmemize ve çok daha fazlasına olanak tanır.

WP-CLI komutları iç içe geçirilebilir:

  1. Bir kaynağın ID'sini döndüren bir WP-CLI komutu çalıştırın
  2. O ID'yi başka bir WP-CLI komutuna enjekte ederek o kaynak üzerinde bir işlem gerçekleştirin

Örneğin, bu betik belirli bir slug'a sahip gönderinin ID'sini bulur ve meta verilerini günceller:

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

Bu betik tekrar tekrar bir menü öğesi oluşturur ve ID'sini yeni bir menü öğesinin üst öğesi olarak ayarlayarak hiyerarşiyi tanımlar ("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, veri aramada WordPress'in yeteneklerini artırabilir. Bu sayede, ihtiyacımız olan verileri bulmak ve bunları WP-CLI'ye enjekte etmek için Gato GraphQL'i de kullanabiliriz.

Aşağıdaki queries bunu nasıl yapacağımızı gösterecektir.

Terminalden bir GraphQL query çalıştırma

İspanyolca yerel ayarına sahip kullanıcıları bulmak için bir GraphQL query kullanalım ve o kullanıcı üzerinde bir WP-CLI komutu çalıştıralım.

Önce sonucu yalnızca 1 kullanıcıyla sınırlıyoruz (pagination: { limit: 1 } aracılığıyla):

query {
  users(
    filter: {
      metaQuery: {
        key: "locale",
        compareBy: {
          stringValue: {
            value: "es_[A-Z]+"
            operator: REGEXP
          }
        }
      }
    },
    pagination: {
      limit: 1
    }
  ) {
    id
    name
    locale: metaValue(key: "locale")
  }
}

Terminalde, aşağıdaki verileri ileterek GraphQL sunucusuna karşı bir query çalıştırmak için curl (veya benzer bir araç) kullanabiliriz:

  • POST metodunu çalıştırın
  • Kabul edilen içerik türü application/json'dır
  • Gövde, "query" girdisi ve GraphQL query'si (ve gerekirse "variables" ile "operationName" girdileri) içeren bir sözlüktür
  • Query dizesi biçimlendirilmelidir: Tüm " karakterleri \" olarak kaçırılmalı ve yeni satırlar \n ile değiştirilmelidir
  • Gato GraphQL'in endpoint URL'sine yönlendirin (tek endpoint veya özel bir endpoint)
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/

Bu, yanıtı doğrudan terminalde yazdırır:

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

GraphQL yanıtından ID'yi çıkarma

WP-CLI'deki --field=ID, --format=ids veya --porcelain kullanımına benzer şekilde, GraphQL yanıtından ihtiyacımız olan belirli veri parçasını çıkarmanın bir yolunu bulmamız gerekir. Bu örnekte bu, kullanıcı ID'sidir.

GraphQL yanıtını bir ortam değişkenine atıyoruz (örneğin GRAPHQL_RESPONSE) ve kullanıcı ID'sini belirli bir takma adla tanımlıyoruz (örneğin 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/)

echo $GRAPHQL_RESPONSE çalıştırarak yanıtı görüntüleyebiliriz:

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

Ardından, "spanishLocaleUserID":{ID} deseniyle eşleşen bir regex ile grep çalıştırıyoruz ve ID'yi SPANISH_LOCALE_USER_ID ortam değişkenine çıkarıyoruz:

SPANISH_LOCALE_USER_ID=$(echo $GRAPHQL_RESPONSE \
  | grep -E -o '"spanishLocaleUserID\":(\d+)' \
  | cut -d':' -f2- | cut -d'"' -f2- | rev | cut -d'"' -f2- | rev)

Artık bu değişkenin değerini WP-CLI'ye enjekte edebiliriz:

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

GraphQL query'sini daha okunabilir hale getirme

GraphQL query'sini curl'e girilecek şekilde biçimlendirirken okunması güçleşti.

Bir çözüm, tr ve sed gibi bash komutlarını kullanarak dönüşümleri uygulamaktır:

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/)

GraphQL query'sine söz dizimi vurgulama ekleme

Önceki adımdan daha ileri gidilerek GraphQL query'si ayrı bir .gql dosyasına yerleştirilebilir; bu dosya daha sonra bir editörle (VSCode gibi) düzenlenebilir ve söz dizimi vurgulamasından yararlanılabilir:

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

Ardından, cat kullanarak bu dosyanın içeriğini okuyoruz:

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/)