child_theme 전에 parent_theme functions.php를로드하는 방법은 무엇입니까?


12

functions.php자식 테마의 functions.php파일을로드 하기 전에 부모 테마의 파일 을로드해야한다는 문제가 있습니다 . 설정 및 초기화 절차에 필요합니다. 나는 /wp_core_root/wp-settings.php 안의 훅을 보았다 (이름 :) do_action('setup_theme');.

문제는 내가 얻을 첫 번째 파일은 자식 테마의이 없기 때문에, 거기에 후크하는 방법을 모르는 것입니다 functions.php, 그래서 add_action( 'setup_theme', 'my_init_function' );작동합니다.

편집 :
a) 플러그인이 테마보다 빨리로드되므로 초기 쿼리조차 액세스 할 수 있지만 플러그인에 의존하고 싶지 않습니다.
b) wp-settings.php 파일의 코드는 다음과 같습니다.

// happens a lot earlier:  
do_action( 'plugins_loaded' );

// localize stuff happening here
    do_action( 'setup_theme' );

        // Load the functions for the active theme, for both parent and child theme if applicable.
        if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
            include( STYLESHEETPATH . '/functions.php' );
        if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );
    // first available hook, *after* functions.php was loaded
    do_action( 'after_setup_theme' );

나는 두 가지를 피하고 싶다 : 먼저 사용자에게 많은 설명. 둘째, 실수로 부모의 초기화 절차를 삭제하여 밧줄을자를 경우 누군가가 무언가를 깰 가능성. 사람들은 functions.php 안에서 그것을 몰라도 아무것도 깰 위험없이 플레이해야합니다.

다른 말로하면 : 내 자식 테마 functions.php 파일을 어떻게 깨끗하게 유지하지만 부모 테마 부트 스트랩은 어떻게 유지합니까?

어떤 아이디어? 고마워요!


당신은 그것을 포함 할 수 있습니까?
wyrfel

내 질문은 : 어디서? 테마 컨텍스트에서로드되는 첫 번째 파일은 하위 테마 functions.php입니다. 은 "몰토 loko"에서 살펴 보자 wp-settings.php코어 파일 (라인 : 275-279 @wp 3.1 RC) ... 다음과 같습니다 if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) ) include( STYLESHEETPATH . '/functions.php' ); if ( file_exists( TEMPLATEPATH . '/functions.php' ) ) include( TEMPLATEPATH . '/functions.php' );, 난 기회를 볼 수 없습니다 ... 그리고 내가 사용하지 않도록 내 테마를 부트 스트랩하는 플러그인.
카이저

나는 여기에 완전히 빠져있을 수도 있지만, include(/path/to/parent/themes/functions.php)자식 테마 functions.php의 맨 위에 삽입하면 거기에있는 모든 것이 전에로드됩니다. 아니?
wyrfel

@ wyrfel : 나는 그것을 더 명확하게하기 위해 Q를 업데이트
카이저

고마워요, 지금 훨씬 더 명확합니다. 또한 단일 설치를 위해이 작업을 수행한다고 가정했습니다.
wyrfel

답변:


11

저스틴 타락 (Justin Tadlock)은 최근 에 (정확하게 기억한다면)이 정확한 문제를 다루는 더 나은 functions.php 파일을 만드는 것에 대한 훌륭한 게시물을 썼습니다
.

불행히도 그의 사이트는 현재 다운되어 있으므로 지금은 내 기억에 의존해야합니다.

당신은 after_setup_theme훅으로 올바른 길을 가고 있습니다.

  1. 내가 기억하는 한 필터와 동작을 함수로 감싸는 것입니다.
    아래 예를 참조하십시오.
  2. 부모 파일 과 자식 파일 모두 에서 수행 functions.php합니다.
  3. 그런 다음이 두 후크의 우선 순위로 재생할 수 있습니다.

천 단어의 가치가있는 작은 코드-부모 테마 function.php는 다음과 같아야합니다.

add_action( 'after_setup_theme', 'your_parent_theme_setup', 9 );
function your_parent_theme_setup() {    
    add_action(admin_init, your_admin_init);
    add_filter(the_content, your_content_filter);
}

function your_admin_init () {
...
}

function your_content_filter() {
...
}

흠, 쓰기 (+1) 주셔서 감사합니다. 당신은 인상적인 두뇌를 얻었습니다;). after_setup_themefunctions.php 파일이 이미로드 되었기 때문에 문제가 너무 늦다 는 것 입니다.
카이저

편집 : 코드를 다시 생각하고 "부모와 자식 functions.php에서 수행하십시오"와 "우선 순위로 재생"을 읽은 후에는 이해하기 시작합니다. 사용자가 쉽게 깰 수없는 더 나은 솔루션을 찾고 있지만 이해하는 것이 좋습니다! 감사!
카이저

여기에 실제 해결책이 없으므로 제안한 첫 번째 사람이므로 이것을 선택하십시오.
카이저

9

첫째, 당신은 할 수 없습니다. 자식 테마의 functions.php는 항상 먼저 마침표를로드합니다.

둘째, 테마는 setup_theme에 연결할 수 없습니다. 플러그인은 가능하지만 테마를 가장 먼저 연결할 수있는 것은 after_setup_theme입니다.

부모가 올바르게 설계되면 자식은 부모의 기능과 물건을 재정의 할 수 있지만 처음로드 할 때만 가능합니다.

일반적으로 부모의 함수 파일을 먼저로드해야한다고 생각하면 어쩌면 잘못하고있을 것입니다. 더 큰 문제를 설명해야합니다.


답변 주셔서 감사합니다. 테마 이전에 플러그인을로드해야한다는 사실을 이해하고 이미 사실을 깨달았습니다 (위의 내용 : "내 테마를 부트 스트랩하기 위해 플러그인을 사용하고 싶지 않습니다."). 내 경우를 정교하게하기 위해 : 모든 프레임 워크 부분을로드하는 데 관심이있는 ini 파일을 얻었습니다.이 파일은 부모 테마 함수 php에서 파일을 요구하고 init 클래스를로드하는 것으로 시작합니다. InitClass는 하위 테마 .ini 파일에서 a) 및 데이터 배열을로드 한 다음 추가 처리를 위해 다른 클래스로 푸시합니다. 메타 박스, 맞춤 게시물 유형 등
kaiser

내 문제는 부모님 functions.php 파일 에서이 모든 것을 초기화해야하므로 일반 사용자가 자식 테마 내부에서 놀 때 그것을 깰 수 없다는 것입니다. 두 번째 문제는 하위 테마의 functions.php 파일에서 해당 클래스를 모두 사용할 수 없으므로 사용할 수 없다는 것입니다. 그러나 아마도 여기에 큰 생각 오류가 있습니다. 더 나은 방법에 대한 아이디어 나 제안?
카이저

3
.... 사용자가 문제를 해결하면 실제로는 문제라는 사실을 받아 들여야한다고 생각합니다. 결론 : 부모 테마의 functions.php를 먼저로드하고 자식 테마를 "깨끗한"상태로 두는 방법 은 없습니다 . 부모 테마의 functions.php 파일이로드 된 후 실행하기 위해 자식 테마에 무언가가 필요한 경우 after_setup_theme에 연결된 함수 안에 넣습니다. 두 functions.php 파일이로드 된 후에 실행됩니다.
Otto

확인. 그렇게 큰 문제는 아닙니다. 가능성이 있다면 그냥 조사했습니다. 질문 : "소금 가치가있는 프레임 워크"는 초기화 절차 후에 후크를 갖고 단순히 after_setup_theme후크 를 사용하지 않는 것은 무엇입니까? 후크를 "스팸"하지 않기 위해 또는 더 "엔터프라이즈"또는 "쿨"사용자입니까? 내 말은 : 테마별 병렬 후크의 "모범 사례"아이디어는 "플러그인의 핵심 후크를 남겨 두는 것"입니까? (이것이 현재 내가 처리하는 방법입니다.)
kaiser

"그러면 추가 조치를 취하지 말고 after_setup_theme에 연결하십시오." 확인. 감사. +1
kaiser

4

따라서 자녀의 functions.php에서 코드를 실행하려고하지만 부모 테마가로드 된 후에. 간단하고 사용자 지정 작업을 사용하십시오.

끝에 parent/functions.php:

do_action('parent_loaded');

에서 child/functions.php:

function parent_loaded() {
    // do init stuff
}
add_action('parent_loaded', 'parent_loaded');

그들의 소금 가치가있는 모든 부모 테마는 이런 식으로합니다. 또한 자식 테마를 사용하기 위해 몇 가지 다른 작업과 필터가 뿌려졌습니다.


가능한 많은 지시를 피하려고 노력합니다. 이것이 하위 테마 폴더의 config.php 파일에서 전환하여 이제 ini 파일을 사용하는 이유 중 하나입니다. 한 문장으로 : 나는 이전 / 귀하의 솔루션에서 벗어나 최대한 코어와 코덱에 가깝게 노력하려고합니다. 내 문제는 자식 테마에서 단일 함수를 제공 할 수 없다는 것입니다. 자식 테마 프레임 워크 템플릿 태그에 대해 이야기하지 않는 자식 테마 functions.php 파일 내에 클래스 또는 부트 스트랩이 없습니다.
kaiser

업데이트 된 답변을 참조하십시오.
scribu

Q도 업데이트했습니다. 2/3 답변이 동일한 소스 (주제, 편집 전)를 가리킨다는 것을 읽은 후에는 "justin tadlock"방법 만 포함되어 있다는 느낌이 들지만 확실하게 알고 싶습니다.
카이저

2
당신이 그것에 갈 경우, 추가 조치를 귀찮게하지 마십시오. after_setup_theme에 연결하십시오.
Otto

0

다음 과 같이 functions.php하위 테마 파일에 상위 테마 파일 을 포함시키지 마십시오 functions.php.

어린이 테마 functions.php파일에서 :

if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( TEMPLATEPATH . '/functions.php' ) )
            include( TEMPLATEPATH . '/functions.php' );

// code of child theme's functions.php file continues here

이런 식으로 상위 테마의 functions.php파일은 변경되지 않습니다 (때로는 중요 함).


Q : "다른 말로하면 : 내 자식 테마 functions.php 파일을 어떻게 깨끗하게 유지하지만 부모 테마 부트 스트랩은 어떻게 유지합니까?" 더 나은 : functions.php 파일 내부에서 호출을 피하는 방법은 무엇입니까? 이유 : 사람들은 템플릿 파일에 포함하고 싶지 않은 모든 쓰레기를 분쇄하는 데 익숙합니다. 따라서 누군가 실수로 일부 줄을 삭제할 가능성이 높습니다. 내 경험 : 아무도 의견, 읽어보기 또는 문서를 읽지 않습니다.
카이저

0

나는 비슷한 문제가 있었고 부모에서 여분의 빈 "child-functions.php"를 만들고 자식에서 사용하려는 파일 / 함수 바로 뒤에 "functions.php"(부모도 포함)를 포함 시켜서 고쳤습니다. 그런 다음 자식 테마에서 "child-functions.php"파일을 만들고 부모가 우아한 솔루션이 아니지만 작업을 수행 한 후 child functions.php를 시뮬레이트 할 수있는 곳이 있습니다.

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