손자 테마를 만들 수 있습니까?


15

창세기와 같이 인기있는 프레임 워크 중 하나를 사용하면 손자 테마를 만들 수 있습니까?

예를 들어, 모든 사이트의 백본으로 Genesis를 사용하고 싶습니다. 창세기는 프레임 워크라고하지만 실제로는 부모 테마입니다.

그런 다음 StudioPress에서 판매 할 Genesis 하위 테마 중 하나를 선택하고 각 사이트마다 계속 사용자 지정하고 싶습니다. 모든 사이트에 대한 손자 테마를 만들려고하는데 어떻게해야합니까?

답변:


17

예, 아니오

다른 자식 테마를 부모로 지정하여 자식 테마를 만들면 WordPress에서이를 사용하려고 시도합니다.

하나

핵심 개발자가 이것이 바람직하지 않은 행동이라고 명시 적으로 언급했으며 문제가 손자 테마를 지원하기 위해 노력하지 않을 것이라는 점은 말할 것도 없습니다.

예를 들어, WP API는 스타일 시트와 템플릿 URL / 디렉토리를 구별합니다. 여기서 스타일 시트는 항상 활성 테마를 참조하고 템플리트는 상위 테마를 참조하지만 조부모 테마가 포함 된 get_template_directory_uri경우 부모 또는 조부모를 참조합니까? 많은 API 호출이 이제 모호해졌으며, 다른 사람들은 핵심 코드를 포함하여 다른 행동을 기대할 것입니다. 당신은 또한로드해야합니다 것 functions.php부모 또는 조부모 중 하나, 그리고 확인이 올바른 순서로 이루어집니다 확인하십시오.

또한 매우 나쁜 습관으로 간주됩니다. 손자 테마가 필요한 경우 접근 방식이 잘못 설정되어 물러서서 다시 평가해야합니다.

나는 당신이 손자 테마의 개념을 피할 것을 권합니다. 더 많은 문제로 이어질 것입니다. 대신 하위 테마에서 더 많은 후크 필터 동작 및 모듈화를 통해 하위 테마 공유 구성 요소를 동일하게 유지하고 분기 / 포크를 약간 어렵게 할 수 있습니다. 공통 요소를 svn external / git 서브 모듈로 이동하십시오.

또한 자녀 테마를 기본으로 사용하고 복사본으로 작업하려는 의도가있는 부모가 아닌 자식 / 재정의 대신 포크하는 _s 모델이 있습니다.


제 경우에는 창세기와 함께 가면 하위 테마를 바로 수정해야합니까? Git에 익숙하지는 않지만 원래 자식 테마를 그대로 유지하는 데 도움이되는 접근법에 관심이 있습니다.
urok93

예, 여기에는 많은 옵션이 없습니다.
Tom J Nowell

훌륭한 손자 테마를 만들려고하면 어떻게 될지 궁금합니다.
Chris_O

1
필요한 경우 방법이 잘못 설정되었다고 언급했습니다. 제가 궁금한 이유는 WooCommerce Storefront 테마를 사용하는 것과 같은 시나리오 때문입니다. 그들은 다양한 것을 위해 맞춤화 된 어린이 테마를 상점 첫 화면에 판매합니다. 따라서 자녀 테마 중 하나를 사용하고 있지만 자녀 테마를 업데이트 할 때 덮어 쓰지 않는 방식으로 내 자신의 변화를 만들고 싶습니다 ... 어떻게해야합니까?
Drew Angell

1
잘 모르겠습니다. 이것이 상점 첫 화면 테마가 구축 된 방식의 한계입니다. 그 시점에서 하위 테마를 포크해야합니다.
Tom J Nowell

3

아래 설명 된 방법, 일반적인 "손자"테마를 완전히 테스트하지는 않았지만 template_include 필터 의 기능을 제공했습니다 .

    /*
    Plugin Name: Grandchild Themes
    Plugin URI: http://www.who-cares.com/
    Description: A concept for Grandchild themes Plugin
    Author: See Plugin URI
    Version: 0.0.0.0.1-Alpha
    */

    add_action('wp_head', 'grnd_chld_add_headers', 0);
    add_action('init', 'grnd_chld_add_css');

    // Load template if exists. 
function grandchild_template_include( $template ) {

    if ( file_exists( untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template ) ) )
        $template = untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/grnd_chld_templates/' . basename( $template );

    return $template;
}

// This is the actual filter that we want .
add_filter( 'template_include', 'grandchild_template_include', 11 );

    function grnd_chld_add_headers () {
        wp_enqueue_style('my_grandchild_style');
    }

    function grnd_chld_add_css() {
        $stamp = @filemtime(plugin_dir_path(__FILE__).'/style.css'); // easy versioning
        wp_register_style ('my_grandchild_style', plugins_url('style.css', __FILE__).'', array(), $stamp);
    }

    // From here , what you got is like a normal functions.php.

비슷한 방식으로 예를 들어 archive_template 과 같은 더 구체적인 필터를 사용해 볼 수도 있습니다.

add_filter ('archive_template', create_function ('', 'return plugin_dir_path(__FILE__)."archive.php";'));

말하고 행한 모든 것이 최선의 방법인지 잘 모르겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.