按For Each循环的段塞排除类别

时间:2015-04-22 作者:Bram Vanroy

我试图从for循环中排除一些类别。

<?php $categories = get_categories(array(\'exclude\' => \'apps, windows\')); ?>

<?php foreach ($categories as $category) : ?>
    // the_loop
<?php endforeach; ?>
即使没有抛出错误,它也不起作用:所有类别都在循环中使用。如何按slug排除某些类别?

我正在处理多个具有不同cat ID但具有相同slug的站点,因此我需要按slug而不是cat ID进行过滤。

未来读者:彼得·古森(PieterGoosen)将这个问题和另一个问题合并为一个答案here.

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

正如我已经说过的,直接从codex

exclude

(字符串)从wp\\U list\\U categories生成的列表中排除一个或多个类别。此参数采用按唯一ID以逗号分隔的类别列表,按升序排列

正如你所说的,你必须使用slug类。为了使这成为可能和动态的,我认为最好是编写自己的包装函数来实现这一点。我们将使用get_terms() (用于get_categories() 内部)以获取我们的类别和get_term_by() 获取类别ID以便我们可以将其传递给get_terms()

这是函数,为了更好地理解,我对它进行了很好的注释(需要PHP 5.4+

function exclude_term_by( $taxonomy = \'category\', $args = [], $exclude = [] )
{
    /*
     * If there are no term slugs to exclude or if $exclude is not a valid array, return get_terms
     */
    if ( empty( $exclude ) || !is_array( $exclude ) )
        return get_terms( $taxonomy, $args );

    /*
     * If we reach this point, then we have terms to exclude by slug
     * Simply continue the process. 
     */ 
    foreach ( $exclude as $value ) {

            /*
             * Use get_term_by to get the term ID and add ID\'s to an array
             */
            $term_objects = get_term_by( \'slug\', $value, $taxonomy );
            $term_ids[] = (int) $term_objects->term_id;

    }

    /*
     * Set up the exclude parameter with an array of ids from $term_ids
     */
    $excluded_ids = [
        \'exclude\' => $term_ids
    ];

    /*
     * Merge the user passed arguments $args with the excluded terms $excluded_ids
     * If any value is passed to $args[\'exclude\'], it will be ignored
     */
    $merged_arguments = array_merge( $args, $excluded_ids );

    /*
     * Lets pass everything to get_terms
     */
    $terms = get_terms( $taxonomy, $merged_arguments ); 

    /*
     * Return the results from get_terms
     */
    return $terms;
}
在我开始使用之前,这里有一些注意事项

第一个参数,$taxonomy 是要传递给的特定分类法get_terms() 在函数内部,它默认为category

第二个参数,$args 采用与相同的参数get_terms(). 请注意,如果设置了第三个参数,则默认值为exclude 如果向参数传递了任何内容,则忽略该参数的值。此值将被传递给的任何对象覆盖$exclude. 如果未向此参数传递任何内容$exclude, 需要将空数组作为值传递

第三个参数,$excludes 获取应排除的术语段塞数组。如果值不是有效数组,get_terms() 将在不排除必要条件的情况下返回,因此请确保传递一个slug数组

以与相同的方式处理函数的输出get_terms(). 记住,还应该检查空值和WP_Error 对象,然后再使用函数中的值

根据需要修改和滥用代码

现在了解模板文件中的用法。注意传递给的空数组$args 参数,如果将任何内容传递给$exclude 参数

$terms = exclude_term_by( \'category\', [], [\'term-slug-one\', \'term-slug-two\'] );
if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
    ?><pre><?php var_dump($terms); ?></pre><?php
}   
有关用法的更多信息,请参阅get_terms().

SO网友:impsart

第一行代码中有一个小错误。您应该在数组中用引号分隔“每个”类别。因此,第一行应该是:

<?php $categories = get_categories(array(\'exclude\' => \'apps\', \'windows\')); ?>

结束

相关推荐

修改strid_tag函数以使用术语slug而不是术语名称

我有一个小功能可以从自定义分类法中获取帖子类别并修改它们的url,但现在我有多个单词类别,我需要修改它以使用类别slug,而不仅仅是类别名称。我该如何更改它以在某处引入$term->slug?$terms = strip_tags( get_the_term_list( $post->ID, \'portfolio_cat\', \'\', \'/\' )); $terms = explode(\"/\",$terms); for($i=0; $i<count($term