Wordpress 自定义帖子类型的单帖子模板替代

Wordpress 自定义帖子类型的单帖子模板替代,wordpress,wordpress-theming,custom-post-type,custom-wordpress-pages,Wordpress,Wordpress Theming,Custom Post Type,Custom Wordpress Pages,我有一个独特的场景,我正在努力确定。我正在为已经存在的自定义帖子类型开发一个新模板。基本上,我们正在用一个新的文件替换单一的customposttype.php文件。所有这些都进行得很顺利,除了一件事——他们有一个自定义帖子类型的帖子,希望保留旧模板 因此,有一个新的单一customposttype.php文件,它将作为该CPT的默认单一模板 但是我需要ID#93才能使用旧的单一customposttype.php模板。我希望只使用single-customposttype-93.php就可以做

我有一个独特的场景,我正在努力确定。我正在为已经存在的自定义帖子类型开发一个新模板。基本上,我们正在用一个新的文件替换单一的customposttype.php文件。所有这些都进行得很顺利,除了一件事——他们有一个自定义帖子类型的帖子,希望保留旧模板

因此,有一个新的单一customposttype.php文件,它将作为该CPT的默认单一模板

但是我需要ID#93才能使用旧的单一customposttype.php模板。我希望只使用single-customposttype-93.php就可以做到这一点,但事实并非如此。将其他模板仅应用于一个帖子id的最佳方法是什么


提前谢谢

我一直在处理自定义模板加载,这非常简单!实际上,您所需要做的就是钩住钩子,并根据您想要的任何条件重写模板

该钩子接受一个参数,即要加载的
$template
文件。然后,您可以使用任何想要的条件,强制加载一个单独的文件

add_filter( 'template_include', 'custom_template_include', 99 );
function custom_template_include( $template ){
    // For ID 93, load in file by using it's PATH (not URL)
    if( get_the_ID() === 93 ){
        // Note the file name can be ANYTHING, the WP auto-template names don't matter here
        $file = get_stylesheet_directory() . '/post-id-93-custom-template.php';

        // It's generally good to see if the file exists before overriding the default
        if( file_exists( $file ) )
            $template = $file;
    }

    // ALWAYS return the $template, or *everything* will be blank.
    return $template;
}
就这么简单!在自定义PHP文件中,您可以访问所有WordPress函数,就像使用默认模板一样

通常,您需要在模板上使用
file\u exists()
函数,以确保找到它,否则您将传递一个不存在的文件,并且该页面将不会加载。通过检查它是否存在,如果找不到(删除/重命名/移动等),它仍将返回到旧模板

此外,您始终需要在末尾添加
return$template
,否则任何使用WordPress模板系统的内容都将被破坏


我在一个演示站点上做了一个快速示例:


这些策略是自定义的post类型,并且cookie策略通常会加载。另一个是用与上面相同的代码修改的(名称/ID更改为匹配),它加载到一个简单的.php文件中,其中包含该内容。

我一直在处理自定义模板加载,这真的很简单!实际上,您所需要做的就是钩住钩子,并根据您想要的任何条件重写模板

该钩子接受一个参数,即要加载的
$template
文件。然后,您可以使用任何想要的条件,强制加载一个单独的文件

add_filter( 'template_include', 'custom_template_include', 99 );
function custom_template_include( $template ){
    // For ID 93, load in file by using it's PATH (not URL)
    if( get_the_ID() === 93 ){
        // Note the file name can be ANYTHING, the WP auto-template names don't matter here
        $file = get_stylesheet_directory() . '/post-id-93-custom-template.php';

        // It's generally good to see if the file exists before overriding the default
        if( file_exists( $file ) )
            $template = $file;
    }

    // ALWAYS return the $template, or *everything* will be blank.
    return $template;
}
就这么简单!在自定义PHP文件中,您可以访问所有WordPress函数,就像使用默认模板一样

通常,您需要在模板上使用
file\u exists()
函数,以确保找到它,否则您将传递一个不存在的文件,并且该页面将不会加载。通过检查它是否存在,如果找不到(删除/重命名/移动等),它仍将返回到旧模板

此外,您始终需要在末尾添加
return$template
,否则任何使用WordPress模板系统的内容都将被破坏


我在一个演示站点上做了一个快速示例:


这些策略是自定义的post类型,并且cookie策略通常会加载。另一个是使用与上面相同的代码修改的(名称/ID更改为匹配),它加载到一个简单的.php文件中,其中包含该内容。

Hmm。它看起来非常简单,而且您的示例显然有效。但由于某些原因,它在我的安装中不起作用。我对您的代码所做的唯一更改是文件名,它确实存在。这让我相信我的安装中的某些东西可能正在覆盖覆盖。有什么想法吗?(很抱歉,由于保密协议,我无法显示安装)文件是否位于正确的位置?上面的代码假定它位于主题目录的基本级别。您可以执行
var\u转储(文件存在($file))bool(true)
。如果是,您可以尝试将函数的优先级从
99
更改为更高的值,
999
9999
-主题中可能有某些内容或插件在
template\u include
上运行某些内容,而不是
99
嗯。这看起来很简单,你的例子显然是有效的。但由于某些原因,它在我的安装中不起作用。我对您的代码所做的唯一更改是文件名,它确实存在。这让我相信我的安装中的某些东西可能正在覆盖覆盖。有什么想法吗?(很抱歉,由于保密协议,我无法显示安装)文件是否位于正确的位置?上面的代码假定它位于主题目录的基本级别。您可以执行
var\u转储(文件存在($file))bool(true)
。如果是,您可以尝试将函数的优先级从
99
更改为更高的、
999
9999
-主题中可能有某些内容或插件在
template\u include
上运行某些内容,而不是
99