get_template_part ()의 결과를 무시할 수 있습니까?


11

나는 자식 테마를 만들고 있는데, 자식 테마의 단순성을 유지하고 시간이 지남에 따라 코드의 양과 유지 관리를 최소화하기 위해 기본 템플릿 파일을 재정의하지 않는 것이 좋습니다.

루프에서 부모 테마의 index.php 템플릿은 다음을 사용합니다. get_template_part( 'content' );

하는 가져올 것이다 content.php , 나는 그것이 같은보다 행동이 찾고 있어요 get_template_part( 'content', get_post_format() );또는 같은 다른 템플릿을 유치하기 위해서는 유사한 내용 aside.php 생성하지 않고, 등 의 index.php를 을 덮어 자식 테마 한 줄 변경에 대한 부모.

get_template_part() 으로 구성되다:

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

제 경우에는 get_template_part_content

나는 다음과 같은 행동으로 행동에 연결할 수 있습니다.

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

이로 인해 원하는 템플릿을 표시 할 수있는 후크 된 함수와 다른 일반 locate_template호출에서 포스트 복제가 발생 합니다.get_template_part()

나는 바로 같은 멍청한 짓을 수행하여 내 템플릿의 일부를 제공 한 후 렌더링, 또는 페이지를 종료하지 않고 중복없이이 작업을 수행하는 방법을 찾는 데 문제 break또는exit



3
템플릿 상속없이 비참한 삶에 오신 것을 환영합니다. :)
Rarst

답변:


3

이것을 할 후크가 없습니다. index.php를 자식 테마에 복사하고 한 줄을 변경하십시오. 또한 부모 테마 작성자에게 유연성을 위해 테마를 동일하게 변경해야한다고 말합니다.


이것은, 지금 거짓 t이-toudua 여기에 답변을 @ 참조
이반 카스텔라

템플릿 부분이 여전히로드되고 포함되기 때문에 그의 대답은 해결책이 아닙니다. 동작 후크는이를 무시할 수 없습니다.
오토

사실, 그러나 당신은 그 ob_start내부와 ob_endat 나중에 후크를 사용할 수 있으므로 실행되었지만 에코되지는 않습니다. 보통 충분합니다. 또는 exit ()를 사용하여 PHP를 강제 종료 할 수 있습니다 (여전히 누락 된 모든 항목을 수동으로 추가 한 후 : 바닥 글 등)
Ivan Castellanos

그리고 그것은 여전히 ​​해결책이 아닙니다. 출력을 억제하는 것은 오버라이드하는 것과 다릅니다.
오토

종료해도 출력이 억제되지 않습니다. 그 시점에서 효과적으로 실행을 중지합니다.
Ivan Castellanos

6

나는 그것이 원하는 방식으로 정확하게 가능하지 않다고 생각합니다. 템플릿 파일 이름을 변경하기 위해 필터를 얻지 못하는 것이 정말 짜증납니다.

그래도 해결 방법이 있습니다. content.php비교에 사용하자 .

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

나는 get_template_part함수 의 두 번째 인수를 사용하지 content.php않고 'content-'. $format파일 이없는 경우 파일 에 대한 호출을 피하기 위해 첫 번째 인수에 접미사를 전달했습니다 .


나는 이것이 좋은 방법이라고 생각합니다. 허용되지 않는 이유가 확실하지 않습니다 :)
Anh Tran

명성 문제, 아마도 :)
Shazzad

@Shazzad 미안하지만, 매우 영리하기 때문에 귀하의 답변에 공감을주었습니다.
TomHarrigan

3

글쎄, 해결책이 있습니다 :

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

그러나 신중하게 생각하십시오. 어떤 후크를 삽입해야합니까? 수동으로 위치를 가져 와서 사용하십시오. locate_template('content-header.php', false);


0

content-aside.php라는 파일을 가져 오려면 다음과 같이 함수를 호출하십시오.

get_template_part( 'content', 'aside' );

두 번째 매개 변수는 하이픈 뒤의 파일러 이름입니다. 파일이 하위 디렉토리 (templates / content-aside.php)에있는 경우 :

get_template_part( 'templates/content', 'aside' );

그게 당신이 찾고있는 것입니까?


고마워요 한 줄 변경을 위해 부모 테마 index.php를 덮어 쓰기 위해 자식 테마에서 index.php를 만들 필요가 없습니다. 하위 테마에 더 많은 유지 보수를 추가합니다. 가능하면 후크를 통해 달성하기를 바라고 있습니다.
TomHarrigan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.