Technote

테마 · 플러그인 실무

연재 자식 테마 개발 실무 8부 중 3부

조각 나누기 — 같은 마크업을 두 곳에 두지 않기

복사한 마크업은 반드시 어긋납니다. 한쪽을 고치면 다른 쪽은 그대로 남고, 두 화면이 서로 다른 말을 하기 전까지 아무도 모릅니다.

아카이브 화면에 글 카드를 만들었습니다. 며칠 뒤 검색 결과 화면에도 같은 카드가 필요해져서 마크업을 복사합니다. 이 순간 두 개의 진실이 생깁니다. 문제는 지금 생기지 않고, 두 달 뒤 카드에 배지를 하나 추가하면서 생깁니다 — 한쪽만 고치고 다른 쪽은 그대로 남습니다.

이런 종류의 고장은 조용합니다. 에러도 경고도 없고, 두 화면을 나란히 놓고 볼 일이 없으면 발견되지 않습니다. 그래서 고장을 고치는 것이 아니라 고장이 생길 수 없게 만드는 접근이 필요합니다.

소유자를 하나로 만듭니다

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 빌드를 붙이는 방법과, 워드프레스 테마에서 늘 논쟁이 되는 질문 하나입니다 — 컴파일 결과물을 커밋할 것인가.

이 주제의 다른 글

노하우 목록으로

테마 · 플러그인 실무

편집 가능한 영역을 디자인 전에 정합니다

CMS 가 표현할 수 없는 디자인은 배포된 뒤에도 계속 협상 대상으로 남습니다. 어디까지 편집자가 바꿀 수 있는지를 먼저 정하면 그 협상 자체가 사라집니다.

디자이너 3분 읽기

테마 · 플러그인 입문

업데이트가 멈춘 플러그인을 판별하는 기준

마지막 업데이트 날짜 하나로는 방치를 판정할 수 없습니다. 판별 신호 다섯 개를 함께 보고, 대체 불가라면 격리 조건이라도 걸어야 합니다.

기획자 · 운영 · 관리자 2분 읽기

테마 · 플러그인 심화

JS 없이 만드는 상호작용과 그것을 안전하게 하는 규칙

details · :target · :focus-within · :has() · 스크롤 타임라인으로 상당수의 상호작용이 스타일시트 안에서 끝납니다. 안전하게 만드는 규칙은 하나입니다 — 기본값이 완성된 상태여야 합니다.

디자이너 6분 읽기

₩270,000 · 신청하기