Wordpress使用自定义single.php

时间:2012-11-14 14:34:19

标签: php wordpress

我有自定义单页single-ENG.php。我想将此页面用于具有分类language=>english的帖子。这可能吗?

2 个答案:

答案 0 :(得分:1)

是的,这是可能的,但我认为你需要首先看一下Wordpress Template Hierarchy

您的方法存在一些问题:

您不应将自定义页面模板命名为“single-xxxx.php”。 “单个”前缀用于单个帖子视图。这可能会混淆Wordpress并导致它只在您查看帖子类型“ENG”的单个帖子时加载模板(可能在您的主题中不存在)。

不建议将Pages作为Shell用于任何类型的Post内容。这样做的原因是你基本上绕开了Wordpress提供的现有工具,以迫使它使用自己的内置默认值做它已经可以做的事情。

为什么不创建一个taxonomy-language-english.php文件,并在主题的菜单(仪表板 - >外观 - 中设置)导航,而不是创建一个全新的页面对象来存放给定分类的帖子。 >菜单)

如果您实际上Registered your Language Taxonomy,Wordpress将自动识别新的分类模板并在其默认循环中查询所有适当的数据。

详细介绍了如何使用两种方法查询帖子。第一个是我建议使用的,只要你改变你的结构以适合作为良好练习的练习。第二个是通过将自定义模板应用于给定页面的方法。我冒昧地使用新的文件名来避免混淆Wordpress:

使用taxonomy-language-english.php

<?php
if(have_posts()) : while(have_posts()) : the_post();
    echo get_the_title().'<br/>'; //Output titles of queried posts
endwhile;
else :
    echo 'No posts were found'; //No posts were found
endif;
?>

使用pagelang-english.php

<?php
/**
* @package WordPress
* @subpackage MyWordpressThemeName
* Template Name: Single English
*/
$args = array('tax_query' => array(
    array(
        'taxonomy' => 'language',
        'field' => 'slug',
        'terms' => 'english'
    )
));
$q = new WP_Query($args);
if($q->have_posts()) : while($q->have_posts()) : $q->the_post();
    echo get_the_title().'<br/>'; //Output titles of queried posts
endwhile;
else :
    echo 'No posts were found'; //No posts were found
endif;
?>

这应该足以让你入门。祝你好运。

答案 1 :(得分:1)

是的,你可以这样做。以下代码假定您的自定义分类法被称为language,并且要检查的术语具有段english(显然根据需要更改)。将此代码放在functions.php文件中。

/**
 * Select a custom single template
 *
 * @param required string $single The path to the single template
 * @return string $single The updated path to the required single template
 */
function my_single_template($single){

    global $wp_query, $post;

    $terms = wp_get_object_terms($post->ID, 'language');

    if(!empty($terms)) : foreach($terms as $term) :

            if($term->slug === 'english') :
                $single = sprintf('%1$s/single-ENG.php', TEMPLATEPATH); 
            endif

        endforeach;
    endif;

    return $single;

}
add_filter('single_template', 'my_single_template');

修改

阅读@ maiorano84提供的答案后,我同意这不是最好的方法。我可以想到应该使用这种技术的情况很少,但是WP添加过滤器的事实表明他们理解可能有需要,所以你应该安全地使用它。