WP知识库主题错误-子类别和文章,需要更改WP_QUERY

时间:2014-07-10 作者:JFA

我正在使用WP Knowledge Base theme, 这对于我正在进行的项目来说几乎是完美的,但我发现了一个不幸的bug。在主页上,如果您在一个类别下同时拥有子类别和松散文章,则不会在子类别旁边显示文章。您可以在下图中看到,左侧显示的是该类别的一篇文章,而右侧显示的是两个子类别,而顶部类别应该有两个子类别和一篇文章

SubCategories, no article

右侧类别的内部如下图所示。请注意,虽然列出了4篇文章,但子类别下只有3篇,没有第四篇文章。

No fourth article

我仔细查看了代码,发现了以下部分:

<div class="list-group">
    <?php if ( ! empty( $sub_categories ) ) : ?>
    <?php foreach ( $sub_categories as $scat ) : ?>
    <?php $sterm_meta = get_option( \'ipt_kb_category_meta_\' . $scat->term_id, array() ); ?>
    <a href="<?php echo esc_url( get_term_link( $scat, \'category\' ) ); ?>" class="list-group-item">
        <span class="badge"><?php echo $scat->count; ?></span>
        <?php if ( isset( $sterm_meta[\'icon_class\'] ) && \'\' != $sterm_meta[\'icon_class\'] ) : ?>
        <i class="glyphicon <?php echo esc_attr( $sterm_meta[\'icon_class\'] ); ?>"></i>
        <?php else : ?>
        <i class="glyphicon ipt-icon-books"></i>
        <?php endif; ?>
        <?php echo $scat->name; ?>
        </a>
    <?php endforeach; ?>
    <?php else : ?>
     <!-- so get the number of posts per page(UD) -jfa -->
    <?php $cat_posts = new WP_Query( array(
    \'posts_per_page\' => get_option( \'posts_per_page\', 5 ),
    \'cat\' => $cat->term_id,
    ) ); ?>
    <?php if ( $cat_posts->have_posts() ) : ?>
    <?php while ( $cat_posts->have_posts() ) : $cat_posts->the_post(); ?>
        <?php get_template_part( \'category-templates/content\', \'popular\' ); ?>
    <?php endwhile; ?>
    <?php else : ?>
        <?php get_template_part( \'category-templates/no-result\' ); ?>
    <?php endif; ?>
    <?php wp_reset_query(); ?>
    <?php endif; ?>
</div><!--end list-group - jfa-->
这是定义填充该列表的内容的部分。我改变了else 初始声明ifendif 然后取出endif 最后,现在显示的子类别和文章不再是排他性的。但是,它显示了所有的文章,即所有的叶子,以及子类别。一、 例如,它显示所有子类别以及这些子类别中的文章。为了解决这个问题,我想我必须更改WP\\u查询,以便它只返回当前类别中的文章,而不返回子类别中的文章。

我目前正在查看文档,但有人对此有什么想法吗?我对这件事不太熟悉。

编辑:

此主题的工作示例can be found on their site

编辑2:

好的,我真的没有得到这个查询。这是特写镜头。

<?php $cat_posts = new WP_Query( array(
  \'posts_per_page\' => get_option( \'posts_per_page\', 5 ),
  \'cat\' => $cat->term_id,
  ) ); ?>
所以posts per page 获取我在WordPress中设置的选项。\'cat\' => $cat->term_id 看起来与示例页面上的相同。$cat->term_id 返回特定类别编号。不幸的是,它还返回了子类别中属于该类别的所有文章。有没有办法改变它只返回该级别的文章而不返回低于该级别的文章?

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

好吧,那么,using this resource, 我被发现template-knowledgebase.php 文件并替换cat 关键字withcategory__in (这是一个双下划线)只返回了我们正在查看的父类别的文章。我还编辑了else 声明if 未来endif 并移除了无关的endif. 这是我的list-group div看起来像。

<div class="list-group"> 
              <?php /* list-group fix - jfa*/ ?>
                            <?php if ( ! empty( $sub_categories ) ) : ?>
                            <?php foreach ( $sub_categories as $scat ) : ?>
                            <?php $sterm_meta = get_option( \'ipt_kb_category_meta_\' . $scat->term_id, array() ); ?>
                            <a href="<?php echo esc_url( get_term_link( $scat, \'category\' ) ); ?>" class="list-group-item">
                                <span class="badge"><?php echo $scat->count; ?></span>
                                <?php if ( isset( $sterm_meta[\'icon_class\'] ) && \'\' != $sterm_meta[\'icon_class\'] ) : ?>
                                <i class="glyphicon <?php echo esc_attr( $sterm_meta[\'icon_class\'] ); ?>"></i>
                                <?php else : ?>
                                <i class="glyphicon ipt-icon-books"></i>
                                <?php endif; ?>
                                <?php echo $scat->name; ?>

                            </a>
                            <?php endforeach; ?>
                            <?php endif; ?>
                            <?php $cat_posts = new WP_Query( array(
                                \'posts_per_page\' => get_option( \'posts_per_page\', 5 ),
                                \'category__in\' => $cat->term_id, // \'cat\' changed to \'category__in\' - jfa
                            ) ); ?>
              <?php /* ze loop - jfa */ ?>
                            <?php if ( $cat_posts->have_posts() ) : ?>
                            <?php while ( $cat_posts->have_posts() ) : $cat_posts->the_post(); ?>
                                <?php get_template_part( \'category-templates/content\', \'popular\' ); ?>
                            <?php endwhile; ?>
                            <?php elseif ( empty( $sub_catagories ) ) : ?>
                                <?php get_template_part( \'category-templates/no-result\' ); ?>
                            <?php endif; ?>
              <?php /* end loop - jfa */ ?>
                            <?php wp_reset_query(); ?>
                            <?php /*endif;*/ ?>
                        </div><?php /* end list-group - jfa*/ ?>
然后我走进category-templates/category-parent.php 并在endif

<?php /* start article section */ ?>

<?php $sterm_meta = get_option( \'ipt_kb_category_meta_\' . $scat->term_id, array() ); ?>
    <?php $sterm_link = esc_url( get_category_link( $scat ) ); ?>
    <?php $scat_totals = $post/*ipt_kb_total_cat_post_count( $scat->term_id )*/; ?>

<!-- source of issue on second page -->
    <?php $scat_posts = new WP_Query( array(
        \'category__in\' => $cat->term_id,
        \'posts_per_page\' => get_option( \'posts_per_page\', 5 ),
    ) ); ?>
<!-- end source of issue on second page -->
<!-- <?php echo $scat->term_id; ?> -->

<!-- this is the box -->
    <div class="col-md-6 kb-subcat">
        <div class="col-md-3 col-sm-2 hidden-xs kb-subcat-icon">
            <p class="text-center">
                <a href="<?php echo $sterm_link; ?>" class="thumbnail">
                    <i class="glyphicon ipt-icon-file"></i>
                </a>
            </p>
        </div>
        <div class="col-md-9 col-sm-10 col-xs-12">
            <h2 class="knowledgebase-title"><a data-placement="bottom" data-popt="kb-homepage-popover-<?php echo $scat->term_id; ?>" title="<?php echo esc_attr( sprintf( __( \'%1$s / %2$s\', \'ipt_kb\' ), $cat->name, $scat->name ) ); ?>" href="#" class="btn btn-default btn-sm text-muted ipt-kb-popover"><i class="glyphicon ipt-icon-paragraph-justify2"></i></a> <?php echo $article_heading; ?></h2>
            <div class="ipt-kb-popover-target" id="kb-homepage-popover-<?php echo $scat->term_id; ?>">
                <?php echo wpautop( $scat->description ); ?>
                <p class="text-right">
                    <?php if ( isset( $term_meta[\'support_forum\'] ) && \'\' != $term_meta[\'support_forum\'] ) : ?>
                    <a class="btn btn-default" href="<?php echo esc_url( $term_meta[\'support_forum\'] ); ?>">
                        <i class="glyphicon ipt-icon-support"></i> <?php _e( \'Get support\', \'ipt_kb\' ); ?>
                    </a>
                    <?php endif; ?>
                    <a href="<?php echo $sterm_link; ?>" class="btn btn-info">
                        <i class="glyphicon ipt-icon-link"></i> <?php _e( \'Browse all\', \'ipt_kb\' ); ?>
                    </a>
                </p>
            </div>
            <!--Begin Books Icon for Categories -->
            <div class="visible-xs kb-subcat-icon">
                <p class="text-center">
                    <a href="<?php echo $sterm_link; ?>" class="thumbnail">
                        <?php if ( isset( $sterm_meta[\'icon_class\'] ) && \'\' != $sterm_meta[\'icon_class\'] ) : ?>
                        <i class="glyphicon <?php echo esc_attr( $sterm_meta[\'icon_class\'] ); ?>"></i>
                        <?php else : ?>
                        <i class="glyphicon ipt-icon-books"></i>
                        <?php endif; ?>
                    </a>
                </p>
            </div>
    <!-- End Books Icon -->

    <!-- Beign Category Section -->
            <div class="list-group">
                <?php if ( $scat_posts->have_posts() ) : ?>
                    <?php while ( $scat_posts->have_posts() ) : $scat_posts->the_post(); ?>
                    <?php get_template_part( \'category-templates/content\', \'popular\' ); ?>
                    <?php endwhile; ?>
                <?php else : ?>
                    <?php get_template_part( \'category-templates/no-result\' ); ?>
                <?php endif; ?>
            </div>
    <!-- End Category Section -->

    <!--Begin Browse Articles Button -->
    <p class="text-right">
                <a class="btn btn-default" href="<?php echo $sterm_link; ?>"><i class="glyphicon ipt-icon-link"></i> <?php printf( _n( \'Browse %d article\', \'Browse all %d articles\', $scat_totals, \'ipt_kb\' ), $scat_totals ); ?></a>
            </p>
    <!-- End Browse Articles Button -->
        </div>
        <div class="clearfix"></div>
    </div>
<!-- end box -->
    <?php wp_reset_query(); ?>
<?php /* end article */ ?>
这基本上是基于子类别框为任何备用物品创建一个框。在global语句下面,确保添加$article_heading = "Articles";. 这将命名新框Articles, 尽管你可以随便叫它什么。

这不是一个完全可靠的解决方案;例如,每个类别中的职位数量将转到posts per category * 2,所以我可以回到这里。也许还有一种更有效的方法,但这个主题已经有一段时间没有得到支持了,所以这是我所做的稍微有点黑客性的修复。

或者,一个不涉及更改任何代码的完全健壮的解决方法是将所有内容放在子类别中,但只放在一个级别。此主题不支持超过一个级别的类别。它缓解了整个情况,其实并不难。

我将发布任何未来的更改,以便有相关文档。

结束