Technote

개발 워크플로우 실무

연재 훅과 필터 제대로 쓰기 8부 중 3부

우선순위 경쟁 — 마지막에 말하는 쪽이 이깁니다

우선순위는 권한이 아니라 줄 서는 위치입니다. 번호를 올려 이기는 방법은 상대도 쓸 수 있어서 영구적인 승자가 없고, 번역 필터를 뒤에서 덮으면 원문이 그대로 나갑니다.

같은 필터에 콜백이 여럿 걸리면 워드프레스는 우선순위 번호가 낮은 것부터 차례로 부릅니다. 같은 번호끼리는 등록된 순서입니다. 기본값은 10이고, 대부분의 플러그인이 이 값을 씁니다.

중요한 것은 필터의 경우 각 콜백이 앞 콜백의 결과를 받는다는 점입니다. 그래서 늦게 도는 쪽이 앞의 결과를 덮어쓸 수 있습니다.

번호는 권한이 아니라 줄 서는 위치입니다

필터 체인 — 아래로 갈수록 나중이고, 나중이 앞의 결과를 덮는다
add_filter( 'the_title', 'wper_shorten',  10 );
add_filter( 'the_title', 'wper_translate', 20 );

// wper_translate 가 받는 것은 wper_shorten 이 돌려준 값이다.
// 여기에 30 으로 끼어들면 번역이 끝난 값을 다시 덮게 된다.
add_filter( 'the_title', 'wper_decorate', 30 );

“내 값이 안 먹으니 번호를 올리자” 는 자연스러운 반응이고, 실제로 그 순간에는 동작합니다. 문제는 상대도 같은 수를 쓸 수 있다는 것입니다. 다음 업데이트에서 그쪽이 PHP_INT_MAX 로 옮겨 가면 우리가 다시 집니다. 우선순위 경쟁에는 영구적인 승자가 없습니다.

번역 필터를 뒤에서 덮으면 원문이 나갑니다

이 저장소에서 실제로 조심하고 있는 지점입니다. 이 사이트는 한국어 원문을 키로 쓰는 카탈로그로 화면을 번역하고, 그 번역기가 특정 필터에 우선순위 20으로 걸려 있습니다. 같은 필터에 우리 문구를 공급하는 쪽은 10입니다.

공급 쪽을 20 이상으로 옮기면 어떻게 될까요. 번역기가 이미 지나간 뒤에 한국어 원문이 다시 얹히고, 영어 검색 결과에 한국어 제목이 그대로 나갑니다. 코드는 전부 정상이고 에러도 없습니다 — 순서 하나가 언어를 되돌린 것입니다.

같은 코드, 같은 필터 — 번호 하나가 나가는 언어를 바꾼다

경쟁 대신 쓸 수 있는 것

번호를 올리기 전에 아래 셋을 먼저 봅니다. 셋 다 “누가 더 뒤에 서는가” 를 겨루지 않는 방법입니다.

상대 콜백을 내린다 — 그쪽이 하는 일이 우리와 충돌한다면 덮어쓰는 것보다 제거가 정직합니다. 방법과 함정은 6회차에서 다룹니다.

값의 출처를 소유한다 — 필터 끝에서 고치는 대신, 그 값을 만드는 자리에서 옳은 값을 넣습니다. 우리가 만든 데이터라면 대개 가능한 선택입니다.

다른 훅으로 옮긴다 — 같은 결과를 더 이른 · 더 늦은 다른 훅에서 낼 수 있는 경우가 많습니다. 경쟁하지 않는 자리를 찾는 것이 이깁니다.

어떤 콜백이 몇 번에 걸려 있는지 실제로 확인하는 방법은 이 연재 마지막 회차에서 다루고, 이런 충돌을 포함한 점검을 맡기고 싶다면 최적화 지원 사업이 그 작업입니다. 관련 글은 개발 워크플로우 아카이브에 있습니다.

다음 회차

다음 회차는 훅 하나에 집중합니다. pre_get_posts 는 가장 유용하면서 가장 넓게 사고를 내는 훅이고, 가드 두 줄을 빠뜨리면 관리자 목록까지 함께 바뀝니다.

이 주제의 다른 글

노하우 목록으로

개발 워크플로우 실무

워드프레스를 GitHub 에 올릴 때의 .gitignore

워드프레스 저장소에서 커밋해야 할 것과 절대 커밋하면 안 되는 것의 경계는 명확합니다. wp-config.php 한 파일이 저장소에 들어가는 순간 DB 비밀번호와 인증 솔트가 통째로 유출됩니다.

개발자 · 운영 · 관리자 5분 읽기

개발 워크플로우 실무

취향 논쟁을 규칙 확인으로 바꾸는 디자인 리뷰

"좀 답답해 보인다" 는 반박할 수 없고 고칠 수도 없습니다. 간격 척도 밖의 값, 팔레트 밖의 색, 기준 미달 대비, 빠진 상태 — 네 항목만 규칙으로 바꿔도 리뷰의…

디자이너 4분 읽기

₩270,000 · 신청하기