API로 코딩하기
API로 코딩하기WP-CLI에 여러 리소스 주입하기

WP-CLI에 여러 리소스 주입하기

가이드 「WP-CLI 보완하기」에서는 단일 사용자 ID만 가져와서 WP-CLI에 주입했습니다. 이번에는 단일 GraphQL 쿼리를 실행하면서 여러 사용자 ID를 가져와 보겠습니다.

이 GraphQL 쿼리에서는:

  • 스페인어 로케일을 가진 모든 사용자 목록을 가져오기 위해 쿼리에서 pagination 인수를 제거합니다
  • Multiple Query Execution 을 사용하여 동적 변수 $userIDs 아래에 사용자 ID 목록을 내보냅니다
  • _arrayJoin으로 이 배열의 요소를 출력하고, 각 요소를 공백으로 연결하여 별칭 spanishLocaleUserIDs 아래에 저장합니다
  • 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: " "
  )
}

이 쿼리에 대한 응답은 다음과 같습니다:

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

쿼리를 실행할 때, 요청 본문의 딕셔너리에는 실행할 작업의 이름("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/)

새로운 별칭, ID 사이의 공백, 그리고 이 문자열을 감싸는 따옴표에 대응하기 위해 정규식도 조정해야 합니다:

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의 내용을 출력하면 공백으로 구분된 모든 ID를 얻을 수 있습니다:

echo $SPANISH_LOCALE_USER_IDS
# Response:
# 3 2

이제 모든 ID를 WP-CLI 명령에 한꺼번에 주입하거나(명령이 지원하는 경우), 반복하면서 각각 명령을 실행할 수 있습니다:

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