플러그인 폴더에서 사용자 정의 게시물 유형 템플릿?


57

사람들이 테마 폴더를 건드리지 않고 사용할 수 있도록 사용자 정의 게시물 유형을 플러그인으로 제공하고 싶습니다. 그러나 single-movies.php와 같은 사용자 정의 포스트 유형 템플릿은 테마 폴더에 있습니다. 플러그인 폴더에서 WP가 single-movies.php를 확인하도록하는 방법이 있습니까? 파일러 계층에 함수 연결 ? 또는 get_template_directory (); ?

답변:


90

single_template필터 후크 를 사용할 수 있습니다 .

/* Filter the single_template with our custom function*/
add_filter('single_template', 'my_custom_template');

function my_custom_template($single) {

    global $post;

    /* Checks for single template by post type */
    if ( $post->post_type == 'POST TYPE NAME' ) {
        if ( file_exists( PLUGIN_PATH . '/Custom_File.php' ) ) {
            return PLUGIN_PATH . '/Custom_File.php';
        }
    }

    return $single;

}

대단한 답변입니다. single_template과 같은 사용 가능한 모든 템플릿을 얻을 수 있었는지 공유하십시오.
Gowri

6
@gowri 필터는 get_query_template()함수에 의해 호출됩니다 . 변수 후크이므로 첫 번째 부분 {$type}_template은 해당 함수에 전달되는 매개 변수에 따라 변경됩니다. 일반적인 것들에 대해서는 wp-includes / template.php 를보십시오
shea

이 튜토리얼 에서는 single_template 훅에 대해 잘 설명합니다. 후크를 이해하면 @shea의 의견은 add_filter( 'single-movies_template', 'my_custom_template' );연결된 자습서에서와 같이 @Bainternet의 답변보다 간단한 접근법을 제안합니다 . (이 질문은 새로운 답변으로 마감되었으므로 독자적으로 추가 할 수 없습니다.)
Greg Perham

2
당신은 대체 할 수 PLUGIN_PATHplugin_dir_path( __FILE__ )다음 파일 이름에서 첫 번째 슬래시를 제거합니다. 전체 경로는 다음과 같습니다.return plugin_dir_path( __FILE__ ) . 'Custom_File.php';
Frits

1
PLUGIN_PATH에서 오류가 발생했습니다. 다음은이 작업을 수행하는 방법을 보여주는 훌륭한 게시물입니다. wpsites.net/free-tutorials/…
Nathan

22

업데이트 된 답변

더 깨끗하고 짧은 버전.

function load_movie_template( $template ) {
    global $post;

    if ( 'movie' === $post->post_type && locate_template( array( 'single-movie.php' ) ) !== $template ) {
        /*
         * This is a 'movie' post
         * AND a 'single movie template' is not found on
         * theme or child theme directories, so load it
         * from our plugin directory.
         */
        return plugin_dir_path( __FILE__ ) . 'single-movie.php';
    }

    return $template;
}

add_filter( 'single_template', 'load_movie_template' );

이전 답변

@Brainternet answer에 테마 폴더의 사용자 정의 게시물 유형 특정 템플릿에 대한 검사를 추가했습니다.

function load_cpt_template($template) {
    global $post;

    // Is this a "my-custom-post-type" post?
    if ($post->post_type == "my-custom-post-type"){

        //Your plugin path 
        $plugin_path = plugin_dir_path( __FILE__ );

        // The name of custom post type single template
        $template_name = 'single-my-custom-post-type.php';

        // A specific single template for my custom post type exists in theme folder? Or it also doesn't exist in my plugin?
        if($template === get_stylesheet_directory() . '/' . $template_name
            || !file_exists($plugin_path . $template_name)) {

            //Then return "single.php" or "single-my-custom-post-type.php" from theme directory.
            return $template;
        }

        // If not, return my plugin custom post type template.
        return $plugin_path . $template_name;
    }

    //This is not my custom post type, do nothing with $template
    return $template;
}
add_filter('single_template', 'load_cpt_template');

이제 플러그인 사용자가 템플리트를 플러그인에서 테마로 복사하여 대체 할 수 있습니다.

이 예제에서 템플리트는 플러그인 및 테마의 루트 디렉토리에 있어야합니다.


1
저에게 청소기 옵션과 같은 소리 locate_template대신 사용 get_stylesheet_directory(여기 : code.tutsplus.com/tutorials/… ).
Felix

1
업데이트 된 답변이 작동하지 않거나 수락 된 답변 (또는 기존 답변)이 작동합니다.
Edward

2
당신은 맞습니다, @Edward, 그것은 끔찍한 업데이트였습니다. 펠릭스 제안으로 다시 업데이트했습니다. 또한 이번에는 코드를 게시하기 전에 테스트했습니다. :)
campsjos

4

필터 방법을 사용할 때 필터의 우선 순위를 지정하는 것이 매우 중요합니다.

add_filter('single_template', 'my_custom_template', 99);

이 작업을 수행하지 않으면 때때로 WP가이 필터 다음에 다시 검사를 시도합니다. 이 때문에 2 시간 동안 내 머리카락을 꺼내고있었습니다.


0

플러그인에 사용하는 훨씬 좋은 방법이 있습니다.

@campsjos가 여기 에 언급 했듯이 파일 존재 확인 대신 locate_template테마 대체 템플릿 파일을 체크인하는지 확인할 수 있습니다. 어느 것이 분명합니다.

function my_plugin_templates() {
    if (is_singular('movie')) {
        if (file_exists($this->template_dir . 'single-movie.php')) {
            return $this->template_dir . 'single-movie.php';
        }
    }
}

template_include위 코드를로드 하려면 필터 후크를 사용하십시오 .

add_filter('template_include' , 'my_plugin_templates');

0

이 페이지 덕분에 나는 같은 질문을 해결할 수있었습니다.

참고로, 이것은 내가 끝내는 것입니다.

function pluginName_myposttype_single_template($single_template) {
  $myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';
  return get_post_type() === 'myposttype' && file_exists($myposttype_template) ? $myposttype_template : $single_template;
}
add_filter('single_template', 'pluginName_myposttype_single_template');

{$ type} _template 필터 후크가 작동하지 않았습니다.

function pluginName_myposttype_single_template($single_template) {
  $myposttype_template = PLUGIN_DIR . 'templates/single-myposttype.php';

  if ( file_exists($myposttype_template) ) {
    $single_template = $myposttype_template;
  }
  return $single_template;
}
add_filter('single-myposttype_template', 'pluginName_myposttype_single_template');

-2

위의 대답은 훌륭하지만 $ single var를 확인하면 테마 / 자식 테마가 제공 한 템플릿이 템플릿을 재정의 할 수 있습니다.

/* Filter the single_template with our custom function*/
add_filter('single_template', 'your_cpt_custom_template');

function your_cpt_custom_template( $single ) {
    global $wp_query, $post;
    /* Checks for single template by post type */
    if ( !$single && $post->post_type == 'cpt' ) {
        if( file_exists( plugin_dir_path( __FILE__ ) . 'single-cpt.php' ) )
            return plugin_dir_path( __FILE__ ) . 'single-cpt.php';
    }
    return $single;
}

1
이것은 자식이나 테마에 single-cpt.php가 있는지 확인하지 않습니다. 모든 테마에 항상 존재하는 single.php 만 검사합니다.
newpxsn

맞아요, 제가 이것을 썼을 때 나는 정말로 맨 테마를 사용하고 있었는데 더 좋은 방법이 있어야합니다!
DigitalDesignDj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.