问题描述

我想提供我的自定义帖子类型作为插件,以便人们可以使用它而不触摸他们的主题文件夹。但是自定义帖子类型模板 (如 single-movies.php) 驻留在主题文件夹中。有没有办法让 WP 检查插件文件夹中的 single-movies.php?将功能挂接到 Filer Hierarchy 中?或者 get_template_directory(); ?

最佳解决方案

您可以使用 single_template 过滤钩。

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

function my_custom_template($single) {
    global $wp_query, $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;
}

次佳解决方案

在主题文件夹中添加一个自定义帖子类型特定模板的检查到 @Brainternet 答案。

function load_person_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_person_template');

现在,您可以让插件用户将模板从您的插件复制到主题以覆盖它。

有了这个例子,模板必须在插件和主题的根目录下。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。