插件文件夹中的自定义发布类型模板?

时间:2011-05-16 作者:nathanbweb

我想提供我的自定义帖子类型作为插件,这样人们就可以使用它而不必接触他们的主题文件夹。但是自定义的post类型模板——比如单个电影。php——驻留在主题文件夹中。有没有办法让WP检查一部电影。插件文件夹中的php?将函数挂接到Filer Hierarchy? 或get\\u template\\u directory()?

8 个回复
最合适的回答,由SO网友:Bainternet 整理而成

您可以使用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;

}

SO网友:campsjos

更新的答案更简洁、更简短。

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\');
现在,您可以让插件用户将模板从插件复制到他们的主题以覆盖它。

在本例中,模板必须位于插件和主题的根目录中。

SO网友:RBizzle

我想指出的是,当您使用过滤器方法进行此操作时,按如下方式对过滤器进行优先级排序是非常重要的:

add_filter(\'single_template\', \'my_custom_template\', 99);
如果不这样做,有时WP会尝试在此过滤器之后重新检查。因为这个把我的头发拔了两个小时。

SO网友:pixelngrain

有一种更好的方法可以做到这一点,我正在为我的插件使用这种方法。

@campsjos 提到here, 您可以检查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\');

SO网友:Thomas Fellinger

多亏了这一页,我才能够为自己解决同样的问题。

作为参考,以下是我的结论:

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}\\u模板过滤器挂钩对我不起作用

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

SO网友:Ejaz UL Haq

这项工作对我来说,请尝试一下,感谢模板加载到cpt文件中,该文件位于自定义插件->;应用程序->;cpt->;cpt\\U文章。php模板位于自定义插件->;应用程序->;模板

add_filter( \'single_template\', \'load_my_custom_template\', 99, 1 );
 function load_custom_templates($single_template) {
   global $post;
   if ($post->post_type == \'article\' ) {
   $single_template = trailingslashit( plugin_dir_path( __FILE__ ) .\'app/templates\' ).\'single_article.php\';
  }
   return $single_template;
}

SO网友:Cyclonecode

在我自己的插件中,我通常使用locate_template() 这使得可以通过将插件模板复制到当前主题来覆盖插件模板:

function templateInclude(string $template): string
{
    if (is_single() && get_query_var(\'post_type\') === \'custom_post_type\') {
        $templates = [
            \'single-custom_post.php\',
            \'templates/single-custom_post.php\'
        ];
        $template = locate_template($templates);
        if (!$template) {
            $template = __DIR__ . \'/templates/single-custom_post.php\';
        }
    }
    return $template;
}

add_filter(\'template_include\', \'templateInclude\');
现在,用户可以通过从插件文件夹复制插件模板来覆盖插件模板templates/single-custom_post.php 将其直接放在根部或templates 活动主题中的文件夹。

我想在使用single_template 还要过滤。

SO网友:DigitalDesignDj

以上是一个很好的答案,但如果模板是由主题/子主题提供的,那么检查$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;
}

结束

相关推荐

Active Directory(AD)组身份验证以查看WordPress帖子?

我正在尝试使用active directory身份验证设置wordpress站点。出现的一个问题是,能否将类别/帖子/博客阅读限制在特定的广告组。我从来没有见过这样做,我也没有找到任何插件,似乎承诺这一功能。似乎最好的选择是只给一群用户一个具有read\\u private\\u posts功能的角色,但我不确定这会起到什么作用。