การเขียนโค้ดด้วย API
การเขียนโค้ดด้วย APIการฉีดทรัพยากรหลายรายการเข้าสู่ WP-CLI

การฉีดทรัพยากรหลายรายการเข้าสู่ WP-CLI

ในคู่มือ "การเสริม WP-CLI" เราดึง (และฉีดเข้าสู่ WP-CLI) เพียงรหัสผู้ใช้รายเดียว ทีนี้มาดึงรหัสผู้ใช้หลายรายการขณะรัน GraphQL query เดียวกัน

ใน GraphQL query นี้:

  • เราลบ argument pagination ออกจาก query เพื่อดึงรายชื่อผู้ใช้ทั้งหมดที่มี locale ภาษาสเปน
  • เราใช้ Multiple Query Execution เพื่อ export รายการรหัสผู้ใช้ ภายใต้ dynamic variable $userIDs
  • เราพิมพ์ elements ของ array นี้ด้วย _arrayJoin โดยเชื่อมแต่ละ item ด้วยช่องว่าง ภายใต้ alias spanishLocaleUserIDs
  • เรารัน operation FormatAndPrintData
# This query is stored in file "find-multiple-users-with-spanish-locale.gql"
query RetrieveData {
  users(
    filter: {
      metaQuery: {
        key: "locale",
        compareBy: {
          stringValue: {
            value: "es_[A-Z]+"
            operator: REGEXP
          }
        }
      }
    }
  ) {
    id @export(as: "userIDs", type: LIST)
    name
    locale: metaValue(key: "locale")
  }
}
 
query FormatAndPrintData @depends(on: "RetrieveData") {
  spanishLocaleUserIDs: _arrayJoin(
    array: $userIDs,
    separator: " "
  )
}

การตอบสนองต่อ query นี้จะเป็น:

{
  "data": {
    "users": [
      {
        "id": 3,
        "name": "Subscriber Bennett",
        "locale": "es_AR"
      },
      {
        "id": 2,
        "name": "Blogger Davenport",
        "locale": "es_ES"
      }
    ],
    "spanishLocaleUserIDs": "3 2"
  }
}

เมื่อรัน query dictionary ใน body ของ request ต้องระบุชื่อของ operation ที่ต้องการรัน ("FormatAndPrintData"):

GRAPHQL_QUERY=$(cat find-multiple-users-with-spanish-locale.gql)
GRAPHQL_BODY="{\"operationName\": \"FormatAndPrintData\", \"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/)

เราต้องปรับ regex ด้วย (เนื่องจาก alias ใหม่ ช่องว่างระหว่าง ID และเครื่องหมายคำพูดที่ล้อมรอบ string นี้):

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

เมื่อพิมพ์เนื้อหาของตัวแปร SPANISH_LOCALE_USER_IDS เราจะได้รหัสทั้งหมดคั่นด้วยช่องว่าง:

echo $SPANISH_LOCALE_USER_IDS
# Response:
# 3 2

ตอนนี้เราสามารถฉีด ID ทั้งหมดพร้อมกันเข้าสู่คำสั่ง WP-CLI (หากคำสั่งรองรับ) หรือวนซ้ำและรันคำสั่งสำหรับแต่ละ ID:

for USER_ID in $(echo $SPANISH_LOCALE_USER_IDS); do wp user update "$(echo $USER_ID)" --locale=fr_FR; done