개발 의도상 테마를 별도의 디렉토리에 두고 싶은 생각이 들었다. 플러그인을 놓고 쓰는 것처럼 말이다. 그런데 wp-config.php 코덱스를 참고해도 플러그인의 경로를 바꾸는 일은 허용되나, 테마에 대해서는 이런 설정이 공식적으로는 존재하지 않는다. 테마를 별도로 쓰려면, wp-contents 디렉토리를 벗어나지 않는 한에서 변경하기를 권장하기도 한다.
사실 실사용 서버에 이런 일을 할 필요는 없다. 단지 개발 서버상에서만 편하자고 하는 일이다.
나는 코어와 플러그인의 디렉토리를 분리해서 사용한다. 이렇게 해서 여러 사이트에 대해 개발을 할 때 단 한 벌의 코어로 대응할 수 있다. 이렇게 사용하는 법은 다른 포스트를 통해 소개한 바 있다.
테마 디렉토리는 플러그인과 같은 레벨에 둔다고 가정한다. 그리고 MU 플러그인을 하나 만들고 거기에 그냥 다음과 같이 적으면 된다.
register_theme_directory( dirname(__DIR__) . '/themes' );
이렇게 하면 이동한 테마 디렉토리에 있는 테마 목록이 워드프레스 ‘외모’메뉴에서 보이게 된다.
그런데 이렇게만 하면 문제가 발생한다. 왜냐하면 이 시점에서 정적 자원들을 웹서버로 접근할 때의 URL이 정해지지 않았기 때문이다. 테마가 나오지만, 이미지나 자바스크립트는 404 에러를 내면서 죽을 것이다. 당연히 웹서버에 현재 /themes 디렉토리에 대해 URL로 접근할 수 있도록 처리해야 한다. 플러그인의 WP_PLUGIN_DIR과 WP_PLUGIN_URL 설정이 두 개로 나뉘어져 있는 것과 동일한 이치다.
이 때는 아래와 같은 필터를 통해 해결할 수 있다.
add_filter( 'theme_root_uri', function( $theme_root_uri, $site_url, $stylesheet_or_template ) { $theme_root_path = dirname( __DIR__ ); if( strpos( $theme_root_uri, $theme_root_path ) === 0 ) { return substr( $theme_root_uri, strlen( $theme_root_path ) ); } return $theme_root_uri; }, 10, 3 );
합쳐진 MU 플러그인의 레시피는 아래와 같다. 단, 완벽한 동작을 보장할 수 없으니 개발용으로만 참고하시라.
<?php add_filter( 'theme_root_uri', function( $theme_root_uri, $site_url, $stylesheet_or_template ) { $theme_root_path = dirname( __DIR__ ); if( strpos( $theme_root_uri, $theme_root_path ) === 0 ) { return substr( $theme_root_uri, strlen( $theme_root_path ) ); } return $theme_root_uri; }, 10, 3 ); register_theme_directory( dirname(__DIR__) . '/themes' );