是否使用多个类别定位模板(_T)?

时间:2012-03-14 作者:Paul

在本例中(摘自Wrox book),如果single-category-$slug.php 文件存在,将显示,否则为single.php 文件但是如果每个帖子有多个类别(让我们考虑数组$templates 将包含多个结果),将$template包含我们在哪里使用此代码选择正确的slug?

<?php

add_filter( \'single_template\', \'boj_single_template\' );

function boj_single_template( $template ) {
    global $wp_query;

    /* Check if viewing a singular post. */
    if ( is_singular( \'post\' ) ) {

        /* Get the post ID. */
        $post_id = $wp_query->get_queried_object_id();

        /* Get the post categories. */
        $terms = get_the_terms( $post_id, \'category\' );

        /* Loop through the categories, adding slugs as part of the file name. */
        $templates = array();
        foreach ( $terms as $term )
            $templates[] = "single-category-{$term->slug}.php";

        /* Check if the template exists. */
        $locate = locate_template( $templates );

        /* If a template was found, make it the new template. */
        if ( !empty( $locate ) )
            $template = $locate;
    }

    /* Return the template file name. */
    return $template;
}

?>
谢谢

1 个回复
SO网友:eddiemoya

您发布的代码正在循环浏览该帖子分配的所有类别。

foreach构造一个字符串,表示它要检查的每个可能的模板文件,并将它们全部分配给$template.

这个locate_template() 函数将通过$templates 数组并返回实际存在的第一个数组。这就是将分配给$模板变量的内容。

如果事实证明这些文件都不存在,我相信locate_template() 将返回false。那里的代码只是检查locate_template() 在将模板分配给之前找到了任何模板$template.

然后,整个函数将该模板的名称返回给过滤器,如果您返回实际字符串,过滤器将加载该模板,否则它将继续沿着模板层次结构向下移动到“single”之后的下一种类型的模板。

编辑:其他信息

get_the_terms 使用wp_get_object_terms 默认情况下,它将按名称升序返回术语,因此如果一篇文章属于多个类别,您将始终按字母顺序加载第一个术语的模板。要更改此行为,请使用wp_get_object_terms 直接将orderby参数指定为“count”、“slug”、“term\\u group”、“term\\u order”或“term\\u id”。

结束

相关推荐

hide wp-content from urls

下面是我想从页面源中包含的文件的URL中隐藏wp内容的想法。在wp设置中定义以下内容。phpdefine (\'WP_CONTENT_URL\',\'http://example.com/myownfoldername\'); 并将此添加到.htaccessRewriteRule ^myownfoldername/(.*) /wp-content/$1 [QSA,L] 在localhost上没有其他插件的情况下,这似乎可以很好地工作,但在只有几个插件的在线站点上,它可以无缝地工作。我更