基于父级显示不同类别的类别模板

时间:2011-10-24 作者:Corbula

好的,我有这样的分类设置。

Products
   Category A
       Sub Category 1
       Sub Category 2
   Category B
   Category C
我需要的是让产品类别页面显示主要类别(A、B、C)。

主类别页面(A、B、C)显示其子类别(1、2)。

然后,子类别(1,2)显示我的自定义帖子类型,即实际产品。

我想避免使用类别slug。php模板,因为当有人添加新类别时,我希望它根据父类别自动显示在正确的页面上。

我考虑使用一个类别。php模板,但我不知道这是否可以从一个模板或我需要什么代码。

第一个类别页面(产品)将仅显示主要类别(A、B、C)。它不会显示任何帖子,只会在主要部分显示类别链接列表。所以我可以把它们设计成页面上的大按钮。A类、B类、C类也将如此。显示子类别。

最后一个类别页面(子类别1,2)将在某种列表中显示我的自定义帖子类型(实际产品)。本页不显示任何其他类别,仅显示主节中的产品。

如果能为我提供帮助,我将不胜感激。

谢谢

更新:我已设法获得类别模板,以显示正确的类别。它似乎在工作,但我还没有测试好。

我现在的问题是在最深层类别上显示我的自定义帖子类型。因此,它将显示诸如自定义帖子类型标题、缩略图,或者摘录之类的内容。

这是我正在使用的代码。

<?php // list child categories
$cat_id = get_query_var(\'cat\');

$catlist = wp_list_categories(\'depth=1&hide_empty=0&echo=0&orderby=id&title_li=&child_of=\' . $cat_id);

if ($catlist) {
echo $catlist;
} else {
echo "Please don\'t print No categories";
} ?>
目前在最深层分类页面上,它只显示“无分类”。我需要获得显示属于该类别的自定义帖子类型的页面。

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

在网上搜索了一段时间后,我终于找到了工作。

这在函数中进行。php

function category_has_children() {
global $wpdb;
$term = get_queried_object();
$category_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = \'$term->term_id\' ");
     if ($category_children_check) {
          return true;
     } else {
          return false;
     }
}
这属于这一类。php模板

<?php

if (!category_has_children()) {?>
<?php foreach(get_the_category() as $category) {
$cat = $category->cat_ID; }?>
<?php query_posts(\'post_type=Product&cat=\' .$cat .\'&order=ASC\'); ?>
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
            <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
                    <?php endwhile;?>
        <?php endif; ?> 
<?php get_template_part(\'loop\', \'index\');
} else {?>

<?php 
$cat_id = get_query_var(\'cat\');
$catlist = get_categories(\'child_of=\' . $cat_id);
if ($catlist) {
wp_list_categories(\'depth=1&hide_empty=0&echo=1&orderby=id&title_li=&child_of=\' . $cat_id);
} 
}
?>
如果一个类别有子类别,此代码将显示子类别;如果它没有子类别,则将显示该类别的帖子,以我的产品为例。如果一个类别没有任何子类别,也没有任何帖子,它将不会显示任何内容。

SO网友:endle.winters

我成功地完成了您所描述的操作,但用于自定义分类法。。用一小段额外的代码。毫无疑问,有一种更好的方法来编写代码,最重要的是,有一种更有效的方法来完成这一任务。

但这起到了作用,并且正在一个活跃的网站上工作。我将描述我所做的工作,您可以根据自己的需要修改代码:

My problem:和您一样,我希望有一个通用页面,可以显示我发送给它的任何分类术语,而不必创建分类slug。我的分类法中每个新术语的php文件。澄清一下:我的自定义帖子类型是视频,我的自定义分类法是视频类型

My solution我设法从分类法列表中获取分类法术语(当有人单击该术语时获取),然后将其发送到特定自定义帖子类型的存档页面。它读取该术语,然后使用该taxo0nmy术语显示帖子类型

My Code在网上某处找到这个。它将粘贴到函数文件中:

/*add a filter to pass queries to pages
can be sent like so: <?= add_query_arg(\'t\', \'argument\', home_url( \'/videos/\' )); ?>
can be called like so:  $qvar = get_query_var(\'t\');
*/
add_filter(\'query_vars\', \'p_query\');

    function p_query($qvars) {
        $qvars[] = \'t\';
        return $qvars;
    }
在主页上,我使用wp查询将所有不同的“视频类型”列为可点击链接,以显示分类法中每个不同术语的最新帖子。

The Query

$term_args=array(
    \'orderby\' => \'menu_order\',
    \'order\' => \'DESC\'
);
$terms = get_terms($taxonomy,$term_args);
if ($terms) {
  foreach( $terms as $term ) {
    $args=array(
      \'post_type\' => \'videos\',
      \'video_types\' =>  $term->name ,
      \'post_status\' => \'publish\',
      \'posts_per_page\' => 1,
      \'caller_get_posts\'=> 1
      );
    $my_query = null;
    $my_query = new WP_Query($args); 
    if( $my_query->have_posts() ) {  ?>
       <div class="thumb">
        <h3 class="darken"><?php echo $term->name;?></h3>

        <?php
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
The Links然后,我将循环中的每个术语作为如下链接:

<a href="<?= add_query_arg(\'t\', strtolower($term->name), home_url( \'/videos/\' )); ?>">
 <h3><?php echo $term->name;?></h3>
</a>
然后将该术语名称和URL一起发送到存档视频。php页面。链接最终如下所示:

http://thedomainname/videos/?t=theterm

然后是档案视频上的代码。php页面如下所示:

<a href="<?= add_query_arg(\'t\', strtolower($term->name), home_url( \'/videos/\' )); ?>">
 <h3><?php echo $term->name;?></h3>
</a>
 下面我可以列出该特定分类术语中的所有视频:

<?php while (have_posts()) : the_post(); ?>

    <?php the_post_thumbnail(); ?>

<?php endwhile;?>
所以这给了我一个通用页面,可以显示我发送给它的任何视频类型。。它允许网站所有者创建他们想要的任何新视频类型,并将自动作为链接显示在主页上。

同样,我认为对PHP有更好的工作知识的人可以用更好的方式写这篇文章(我很乐意看到),但这个想法是存在的,而且是可行的。

结束