it-swarm-ko.tech

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

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

55
nathanbweb

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;

}
87
Bainternet

업데이트 답변

클리너 및 더 짧은 버전.

function load_movie_template($template) {
    global $post;

    if ($post->post_type == "movie" && $template !== locate_template(array("single-movie.php"))){
        /* 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 대답에 대한 테마 폴더에 사용자 정의 게시물 유형 특정 템플릿에 대한 검사를 추가했습니다.

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');

이제 플러그인 사용자가 플러그인에서 테마로 템플릿을 복사하여 무시할 수있게 할 수 있습니다.

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

18
campsjos

나는 이것을 위해 필터 방법을 사용할 때 필터를 우선 순위 화하는 것이 매우 중요하다는 것을 지적하고자한다.

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

이 작업을 수행하지 않으면 WP가이 필터 다음에 다시 확인을 시도하는 경우가 있습니다. 2 시간 동안 이것 때문에 내 머리카락을 꺼내려고했다.

3
RBizzle

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

파일 존재 확인 대신 @ 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
pixelngrain