자식 테마가 부모가 활성화되었을 때 사용자 지정된 설정을 다시 적용하도록하려면 어떻게합니까?


17

대본

  1. 2015 테마를 선택하십시오. 배경 그림, 머리글 그림, 사이트 이름 및 태그 라인과 같은 다양한 설정을 사용자 정의하십시오.
  2. 그러나 테마 파일의 내용을 만지지 마십시오.
  3. 사용 코덱스 '아이 테마 2015 테마의 최소한의 자식 테마를 만들 수 있습니다.
  4. 새 하위 테마를 활성화하십시오.

죄송합니다?

이 최소 하위 테마가 활성화 된 사이트는 상위 테마와 완전히 다르게 보입니다. 배경 및 헤더 이미지가 사라지고 상위 2015 테마에서 기본적으로 활성화되지 않은 모든 사이드 바 (또는 헤더) 위젯이 활성화되었습니다.

2015 테마에 대한 몇 가지 사용자 정의 설정으로 사이트의 원래 모습 :

맞춤형 2015 테마의 SofietjeWonders

이 사이트는 2015 테마 파생 자식 테마로 표시되며, 필요한 헤더 style.css만 있고 Codex의 자식 테마 페이지에서 제안한 스타일 만 포함합니다 function.php.

여기에 이미지 설명을 입력하십시오

질문

하위 테마를 활성화하면 상위 테마의 사용자 정의 및 기본값이 유지되도록하려면 어떻게해야합니까?

이 경우 : 헤더 및 배경 사진과 기본 (사이드 바 / 헤더) 위젯의 제거 (비활성화?)


노트

이미 무거운 사용자 정의 테마의 하위 테마를 만드는 것은 복제본처럼 들릴 수 있지만 테마 파일을 편집하여 사용자 정의하는 것입니다.

이 질문 자식 테마를 활성화 할 때 어떤 핵심 설정을 재설정해야합니까? 맞춤 메뉴 등? 내가 무엇을하고 있는지 정확히 물어 보는 것 같습니다. 불행히도, 유일한 답변은 기능의 불일치에 대한 추측입니다.

나도 보았다

답변:


9

@webtoure의 답변에 +1을주었습니다. 올바른 방향을 제시 하기 때문에 점검이 부족하다고 생각합니다.

먼저 활성화중인 테마가 하위 테마인지 확인하지 않고 이전에 활성화 된 테마가 활성화중인 하위 테마의 상위 테마인지 확인하지 않습니다.

OP에 대한 나의 이해에 따라 이러한 조건이 필요합니다.

또한 고려해야 할 한 가지 문제는 이미 존재하는 하위 테마의 테마 모드를 사용하여 수행 할 작업입니다.

@webtoure 답변에서 백업에 저장되어 일부 환경에서 저장 될 수 있지만 WordPress에서는 기본적으로 인식하지 못하므로 추가 코드를 사용해야합니다.

자식 테마가 처음 활성화 때만 부모 테마에서 테마 수정을 상속하는 것이 더 좋을 것이라고 생각합니다 .

요컨대, 부모 테마에서 테마 모드를 상속하기 전에 확인하려는 조건은 다음과 같습니다.

  • 이전에 활성화 된 테마는 활성화중인 하위 테마의 상위 여야합니다.
  • 활성화되는 하위 테마는 이전에 활성화 된 적이 없어야합니다.

두 번째 조건을 보장하기 위해 WordPress는이 검사를 수행 할 수있는 방법을 제공하지 않으므로 사용자 정의 옵션을 사용합니다.

이것은 코드이며, 진행중인 일에 대한 설명은 인라인 주석을 읽으십시오.

add_action( 'switch_theme', function( $new_name, \WP_Theme $new_theme ) {

    // get the previously active theme
    $previous = get_option( 'theme_switched', -1 );

    // get the parent of current theme, will be false if no parent
    $parent = $new_theme->parent() ? $new_theme->get_template() : false;

    // current stylesheet name
    $stylesheet = get_option( 'stylesheet' );

    // has the theme being activated ever been activated before?
    $lastActive = get_option( $stylesheet . '_last_active', false );

    // if previouly active theme is the parent of the the child theme being activated
    // and it has never been activated before..
    if ( ! $lastActive && $parent === $previous ) {

        // update "last_active" option so following code won't run again for this theme
        update_option( $stylesheet . '_last_active', current_time( 'timestamp', 1 ) );

        // get the theme mods of the parent
        $previousMods = get_option( 'theme_mods_' . $parent, array() );

        // inherit current theme mods from parent theme mods
        update_option( 'theme_mods_' . $stylesheet, $previousMods );
    }

}, 10, 2 );

첫 번째 관심 사항은 실제로 정당화되지 않습니다. 현재 테마가 하위 테마가 아닌 get_template경우 현재 테마의 dir 이름을 반환합니다. 이전에 활성화 된 테마와 현재 테마 간의 관계를 알 필요가 없습니다. 테마에 부모가있는 경우 해당 설정을로드하고 그렇지 않으면 자체 설정 만로드합니다. 설정 덮어 쓰기 문제를 해결하는 두 번째 사항에 동의합니다.
webtoure

또한 원하는 하위 테마를 활성화하기 전에 사용자가 실수로 다른 테마를 활성화하면 어떻게됩니까? 코드가 작동하지 않으며 ( theme_switched, current_theme) 관계는 시작과 관련이 없습니다.
webtoure

1
당신이 현상금을 줄 것이다 경우 @MarjanVenema 나는 매우 행복 할 것 webtoure .
gmazzap

1
@MarjanVenema gmazzap은 실제로 그의 사고 과정에 대한 의견을 제시했으며 내 발췌 문장에 대한 수정을 제안했습니다. 누군가가 현상금을받을 자격이 있다면 그 사람이라고 생각합니다. 또한 완전히 쓸모없는 점에 대해서는 질문에 대답하지 않습니다. 나는 사랑한다 : 사람들과 상호 작용하고, 도전하고 일반적으로 내가 할 수있는 것을 돕는다.
webtoure

1
채팅을하려면 대화를 연장하십시오. 댓글은 해당 내용을위한 것이 아닙니다. :)
Rarst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.