같은 필터에 콜백이 여럿 걸리면 워드프레스는 우선순위 번호가 낮은 것부터 차례로 부릅니다. 같은 번호끼리는 등록된 순서입니다. 기본값은 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 는 가장 유용하면서 가장 넓게 사고를 내는 훅이고, 가드 두 줄을 빠뜨리면 관리자 목록까지 함께 바뀝니다.