如何输出逗号分隔的WordPress定制标签?

时间:2015-09-04 作者:Adriano Monecchi

基于一些引用,我构建了一个函数来输出由逗号分隔的自定义分类术语列表。代码按预期工作,其中food_tag 是我为自定义post\\u类型注册的自定义分类法。

功能如下:

function get_taxonomy_food_tags(){
 $terms = get_terms(\'food_tag\');
 foreach($terms as $term){

 // The $term is an object, so we don\'t need to specify the $taxonomy.

 $term_link = get_term_link($term);

 $numItems = count($terms);
 $i        = 0;

 // If there was an error, continue to the next term.

 if (is_wp_error($term_link)){
      continue;
 }

 // We successfully got a link. Print it out.

 echo \'<a href="\' . esc_url($term_link) . \'">\' . $term->name . \'</a>\';

 if (++$i != $numItems) {
            echo \', \';
 }

 }
}
然后我放置代码<?php get_taxonony_food_tags(); ?> 在我的主题中的任何地方。php模板,我得到一个带有链接的自定义标记列表。例如:

Ingredients: Bacon, Tomato Slices, Tomato Sauce, Lettuce, Beef,

结果表明,数组中的最后一个标记也是用逗号打印的

如何正确设置函数以排除最后一个逗号?

提前谢谢。

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

您在这里有几个缺陷:

  • ALWAYS 以您的代码的思维方式编写代码will 失败这非常重要。大多数人都以完美世界的心态编写代码。完美的世界永远不会发生。始终考虑代码失败时会发生什么。

    例如,在代码中,$terms 如果一切顺利,则返回一个term对象的对象。$terms 如果分类法中没有术语,或者术语没有任何帖子,则还返回空数组。它还返回WP_Error 对象,如果分类不存在。这都是bug。您可能会询问无效的分类法。如果在插件中正确注册了分类法,并且禁用了该插件,则分类法将不再存在,这将触发无效的分类法错误。

    您应该在foreach 环不在内部

    get_ 前缀用于返回其输出的函数,而不是回显它。

  • Always 消毒和验证

    我将重写您的代码,使其看起来像这样:(NOTE: 需要PHP5。4+)

    function get_taxonomy_food_tags( $taxonomy = \'\', $args = [] )
    {
        // Check if we have a taxonomy and that it is valid. If not, return false
        if ( !$taxonomy )
            return false;
    
        // Sanitize the taxonomy input
        $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
    
        if ( !taxonomy_exists( $taxonomy ) )
            return false;
    
        // If we reached this point, our taxonomy is valid. So lets continue. Get our terms
        $terms = get_terms( $taxonomy, $args );
    
        // We will only check if we have terms, we know our taxonomy is valid because we have reached this point
        if ( empty( $terms ) )
            return false;
    
        // Great, if we got to this point, we have terms, lets continue
        // Define our variable to hold our term links
        $term_links_array = [];
        foreach ( $terms as $term ) {
            $term_link = get_term_link( $term );
    
            // Make sure we do not have a WP_Error object, not really necessary, but better be safe
            if ( is_wp_error( $term ) )
                continue;
    
            // Build an array of term links. Let php do the hard work and calculations
            $term_links_array[] = \'<a href="\' . esc_url($term_link) . \'">\' . $term->name . \'</a>\';
        } // endforeach
    
        // Make sure that we have an array of term links, if not, return false
        if ( !$term_links_array )
            return false;
    
        // We have reached this point, lets output our term links
        return implode( \', \', $term_links_array );
    }
    
    您现在可以按如下方式使用它

    echo get_taxonomy_food_tags( \'food_tag\' );
    
    我还引入了第二个参数,您可以使用它将参数数组传递给内部get_terms() 函数,因此您可以以与默认函数相同的方式使用新函数get_terms() 作用

SO网友:Eduardo Sánchez Hidalgo Urías

问题是,每次foreach循环执行时,您都将0作为$i的值,因此,当最后一个if语句执行时,每次比较都是1!=3,并且始终打印逗号。尝试声明$i=0;foreach循环外部。像这样:

$terms = get_terms(\'food_tag\');
$i = 0;
foreach($terms as $term){ 

//the code here

}
此外,末尾缺少一个花括号,这可能只是复制粘贴错误,但对于那些试图复制粘贴并使其运行的人来说。

相关推荐

显示作者姓名PHP(自制插件)

我有一个需要帮助的问题,因为我自己找不到解决办法。我接管了一个网站,之前有人在那里创建了一个自制插件。。使用默认插件“Contact Form 7”,用户可以在页面上创建帖子。()https://gyazo.com/c8b20adecacd90fb9bfe72ad2138a980 )关于自行创建的插件“Contact Form 7 extender”,帖子是通过PHP代码在后台生成的(https://gyazo.com/115a6c7c9afafd2970b66fd421ca76a3)其工作原理如下:如果