仅显示和获取子类别

时间:2015-04-20 00:38:36

标签: php wordpress

我的wordpress网站上有一个部分,目前显示列表的子类别和父类别。我想只显示子类别。我无法自己找出解决方案,感谢您的帮助。

以下是我正在使用的当前代码(也显示父类别):

<?php 
//NEW
$permalink = get_permalink( $id );

//NEW
$seo = get_the_title()." : ";

$Category_links = ' Found in the ';

$term_list_category = wp_get_post_terms(get_the_ID(), 'listings_categories', array("fields" => "ids"));


//THIS CODE REMOVES PARENTS FROM BEING DISPLAYED IN THE LISTING CATEGORIES
foreach ($term_list_category as $k=>$term) {
    $children = get_term_children( $term, 'listings_categories');
if ($children)
    unset($term_list_category[$k]);
 }

$i = 0;

$count = count($term_list_category);

if ( $count > 0 ){

    foreach ( $term_list_category as $term_category ) {

        $thisCat = get_term_by( 'id', $term_category, 'listings_categories');

        //NEW
        $url = '<a id="'.$term_category.'" slug="'.$thisCat->{'slug'}.'" class="listing-links-cat" href="#" title="'.$thisCat->{'name'}.'" >'.$thisCat->{'name'}.'</a>';

        $i ++;

        $seo .= " " . $thisCat->{'name'} . "";

        $Category_links .= " " . $url . "";

        if($count-1 == $i){
            $Category_links .= " and ";  $seo .= ", ";
        }elseif($count > 1 && $count !== $i){
            $Category_links .= ", ";  $seo .= ", ";
        }

    }
    $Category_links .= " Categories";
?>

<? echo $Category_links;  ?>

但我觉得整体代码可以提高性能,所以它不会搜索数据库那么多?

1 个答案:

答案 0 :(得分:1)

您的代码非常无效,并且还有不必要的部分。你的附加部分会使你的代码更加无效并导致你难以点击数据库。

缺陷

  • 只有从帖子条款中获取术语ID才能获得加1,但不幸的是,在这种特定情况下,这会篡改您的代码,这是您无效的起点,因为您需要使用{{1在{{1>}循环的每次次迭代。这意味着每次迭代都需要额外的db调用,以便本来应该已经存在

  • 使用get_term_by()会增加foreach循环的每次迭代所进行的db调用量。同样,你正在为那些本来应该存在的东西进行不必要的数据库调用

  • 完全没必要计算get_term_children()返回的字词数量。这会给您的代码带来额外的不足。如果没有条件,则foreach返回空数组;如果分类不存在,则返回wp_get_post_terms对象。请稍后再考虑

加快速度并简化代码

让我们看看我们可以做些什么来使你的代码更有效

  • wp_get_post_terms中删除WP_Error参数。由于我们需要的不仅仅是术语的ID,我们需要返回完整的术语对象。您可能认为这是无效的,但这会为您节省大量数据库命中,最重要的是时间,因为您正在摆脱fieldswp_get_post_terms

  • 没有正确的方法可以从get_term_by()中移除父级,因此最好的方法是循环遍历它们并使用get_term_children()忽略/跳过它们。我假设您正在讨论将wp_get_post_terms()分配给continue属性的顶级字词,因此您只需要检查父值是否为0

  • 始终执行正确的故障检查。如果您不这样做,并且您的代码失败,则返回php错误和通知,这称为错误。你会想要避免这种情况。此外,您总是希望您的代码以受控的,预期的方式失败而不会出现错误。正如我之前所说,$parent返回一个空数组或0对象,因此这是您需要检查的内容。如果出现任何这种情况,请立即停止执行并返回函数以避免错误和意外输出

将代码放在上面

我喜欢让我的模板文件简短而甜蜜。出于这个原因,上面的庞大代码总是进入一个函数,然后我只需要在我的模板文件中调用该函数。另外,只是一个提示,我有功能特定的函数文件,以保持我的代码组织,而不是重载functions.php。我的functions.php文件通常不超过100行代码。

例如,这是你的帖子元的一部分,所以这将进入一个包含其他元函数的文件,比如显示autor名称和发布日期。

wp_get_post_terms()

USAGE

您现在可以简单地在模板中调用该函数,如下所示:

WP_Error

这会生成一个像这样的列表

  

这里的一些文字可能从以下开始:术语名称1,术语名称2,术语名称3最后可能是某些内容

最终说明

  • 上面的代码未经测试,可能有点儿麻烦。

  • 上面的代码是你需要的。您可以根据自己的需要扩展和滥用它。扩展的一些想法可能是在一些参数中工作,您可以选择是否显示父项,以及函数是否应返回一个术语名称字符串或一组术语名称。天空是这里的极限

  • 您可以构建缓存系统来缓存结果,以进一步优化这些结果。

修改

上面的代码现已经过测试,正在按预期工作