你这里有很多问题。
尽可能不要定义全局变量和常量。全球范围是一个邪恶的地方。WordPress已经把全球范围搞得一团糟,不要再搞得一团糟了。可以在函数/过滤器中使用静态变量
避免使用TEMPLATEPATH
. 您应该使用get_template_directory_uri()
. IIRC,某处有一个关于未来折旧的通知TEMPLATEPATH
, 但这需要引用locate_template()
对于仍在使用的TEMPLATEPATH
. 但无论如何,使用get_template_path_directory_uri()
对于父主题,这是正确的方式
您想使用locate_template()
搜索特定模板,而不是file_exists
. 让WordPress处理WordPress的内容。如果WordPress不提供本机函数/方法,则仅使用PHP(或自定义SQL)。本机函数用于处理使用自定义PHP时可能会忘记的其他内容
在新的背景下,如果我们使用locate_template()
, 我们不需要使用get_template_directory_uir()
. locate_template()
默认情况下,为我们处理该节。这就是为什么使用本机WordPress函数来处理特定作业很重要的原因
生成的文件名中有一个双斜杠。你的常数是/single/
您的文件名是/single.php
, 其中呈现/single//single.php
. 您需要删除一条斜线,以避免重复斜线
single-{$post_type}.php
默认情况下用于自定义帖子类型如果您在循环外处理单个post页面的post对象,请使用get_queried_object()
这比$post
全球的
尽管您的语法有效,但最好使用花括号({}
) 而不是:
和endforeach
语法。这也适用于条件语句的语法。我更喜欢卷发,因为如果代码失败,它们很容易调试
如果您像以前一样创建自定义层次结构,请始终设置index.php
作为最终回退模板index.php
所有主题都需要
让我们正确地重写代码(NOTE: 我使用的闭包有一个缺点,就是不能通过remove_filter()
, 所以,如果你愿意的话,把它改成普通的意大利面)。我们将使用内部逻辑get_single_template()
来帮助我们
(代码需要PHP 5.4+,并且untested罢工>)
add_filter( \'single_template\', function ( $template )
{
// Get the current single post object
$post = get_queried_object();
// Set our \'constant\' folder path
$path = \'single/\';
// Set our variable to hold our templates
$templates = [];
// Lets handle the custom post type section
if ( \'post\' !== $post->post_type ) {
$templates[] = $path . \'single-\' . $post->post_type . \'-\' . $post->post_name . \'.php\';
$templates[] = $path . \'single-\' . $post->post_type . \'.php\';
}
// Lets handle the post post type stuff
if ( \'post\' === $post->post_type ) {
// Get the post categories
$categories = get_the_category( $post->ID );
// Just for incase, check if we have categories
if ( $categories ) {
foreach ( $categories as $category ) {
// Create possible template names
$templates[] = $path . \'single-cat-\' . $category->slug . \'.php\';
$templates[] = $path . \'single-cat-\' . $category->term_id . \'.php\';
} //endforeach
} //endif $categories
} // endif
// Set our fallback templates
$templates[] = $path . \'single.php\';
$templates[] = $path . \'default.php\';
$templates[] = \'index.php\';
/**
* Now we can search for our templates and load the first one we find
* We will use the array ability of locate_template here
*/
$template = locate_template( $templates );
// Return the template rteurned by locate_template
return $template;
});
编辑上述代码已按预期进行测试并正常工作。编辑2-PHP 5.4之前的版本(T\\u Rex仍在黑暗中漫游)
add_filter( \'single_template\', function ( $template )
{
// Get the current single post object
$post = get_queried_object();
// Set our \'constant\' folder path
$path = \'single/\';
// Set our variable to hold our templates
$templates = array();
// Lets handle the custom post type section
if ( \'post\' !== $post->post_type ) {
$templates[] = $path . \'single-\' . $post->post_type . \'-\' . $post->post_name . \'.php\';
$templates[] = $path . \'single-\' . $post->post_type . \'.php\';
}
// Lets handle the post post type stuff
if ( \'post\' === $post->post_type ) {
// Get the post categories
$categories = get_the_category( $post->ID );
// Just for incase, check if we have categories
if ( $categories ) {
foreach ( $categories as $category ) {
// Create possible template names
$templates[] = $path . \'single-cat-\' . $category->slug . \'.php\';
$templates[] = $path . \'single-cat-\' . $category->term_id . \'.php\';
} //endforeach
} //endif $categories
} // endif
// Set our fallback templates
$templates[] = $path . \'single.php\';
$templates[] = $path . \'default.php\';
$templates[] = \'index.php\';
/**
* Now we can search for our templates and load the first one we find
* We will use the array ability of locate_template here
*/
$template = locate_template( $templates );
// Return the template rteurned by locate_template
return $template;
});