WP-CLI 보완하기
WP-CLI는 WordPress와 상호작용하기 위한 명령줄 도구로, 작업 자동화를 지원합니다. 새 사이트 설치, 게시물 생성 및 업데이트, 플러그인 활성화, 옵션 수정 등 다양한 작업을 수행할 수 있습니다.
WP-CLI 명령은 중첩하여 사용할 수 있습니다.
- 특정 리소스의 ID를 반환하는 WP-CLI 명령을 실행합니다
- 해당 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_FRGraphQL 쿼리를 읽기 쉽게 만들기
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/)