如何创建一个类别和子类别排序的所有帖子的博客卷?

时间:2013-05-14 作者:Fernando Silva

我想得到一些帮助,将我网站上的所有帖子按类别和子类别发布到博客卷中。

我希望看到显示的最终结果HTML如下:

<div id="content">

    <div id="category1">

        <ul id="posts">
            <li>post1</li>
            <li>post2</li>
            <li>post3</li>
        </ul><!-- #posts -->

    </div><!-- #category1 -->

    <div id="category2">

        <div id="sub-category1">

            <ul id="posts">
                <li>post4</li>
                <li>post5</li>
                <li>post6</li>
            </ul><!-- #posts -->

        </div><!-- #sub-category1 -->

        <div id="sub-category2">

            <ul id="posts">
                <li>post7</li>
                <li>post8</li>
                <li>post9</li>
            </ul><!-- #posts -->

        </div><!-- #sub-category2 -->

    </div><!-- #category2 -->

</div><!-- #content -->
我预见到的文件结构如下:

custom-category.php //此文件将提取类别,对其进行排序,并为#category和#sub category创建容器div,并使用从其循环/查询中调用帖子信息get_template_part( \'content\', get_post_format() );

content.php //该文件将对ul#帖子和我可能想添加的关于帖子本身的各种信息进行排序

现在我面临的主要问题是,我真的不知道从哪里开始寻找,甚至自己都不知道该怎么做。我一直在看默认值category.php 我觉得它看起来一点也不像。

我试过查看插件,但有些插件只对侧栏中的类别进行排序,其他插件允许为类别创建自定义字段,但评论中提到您不能调用这些值。我尝试了wp\\u list\\u categories();函数尝试从某个地方开始,但它甚至没有列出子类别。

我读过关于创建自己的query_posts();get_posts(); 但我真的不知道从哪里开始。

由于这并不是一个问题,我想尝试指出这些问题以便于澄清,但请随意添加其他信息,因为我可能会问错问题xD

1-如何启动“循环”以获得类别/子类别
2-如何对类别进行排序并保持子类别嵌套
3-我如何确保这些帖子会落在正确的分区中?以防万一WP做了一些有趣的事。

谢谢你的帮助。

--- Update ---

我一直在互联网上寻找解决方案,我开始有所进展,但还没有完全实现。到目前为止,我得到的是:

<?php
        // get all the categories from the database
        $args1 = array(
          \'orderby\' => \'ID\',
          \'order\' => \'ASC\',
          \'hierarchical\' => true,
          );
        $cats = get_categories( $args1 ); 


            // loop through the categries
            foreach ($cats as $cat) {
                // setup the cateogory ID
                $cat_id= $cat->term_id;
                // Make a header for the cateogry
                echo "<h2>".$cat->name."</h2><p>".$cat->term_id."</p>";
                // create a custom wordpress query
                $args2 = \'cat=\' . $cat_id . \'&orderby=date&order=DESC&post_per_page=-1\';
                query_posts( $args2 );
                // start the wordpress loop!
                if (have_posts()) : while (have_posts()) : the_post(); ?>

                    <?php // create our link now that the post is setup ?>
                    <a href="<?php the_permalink();?>"><?php the_title(); ?></a>
                    <?php echo \'<hr/>\'; ?>

                <?php endwhile; endif; // done our wordpress loop. Will start again for each category ?>
            <?php } // done the foreach statement ?>
我在上找到了这段代码this website. 它输出所有类别并将帖子放在它们下面,但它复制父类别的帖子,如下所示:

<h2>Category1</h2><p>2</p> 
    <a href="http://localhost/wordpress/2013/05/06/test0/">test0</a>
                    <hr> 
<h2>Category2</h2><p>3</p>
    <a href="http://localhost/wordpress/2013/05/15/test2/">test2</a>
                    <hr> 
    <a href="http://localhost/wordpress/2013/05/14/test1/">test1</a>
                    <hr> 
<h2>Sub-category1</h2><p>4</p>
    <a href="http://localhost/wordpress/2013/05/14/test1/">test1</a>
                    <hr> 
<h2>Sub-category2</h2><p>5</p>
    <a href="http://localhost/wordpress/2013/05/15/test2/">test2</a>
                    <hr> 
正如您所看到的帖子,test1和test2显示在Category2中,这并不是我想要的,正如在最初的问题(最终结果HTML)中所描述的那样。

我认为我需要添加一个条件语句来验证当前类别是否有子类别,如果没有填充,是否跳转到子类别。但我还在想办法。我还没有达到一个足够舒适的程度,开始尝试实现我打算在最终结果HTML中使用的div,但我觉得我也会有一个问题。在这一点上,我基本上是想学习更多关于这个“循环的东西”,直到我得到一个像样的结果,这将使我能够把我的头围绕整个事情。

我知道这两个链接AB 但我仍然是一个新手,还不能真正做到这一点,所以我基本上是在使用代码,我看到代码正在工作,并将努力在我前进的过程中得到改进。

--- Update ---

这似乎可以按照正确的顺序输出帖子,而不会重复父类别。

<?php
        // get all the categories from the database
        $args1 = array(
          \'orderby\' => \'ID\',
          \'order\' => \'ASC\',
          \'hierarchical\' => true
          );
        $cats = get_categories( $args1 ); 

            // loop through the categries
            foreach ($cats as $cat) {
                $cat_id= $cat->term_id;// setup the cateogory ID
                $cat_name= $cat->name;// setup the category name
                $parent= $cat->category_parent;// setup the category parent
                $cat_child= get_term_children( $cat_id, \'category\' ); //the function I had get_category_children(); was deprecated... fixed that

                $has_child=bool; //
                if( empty($cat_child)) { $has_child= false; }
                else { $has_child= true; }

                if ( $parent == 0 && $has_child == true ) { //is parent && has child -> post title
                    echo "<h2>".$cat_name."</h2>";
                    echo \'<hr/>\'; }
                elseif ( $parent == 0 && $has_child == false ) { //is parent && no child -> loop posts
                    echo "<h2>".$cat_name."</h2>";
                    // create a custom wordpress query
                    $args2 = \'cat=\' . $cat_id . \'&orderby=date&order=DESC&post_per_page=-1\';
                    query_posts( $args2 );
                    // start the wordpress loop!
                    if (have_posts()) : while (have_posts()) : the_post(); ?>
                        <?php the_title(); ?>
                        <?php echo \'<hr/>\'; ?>
                    <?php endwhile; endif; }
                else { //is child -> loop posts
                    echo "<h2>".$cat_name."</h2>";
                    // create a custom wordpress query
                    $args2 = \'cat=\' . $cat_id . \'&orderby=date&order=DESC&post_per_page=-1\';
                    query_posts( $args2 );
                    // start the wordpress loop!
                    if (have_posts()) : while (have_posts()) : the_post(); ?>
                        <?php the_title(); ?>
                        <?php echo \'<hr/>\'; ?>
                    <?php endwhile; endif;   // done our wordpress loop. Will start again for each category ?>
            <?php }} // done the foreach statement ?>
我将其分为三种情况:is parent and has child, is parent but no childis child. 使我能够到达这里的函数是get_category_children();.

现在读代码让我觉得我可以检查一下$cat_child 在主if/elseif语句中直接为空,避免了$has_child 绕一圈跑。

1 个回复
最合适的回答,由SO网友:Fernando Silva 整理而成

好吧,在进行了大量的挖掘之后,我找到了完全符合我要求的代码。然而,我认为这段代码在任何方面都不是很好/高效/可重用的。我只是发布它,因为它执行了预期的内容。如果能给我一个答案,指出“最佳实践”的编码方式,我将不胜感激,这样我就可以从中学习,所以我不会在一周左右的时间里把我的问题标记为已回答,以等待更好的编码。

这就是我得出的结果:

<?php
        $isOdd = true; // setup boolean to determine parent div id for CSS
        $args1 = array(
          \'orderby\' => \'ID\',
          \'order\' => \'ASC\',
          \'hierarchical\' => true
          );
        $cats = get_categories( $args1 ); // get all the categories from the database

            // loop through the categries
            foreach ($cats as $cat) {
                $cat_id= $cat->term_id;// setup the cateogory ID
                $cat_name= $cat->name;// setup the category name
                $parent= $cat->category_parent;// setup the category parent
                $cat_child= get_term_children( $cat_id, \'category\' ); // outputs a string with child categories from the taxonomy


                $has_child=bool; // create a variable that will allow to verify if a category has children
                if( empty($cat_child)) { $has_child= false; }
                else { $has_child= true; }

                if ( $parent == 0 && $has_child == false ) { //is parent && no child -> loop posts
                    echo "<div class=\\"parent-wrap\\" id=\\"". ( $isOdd ? \'odd\' : \'even\') . "\\">";
                        echo "<h2>".$cat_name."</h2>";
                        echo "<div class=\\"post-wrap\\">";
                            echo "<ul class=\\"post-list\\">";
                                echo "<li class=\\"back-button\\"><</li>";

                                    // create a custom wordpress query
                                    $args2 = \'cat=\' . $cat_id . \'&orderby=date&order=DESC&post_per_page=-1\';
                                    query_posts( $args2 );
                                    // start the wordpress loop!
                                    if (have_posts()) : while (have_posts()) : the_post(); 
                                        get_template_part( \'content\', get_post_format() ); //get post template from content.php
                                    endwhile; endif;

                                echo "<li class=\\"front-button\\">></li>";
                            echo "</ul><!-- .post-list -->";
                        echo "</div><!-- .post-wrap -->";
                    echo "</div><!-- .parent-wrap -->";
                    $isOdd = !$isOdd;
                    }
                elseif ( $parent == 0 && $has_child == true ) { //is parent && has child -> post title
                    echo "<div class=\\"parent-wrap\\" id=\\"". ( $isOdd ? \'odd\' : \'even\') . "\\">";
                        echo "<h2>".$cat_name."</h2>";

                        // loop through the categries IN THE ELSEIF STATEMENT
                        foreach ($cats as $cat) {
                            $cat_id_new= $cat->term_id;// setup the new cateogory ID
                            $cat_name_new= $cat->name;// setup the new category name
                            $parent_new= $cat->category_parent;// setup the new category parent
                            $cat_child_new= get_term_children( $cat_id_new, \'category\' ); // outputs a string with child categories from the taxonomy

                            $has_child_new=bool; // create a new variable that will allow to verify if a category has children
                            if( empty($cat_child_new)) { $has_child_new= false; }
                            else { $has_child_new= true; }

                            if ($parent_new != 0 && $has_child_new == false && cat_is_ancestor_of($cat_id, $cat_id_new) ) { //is child -> loop posts
                                echo "<div class=\\"child-wrap\\">";
                                    echo "<h3>".$cat_name_new."</h3>";
                                    echo "<div class=\\"post-wrap\\">";
                                        echo "<ul class=\\"post-list\\">";
                                            echo "<li class=\\"back-button\\"><</li>";

                                                // create a custom wordpress query
                                                $args2 = \'cat=\' . $cat_id_new . \'&orderby=date&order=DESC&post_per_page=-1\';
                                                query_posts( $args2 );
                                                // start the wordpress loop!
                                                if (have_posts()) : while (have_posts()) : the_post(); 
                                                    get_template_part( \'content\', get_post_format() ); //get post template from content.php
                                                endwhile;
                                                endif; // done our wordpress loop. Will start again for each category 

                                            echo "<li class=\\"front-button\\">></li>";
                                        echo "</ul><!-- .post-list -->";
                                    echo "</div><!-- .post-wrap -->";
                                echo "</div><!-- .child-wrap -->";
                            } // close if ($parent_new != 0...
                        } // close foreach in elseif
                    echo "</div><!-- .parent-wrap -->";
                    $isOdd = !$isOdd;
                } // close if ($parent == 0...
            } // close the 1st foreach statement ?>
我觉得如果函数被创建并在整个代码中重用,那么代码中的一些内容可以更好地组织,我仍在考虑替换query_posts(); 具有get_posts();pre_get_posts();.

结束

相关推荐

在Get_Categories中添加多个“Parent”

我使用下面提到的代码从父类别中获取前5个子类别(按帖子数量)。The code works fine, 然而,我需要添加更多的“父”类别,这样我就无法从多个父类别中获得前5个子类别的总数。Adding \'parent\' => \'599,588,590\', **Does not work.** The working code for single parent category.<?php $args=array( \'orderby\' => \'