아카이브 화면에 글 카드를 만들었습니다. 며칠 뒤 검색 결과 화면에도 같은 카드가 필요해져서 마크업을 복사합니다. 이 순간 두 개의 진실이 생깁니다. 문제는 지금 생기지 않고, 두 달 뒤 카드에 배지를 하나 추가하면서 생깁니다 — 한쪽만 고치고 다른 쪽은 그대로 남습니다.
이런 종류의 고장은 조용합니다. 에러도 경고도 없고, 두 화면을 나란히 놓고 볼 일이 없으면 발견되지 않습니다. 그래서 고장을 고치는 것이 아니라 고장이 생길 수 없게 만드는 접근이 필요합니다.
소유자를 하나로 만듭니다
get_template_part() 는 마크업 조각을 별도 파일로 두고 필요한 곳에서 불러 쓰는 함수입니다. 조각 파일이 유일한 소유자가 되고, 화면 템플릿은 그것을 부르기만 합니다.
<?php
// archive.php · search.php 어디서든 같은 호출
while ( have_posts() ) :
the_post();
get_template_part( 'template-parts/card', 'note' );
endwhile;
두 번째 인자는 변형 이름입니다. 위 호출은 template-parts/card-note.php 를 먼저 찾고, 없으면 template-parts/card.php 로 떨어집니다. 기본형 하나에 변형을 얹는 구조가 자연스럽게 만들어지는 지점입니다.
그리고 여기서도 자식 테마 규칙이 그대로 적용됩니다. 조각 파일도 locate_template() 을 거치므로 자식 테마의 사본이 부모보다 먼저 잡힙니다. 부모 테마의 조각 하나만 바꾸고 싶다면 그 파일만 자식으로 복사하면 됩니다.
데이터는 인자로 넘깁니다
조각마다 조금씩 다른 값이 필요할 때가 있습니다. 예전에는 전역 변수를 세워 두고 조각에서 읽는 방법을 썼는데, 그러면 조각이 호출한 쪽의 사정을 알아야 하고 재사용이 어려워집니다. 지금은 세 번째 인자로 배열을 넘기고 조각 안에서 $args 로 받습니다.
<?php
get_template_part( 'template-parts/card', 'note', [
'heading' => 'h3',
'compact' => true,
] );
// template-parts/card-note.php 안에서
$heading = $args['heading'] ?? 'h2';
$compact = ! empty( $args['compact'] );
기본값을 조각 쪽에 두는 것이 핵심입니다. 그래야 인자 없이 부른 자리도 깨지지 않고, 조각이 스스로 완결됩니다.
조각으로 만들지 말아야 할 것
get_template_part() 는 값을 반환하지 않고 그 자리에서 출력합니다. 그래서 “결과 문자열이 필요하다” 는 상황이 오면 출력 버퍼로 감싸고 싶어지는데, 그 충동이 들었다면 그것은 조각이 아니라 함수여야 한다는 신호입니다. 문자열을 돌려주는 일은 템플릿 조각이 할 일이 아닙니다.
반대로 쪼개지 말아야 할 것도 있습니다. 한 화면에서만 쓰이고 앞으로도 그럴 마크업을 조각으로 빼면, 파일을 두 개 열어야 화면 하나를 이해할 수 있게 됩니다. 기준은 재사용이지 길이가 아닙니다.
이미 복사된 마크업을 찾는 방법은 단순합니다. 특징적인 클래스 이름 하나를 골라 테마 전체에서 검색해 보세요. 두 개 이상의 템플릿에서 같은 클래스가 나오면 그것이 조각으로 뺄 후보입니다.
구조를 정리하는 작업의 실제 절차는 작업 과정에 단계별로 공개돼 있고, 테마 구조를 다루는 다른 글은 테마 · 플러그인 아카이브에 있습니다.
다음 회차
마크업이 정리됐으니 스타일 쪽도 정리할 차례입니다. 다음 회차는 SCSS 빌드를 붙이는 방법과, 워드프레스 테마에서 늘 논쟁이 되는 질문 하나입니다 — 컴파일 결과물을 커밋할 것인가.