어제의 포스팅에 이어 wp-cli에 대해 소개하는 포스팅을 작성한다. 오늘은 아마도 마무리하는 글에 걸맞게 실무적으로 유용한 명령들이 될 것이다.
미디어 사이즈 조회
늘 이상하다고 생각했다. 왜 미디어 사이즈는 코어에 저장된 몇가지 확인할 수 밖에 나오질 않는가? 코드로 이미 엄청나게 많은 사이즈를 정의해 두었는데, 그 사이즈들을 명확하게 정리해서 보여주는 곳이 없다. 대체 왜?
다행히 wp-cli에서 제공하는 media image-size 명령를 통해 손쉽게 파악이 가능하다. 아래는 해당 명령을 통해 출력한 워드프레스의 이미지 사이즈 기본값이다.
+--------------+-------+--------+------+-------+ | name | width | height | crop | ratio | +--------------+-------+--------+------+-------+ | full | | | N/A | N/A | | 2048x2048 | 2048 | 2048 | soft | N/A | | 1536x1536 | 1536 | 1536 | soft | N/A | | large | 1024 | 1024 | soft | N/A | | medium_large | 768 | 0 | soft | N/A | | medium | 300 | 300 | soft | N/A | | thumbnail | 150 | 150 | hard | 1:1 | | 1536x1536 | 0 | 0 | soft | N/A | | 2048x2048 | 0 | 0 | soft | N/A | +--------------+-------+--------+------+-------+
읽는 요령을 같이 적어 본다.
- full은 원본 이미지 사이즈이다.
- 2048×2048, 1536×1536 또한 코어에서 임의로 미리 넣어둔 이미지 사이즈이다. 보통 웹에서는 잘 사용하진 않겠지만 굉장히 큰 해상도의 이미지를 올리게 될 경우 사용될 것이다.
- large는 옵션에서 볼 수 있는 ‘큰 크기’ 이미지 사이즈이다. medium과 thumbnail도 각각 ‘중간 크기’, ‘섬네일 크기’ 이미지 사이즈의 옵션이다.
- medium_large 사이즈는 분명히 코어에 의해 정해졌지만, UI에 나오지 않고 옵션 데이터베이스 테이블에만 기록된다.
- 0인 것은 해당 축의 길이는 상관하지 않는다는 뜻이다.
- soft crop은 말하자면 그냥 리사이징이다.
- 300×300 soft crop이라면 가로나 세로 긴 축을 300픽셀로 맞추고 다른 축은 이미지 비율에 맞춰 줄인다.
- 768×0 soft crop 이면 항상 가로 기준으로 768 픽셀에 맞추어 비율에 맞게 줄인다.
- hard crop은 보다 이미지 사이즈를 엄격하게 줄인다.
- 150×150 hard crop은 가로나 세로 짧은 축을 150픽셀로 맞추고 다른 축은 이미지 비율에 맞춰 줄인다. 줄여서 150픽셀을 넘어가면 축을 기준으로 양 끝을 고르게 잘라 150 픽셀로 강제로 맞춘다.
- 이미지를 축소할 뿐 확대하지는 않는다.
이렇게 미디어 사이즈를 생성하는 이유까지 간단히 적어 본다. 사용자가 올린 원본 이미지를 그대로 사이트 이곳저곳에 무분별하게 사용하게 되면 어떻게 될까? 페이지를 보여주기 위해 전송되어야 할 데이터 용량이 이미지 때문에 급격히 늘어나게 된다.
예를 들어 사진이나 그림 등 이미지가 강조되는 웹페이지가 있다고 하자. 저자가 거의 원본에 가까운 (그러니까 수 메가바이트에서 수십 메가바이트까지 될 수 있는) 이미지를 올려 본문에 삽입해 작품을 소개하거나 아예 다운로드를 할 수 있도록 공개한다 생각해보자.
다운로드할 게 아니라면 원본을 쓸 필요가 있을까? 섬네일을 출력하는데, 본문에 글자와 같이 배치하는 조그만 이미지에, 수십 메가바이트 짜리 이미지를 넣는다면 불필요하게 데이터를 소모하게 된다. 로딩 시간도 길어져 속도도 느려지니 여러 모로 비효율적인 웹사이트가 된다.
그런데 이런 것들은 웹을 잘 알고 있지 않으면 고려하기 쉽지 않고, 설사 알고 있다 하더라도 업로드하는 이미지에 대해 일일이 작업하기란 정말 귀찮은 일이 될 것이다.
그래서 워드프레스는 미리 적절히 업로드할 때 받은 이미지를 지정된 사이즈로 줄여놓는 작업을 해 두었다가 상황에 맞게 적절한 이미지를 골라 원본 대신 줄여둔 이미지를 출력한다. 미리 이미지 사이즈 규격을 정하는 이유인 것이다.
미디어 사이즈 재생성하기
테마를 직접 제작하게 되면 특히 와닿을 수 있을 것이다. 작업을 하다 보면 부득이하게 디자인에 맞춰 생성할 이미지 사이즈 규격을 변경해야 할 필요가 있을 수 있다. 예를 들어 medium_large의 기본 기준은 768×0이지만, 디자인이 변경되어 기준이 820×0이 되지 않으면 안되는 일이 생겼다고 하자.
그냥 사용하기에는 오차가 너무 크다. 이러면 출력된 화상이 열화가 눈에 보일 수도 있다. 그렇다면 기준을 변경해야 한다. 그래서 medium_large의 가로 길이를 820 픽셀로 수정하였다.
그런데 조심해야 한다.기준이 변경되었다고 해서 변경된 사항이 기존에 업로드된 이미지까지 소급되어 적용되지는 않는다는 사실이다. 앞으로 올라갈 이미지는 820 픽셀의 소프트 크롭된 이미지가 생성되지만, 기존의 이미지는 768 픽셀로 변경되지 않은 채 그대로이다.
그러면 업로드를 다시 해야 할까? 일일이 손으로 리사이징을 해 줘야 할까? 임의로 변경하면 안된다. 왜냐면 이미지 파일뿐만 아니라 이미지 정보에 해당하는 메타데이터까지 따로 기록이 되어 있기 때문이다.
이 때 해결사는 wp media regenerate
이다. 업로드된 이미지 파일에는 원본이 존재한다. 원본에서 현재 이미지 사이즈 규격에 맞춰 기존의 리사이즈 된 파일을 지우고 다시 생성한다. DB 내용도 알아서 업데이트한다. 아래는 미디어 ID 1000, 1002, 1010번에 대해 이미지를 재생성한다. 만약 이렇게 숫자를 생략하면 모든 이미지에 대해 일괄 재생성을 하게 된다.
wp media regenerate 1000 1002 1010
이미지의 일부만 재생성한다면? 예를 들어 ID 1000에서 2000까지의 미디어 이미지에 대해서만 작업한다면 다음 명령처럼 하면 된다.
seq 1000 2000 | xargs wp media regenerate
Code language: Bash (bash)
다국어 파일을 위한 템플릿 파일 생성하기
워드프레스 플러그인/테마 올바르게 번역하기에서도 포스팅한 내용이다. 다국어 번역을 위해서 .pot 파일을 생성해야 한다. 이렇게 하면 플러그인이나 테마 파일에서 번역을 위한 처리 부분을 스캔해 찾아낸 문자열을 모아 pot 형식의 번역 템플릿 파일을 자동으로 생성해 내게 된다.
이후 PoEdit 같은 프로그램을 사용해 pot 템플릿으로부터 문자열의 번역 작업을 진행한다.
wp-cli i18n make-pot . ./languages/bar.pot --domain=bar
- 현재 디렉토리는 번역 스캔을 할 테마, 혹은 플러그인.
- 스캔한 결과는 ./language/bar.pot 파일로 출력.
- 텍스트도메인은 ‘bar’.
이 명령은 다국어를 위한 프로그램 제작시 필수적인 명령이다.
테이블의 텍스트 교체하기
wp-cli의 하이라이트인 명령어 차례다. 개인적으로 가장 유용하고, 가장 많이 사용하는 wp-cli의 명령어다. 이거 쓰려고 그동안 어그로 끌었다고 말할 수 있을 정도로.
초심자들은 아무래도 SSH나 CLI 명령어에 약하기 때문에 워드프레스 사이트를 복제할 때 플러그인을 사용해 일을 진행한다. 하지만 wp-cli의 이 명령어를 알면 그런 플러그인을 굳이 설치할 필요가 없다고 생각한다. 이 부분은 CLI가 압도적으로 정확하고 빠르다.
테이블의 텍스트를 찾아 변경하는 명령어는 wp search-replace
이다. 예를 들어 워드프레스 사이트를 복제했다고 치자. 원본의 URL은 https://original-site.com이고, 복제된 URL은 https://develop-site.localhost라고 생각해보자. 포스트 본문, 커스텀 필드, 옵션 등등에 해당 URL이 박혀 있을 것이다. 특히 옵션값 ‘siteurl’은 관리자 접속에 사용되는 필드라 반드시 변경해야 한다.
아마 몇몇 잘 모르는 사람들은 wp-config.php 에서 이렇게 처리를 해둘지 모른다.
define( 'WP_SITEURL', 'https://develop-site.localhost' );
define( 'WP_HOME', WP_SITEURL );
Code language: JavaScript (javascript)
뭐, 이렇게 하면 대략 관리자 접속은 되니까 문제가 해결된 거라고 생각할지 모른다. 그러나 이 방법은 불완전하다. 관리자 접속은 될지 모르지만 본문에 삽입된 URL 정보들은 모두 원본 사이트의 URL 그대로라 어디서 어떤 부작용을 일으킬지 모른다. 만약 여기서 원본 사이트를 폐쇄한다면 그즉시 이미지가 몽땅 깨지는 현상이 발생할 것이다.
이럴 때 wp search-replace를 사용한다. 이 명령어는 기특하게 단순 문자열만 변경할 뿐만 아니라, PHP 직렬화된 값도 잘 인지해 변경해준다.
레시피를 적자면,
wp search-replace \
'https://original-site.com' \ # 원본
'https://develop-site.localhost' \ # 복제
wp_* --dry-run
Code language: PHP (php)
정도가 된다. ‘wp_’ 접두를 가진 테이블을 대상으로 원본 URL을 복제 URL로 일괄 변경하는 명령이다. 이 명령을 그대로 실행하면 값이 실제로 변경되지는 않을 것이다. --dry-run
옵션 때문이다. 이 옵션은 명령을 시뮬레이션하고 실제로 변경은 하지 않게 한다.
DB 레코드를 바꾸는 것은 신중해야 한다. 한번 바꾼 문자열은 실수하면 다시 되돌리기 어려울 때가 많기 때문이다. 특히 운영 사이트는 절대 실수하면 안된다. 명령어에 망할 오타가 있을 수도 있다. 항상 --dry-ru
n을 돌려 결과도 확인하고, 심호흡도 하고, 천천히 점검과 확인을 여러번 거치고 일을 진행하자.
Scaffolding
wp-cli의 가장 인상적인 명령어라면 단연 scaffolding
이라고 말할 수 있다. 여러가지 작업에 대한 귀찮은 준비과정을 에 미리 고정된 패턴으로 제공해두어 나름 편리하게 쓸 수 있다.
예를 들어 포스트 타입 생성하는 코드. 흔히 이것조차 Custom Post Type UI 같은 플러그인으로 해결하려고 하는데, 나는 그런 것들에 심히 반대하는 사람이다. 뭐 악감정이 있는 건 아니지만… 나중에 좀 더 이에 대해 설명하는 포스팅도 해야할 것 같다.
커스텀 포스트 타입은 요구하는 인자의 양이 정말 많기 때문에 그동안 많이 공부하기는 해 뒀다. 그러나 매번 제로 베이스에서 커스텀 포스트를 작성할 때는 귀찮음이 많다. 이전에 분명히 잘 만든 포스트 타입 생성 예제가 있긴 한데, 어딨는지 가물가물해져버렸고, 분명히 코드 조각을 생성해주는 웹사이트가 있는 건 알지만 북마크는 안해놨고… 뭔가 움찔움찔하면서 스트레스가 슬쩍 쌓일 때가 꽤나 있었다.
이 때 wp scaffold post-type
명령어가 도움이 될 수 있겠다. CPT 생성하는데 필요한 다량의 코드 템플릿을 주루룩 출력해줘 약간은 도움이 된다.
개인적으로 scaffold 명령어중 wp scaffold plugin-test
에 가장 많은 도움을 받았다. 이 명령을 통해 플러그인 유닛 테스트를 보다 쉽고 빠르게 설정할 수 있었다. 다른 scaffold 명령어들은 비교적 문서 등지에 잘 설명되어있어 나름 자신만의 스타일을 가지고 있는데, 워드프레스에서 유닛 테스트를 진행하는 것은 그다지 많은 경우가 아니라…
아무튼 쉽게 유닛 테스트를 구축할 수 있는 명령어가 존재한다는 것만 이야기하도록 하자. 이것까지 더 자세히 이야기하다가는 내 금요일과 주말이 다 날아갈지도 모르겠다. 따로 유닛 테스트에 대한 포스팅도 진행할 수 있기를.
이로써 WP CLI에 대해 간략하게 알아보았다. WP CLI만 잘 활용하면, 그리고 조금 과장하면, 워드프레스 유지 관리 용도로 제작된 플러그인들 몇몇은 잡동사니로 보일 정도로 강력한 기능을 가진 것을 알 수 있다.
사실 이걸로 끝이 아니다. WP CLI는 명령을 확장할 수 있다. 내 플러그인과 테마를 만들면서 같이 명령어도 같이 만들 수가 있다. 이미 우커머스나 WP Optimize 같은 플러그인들은 WP CLI를 위한 명령어를 제공하고 있다.
WP CLI 명령어 확장도 언젠가 포스팅할 수 있기를 바라며, WP CLI 포스팅을 마친다. 다음 포스팅에는 WP CLI를 활용한 워드프레스 설치 자동화 스크립트에 대해 간단하게 다룰까 생각한다.
글 잘 읽었습니다! 본문에 Scaffolding에서 언급하신 사이트가 혹시 https://metabox.io/post-type-generator/ 여기일까 싶어서 댓글 남겨봅니다.
맞아요. 이런 사이트 맞습니다. 제가 의식한 곳은 사실 https://generatewp.com/post-type/ 지만요 🙂