API로 코딩하기
API로 코딩하기WP-CLI 보완하기

WP-CLI 보완하기

WP-CLI는 WordPress와 상호작용하기 위한 명령줄 도구로, 작업 자동화를 지원합니다. 새 사이트 설치, 게시물 생성 및 업데이트, 플러그인 활성화, 옵션 수정 등 다양한 작업을 수행할 수 있습니다.

WP-CLI 명령은 중첩하여 사용할 수 있습니다.

  1. 특정 리소스의 ID를 반환하는 WP-CLI 명령을 실행합니다
  2. 해당 ID를 다른 WP-CLI 명령에 주입하여 해당 리소스에 대한 작업을 실행합니다

예를 들어, 이 스크립트는 특정 슬러그를 가진 게시물의 ID를 찾아 해당 메타를 업데이트합니다.

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

이 스크립트는 메뉴 항목을 반복적으로 생성하고, 해당 ID를 다른 새 메뉴 항목의 부모로 설정함으로써 계층 구조("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은 WordPress의 데이터 검색 기능을 확장할 수 있습니다. 따라서 Gato GraphQL을 사용하여 필요한 데이터를 찾고 WP-CLI에 주입하는 것도 가능합니다.

다음 쿼리들을 통해 그 방법을 알아보겠습니다.

터미널에서 GraphQL 쿼리 실행하기

GraphQL 쿼리를 사용하여 스페인어 로케일을 가진 사용자를 찾고, 해당 사용자에 대해 WP-CLI 명령을 실행해 보겠습니다.

먼저 결과를 사용자 1명으로 제한합니다(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")
  }
}

터미널에서는 curl(또는 유사한 도구)을 사용하여 GraphQL 서버에 쿼리를 실행할 수 있습니다. 다음 데이터를 전달합니다.

  • POST 메서드를 사용합니다
  • 허용되는 콘텐츠 유형은 application/json입니다
  • 본문은 "query" 항목과 GraphQL 쿼리를 포함하는 딕셔너리입니다 (필요한 경우 "variables""operationName" 항목도 포함)
  • 쿼리 문자열은 형식을 맞춰야 합니다: 모든 "\"로 이스케이프하고, 줄바꿈은 \n으로 대체해야 합니다
  • Gato GraphQL의 엔드포인트 URL(단일 엔드포인트 또는 사용자 정의 엔드포인트)로 요청을 보냅니다
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/

이렇게 하면 응답이 터미널에 직접 출력됩니다.

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

GraphQL 응답에서 ID 추출하기

WP-CLI에서 --field=ID, --format=ids, --porcelain을 사용하는 것과 마찬가지로, GraphQL 응답에서 필요한 특정 데이터를 추출하는 방법이 필요합니다. 이 예제에서는 사용자 ID가 해당 대상입니다.

GraphQL 응답을 환경 변수(GRAPHQL_RESPONSE 등)에 할당하고, 사용자 ID를 특정 별칭(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를 실행하면 응답을 확인할 수 있습니다.

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

다음으로, "spanishLocaleUserID":{ID} 패턴에 일치하는 정규식으로 grep을 실행하여 ID를 환경 변수 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)

이제 이 변수의 값을 WP-CLI에 주입할 수 있습니다.

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

GraphQL 쿼리를 읽기 쉽게 만들기

GraphQL 쿼리를 curl에 입력하기 위해 형식을 맞추면 읽기 어려워집니다.

해결책으로 tr이나 sed 같은 bash 명령을 사용하여 변환을 적용하는 방법이 있습니다.

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 쿼리에 구문 강조 추가하기

이전 단계에서 한 단계 더 나아가, GraphQL 쿼리를 별도의 .gql 파일에 저장하는 방법이 있습니다. 이 파일은 에디터(VSCode 등)로 편집하고 구문 강조 기능을 활용할 수 있습니다.

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

그런 다음 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/)