将不推荐使用的GET_CATEGORY_子代代码替换为GET_TERMS

时间:2020-05-20 作者:Boris

多年来,我一直在我的一个网站上使用这段代码:

            <?php
            if (is_category()) {
              $this_category = get_category($cat);
              if (get_category_children($this_category->cat_ID) != "") {
                echo "<ul class=\'subsubcats\'>";
                    wp_list_categories(\'orderby=title&show_count=0&title_li=
                    &use_desc_for_title=1&child_of=\'.$this_category->cat_ID);
                echo "</ul>";
              } else {
                 get_template_part(\'loop\'); // if no sub categories exist, show the posts
              }
            }
        ?> 
这将在类别概述页面中显示所有子类别。如果没有子类别,它将显示包含的帖子。

我注意到,在WP Debug中,自WP 2.8以来,这段代码实际上已被弃用,因此现在是替换它的时候了。

我已经读到,我应该用get\\u术语来代替它。我找到了一段几乎可以满足我需要的代码:

            <?php

        $terms = get_terms([
            \'taxonomy\' => get_queried_object()->taxonomy,
            \'parent\'   => get_queried_object_id(),
        ]);

        echo \'<ul class="subsubcats"><li class="categories"><ul>\';
        foreach ( $terms as $term) {
            echo \'<li class="cat-item"><a href="\' . get_term_link( $term ) . \'">\' . $term->name . \'</a></li>\';  
        }
        echo "</ul></li></ul>";

        get_template_part(\'loop\'); // if no sub categories exist, show the posts

        ?>
但它有一个错误:它显示所有类别和子类别概述中的帖子,而旧代码仅在没有子类别可用时显示帖子。

我不知道如何调整此代码以使其按我需要的方式工作,非常感谢您的帮助!

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

get_category_children() 确实不推荐使用,您应该使用get_term_children() 相反因此,对于原始代码:

// You can simply replace this:
if (get_category_children($this_category->cat_ID) != "")

// with this:
$ids = get_term_children( $this_category->cat_ID, \'category\' );
if ( ! empty( $ids ) )
第二个代码使用get_terms(), 您可以检查术语列表是否为空,如果不是,则显示术语;否则,显示帖子:

$terms = get_terms( ... );

if ( ! empty( $terms ) ) {
    // Display the terms.
    echo \'<ul class="subsubcats"><li class="categories"><ul>\';
    foreach ( $terms as $term ) {
        ... your code here ...
    }
    echo \'</ul></li></ul>\';
} else {
    // Display the posts.
    get_template_part( \'loop\' );
}
但是,对于你想做的事情,实际上可以通过wp_list_categories():

$list = wp_list_categories( array(
    \'orderby\'          => \'title\',
    \'title_li\'         => \'\',
    \'child_of\'         => get_queried_object_id(), // just change the value if necessary
    \'show_option_none\' => \'\', // this does the trick
    \'echo\'             => 0,
) );

if ( ! empty( $list ) ) {
    echo \'<ul class="subsubcats">\' . $list . \'</ul>\';
} else {
    get_template_part( \'loop\' );
}

相关推荐

WP_SET_OBJECT_TERMS在没有芯片的情况下不更新数据库()

我已将自定义分类添加到媒体附件。在单独的帖子页面中,这些内容正在正确更新,并进行了一些调整以正确更新列数,我可以在管理/数据库中看到这些更改,没有任何问题。在媒体弹出窗口中,我可以更改分类法并使用edit_attachment 我能看到的行动wp_set_object terms 正在激发,我还可以看到它返回了一个数组,其中包含更新术语的正确ID:wp_set_object_terms($id, $cat_ids, \'attachment_category\', false); //return