对GET_TERMS进行排序,ACF正在自动删除重复项

时间:2016-02-23 作者:Julian Flynn

我阅读了ACF和;WordPress文档和两者都没有提到在按自定义字段排序分类术语时为什么/何时/如何从数组中删除重复值。

我从中了解到ACF是这样做的StackExchange answer. 但在这个示例代码中,排序不正确,无法与krsort一起使用。对于usort之外的任何内容,它都会给出错误:“krsort()期望参数2很长”。有人能帮忙吗?

我试图用示例代码生成的快捷代码:

function ranker_shortcode( $atts ) {
    extract( shortcode_atts( 
        array(
            \'taxonomy\' => \'\',
        ), $atts 
    ));
    $args = array( 
        \'taxonomy\' => $taxonomy,
    );

    $sorted = array();
    $terms  = get_terms( $taxonomy, $args );

    if( $terms ) {
        foreach ( $terms as $term ) {
            $sorted[]  = array(
                \'height\' => get_field( \'height\', $term ), // Get field from ACF
                \'name\'  => $term->name,
            );
        }

        krsort( $sorted, SORT_NUMERIC );

        foreach( $sorted as $t ) {
            $html .= $t[\'height\'] . \', \' . $t[\'name\'] . \'<br>\';
        }

        return $html;
    }
}
add_shortcode( \'ranker\', \'ranker_shortcode\' );
Solved + Answer:多亏了Pieter Goosen,我才得以工作。我对他的答案进行了一些编辑,以包含更多的字段。

/**
 * Shortcode to sort taxonomy terms by meta field. Utilizes Advanced Custom Fields plugin.
 */
function sort_term_shortcode( $atts ) {
    // Defualt attributes
    $attributes = shortcode_atts( 
        [
            \'taxonomy\' => \'\',
        ], $atts 
    );

    $html = \'\';

    $taxonomy = filter_var( $attributes[\'taxonomy\'], FILTER_SANITIZE_STRING );
    if ( ! $taxonomy ) 
        return $html; // sanitize shortcode attributes

    if ( ! taxonomy_exists( $taxonomy ) ) 
        return $html; // check shortcode attributes exists

    $terms  = get_terms( $taxonomy );
    if( ! $terms ) 
        return $html; // check terms exists

    $newterms = [];
    foreach ( $terms as $term ) {
        $height  = get_field( \'height\', $term );
        $newterms[$height][]  = array(
            \'name\'        => $term->name,
            \'count\'       => $term->count,
            \'description\' => wpautop( $term->description ),
            \'link\'        => esc_url( get_term_link( $term ) ),
            \'weight\'      => get_field( \'weight\', $term )
        );
    }

    krsort( $newterms, SORT_NUMERIC ); // biggest to smallest sort

    $c = 0;
    foreach( $newterms as $key => $value ) {
        foreach ( $value as $v ) {
            $c++;
            $thumb = wp_get_attachment_image_src( $v[\'avatar\'], \'t_thumb\' );
            $html .= \'<div class="panel panel-default">\' . "\\n";
                $html .= \'<div class="panel-heading">\' . "\\n";
                    $html .= \'<h3 class="panel-title">\' . $c . \' &nbsp; <strong>\' . $v[\'name\'] . \'</strong>,&nbsp; \' . $key . \', \' . $v[\'weight\'] . \'lbs.</h3>\' . "\\n";
                $html .= \'</div>\' . "\\n";
                $html .= \'<div class="media panel-body">\' . "\\n";
                    $html .= \'<a class="media-left" href="\' . $v[\'link\'] . \'"><img src="\' . $thumb[0] . \'"></a>\' . "\\n";
                    $html .= \'<div class="media-body">\' . "\\n";
                        $html .= $v[\'description\'] . "\\n";
                    $html .= \'</div>\' . "\\n";
                $html .= \'</div>\' . "\\n";
            $html .= \'</div>\' . "\\n";
        }
    }
    return $html;

}
add_shortcode( \'sort_term\', \'sort_term_shortcode\' );

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

PHP不允许重复键,以前的键/值对只需替换为当前的键/值对。无论如何,让我们看看您的代码以及我们将如何解决它

你有一些问题

您不应该使用extract(), 曾经几年前,由于非常具体的原因,它被从core中删除。请阅读@toscho\'s answer regarding extract()

始终清理和验证任何用户提交的数据,即使这些数据来自您。用户输入的数据可能包含恶意代码,黑客可以使用这些代码访问您的网站

  • $html 是代码中未定义的变量,这是一个bug。如果你有debug turned on, 你会得到一个明确的通知。在尝试使用变量之前,请始终定义该变量,并在本地测试安装中始终将“调试”设置为true

    您正在使用get_terms() 错误地。第二个参数采用不包含分类法的参数数组。分类法作为第一个参数传递

    您正在使用ACF和ACF功能,如果卸载ACF,这些功能将使您的网站崩溃。在起诉之前,务必进行检查以确保外部功能存在,以避免WSOD。这里有一个提示,从WordPress 4.4开始,您现在可以使用术语元数据表存储与术语相关的其他信息,然后使用该数据对术语进行排序。当您不再需要该插件时,ACF几乎总是一个让人头疼的问题

  • krsort 在当前代码中使用的排序函数肯定是错误的。usort() 应具有正确的排序功能。在我们的新代码中,krsort() 会很好地工作

    让我们看看更好的解决方法。我接受您需要显示按ACF字段排序的术语。您可以尝试以下操作:(NOTE: 下面的代码未经测试,可能存在错误。另外,我不知道ACF插件,请确保我使用get_field()

    add_shortcode( \'ranker\', \'ranker_shortcode\' );
    function ranker_shortcode( $atts ) 
    {
        // Define our defualt attributes
        $attributes = shortcode_atts( 
            [
                \'taxonomy\' => \'\',
            ], $atts 
        );
    
        // Set our $html variable as empty string
        $html = \'\';
    
        // Sanitize and validate our taxonomy to avoid bugs later on. Return $html should anything fail
        $taxonomy = filter_var( $attributes[\'taxonomy\'], FILTER_SANITIZE_STRING );
        if ( !$taxonomy )
            return $html;
    
        if ( !taxonomy_exists( $taxonomy ) )
            return $html;
    
        // We made it to hear, check if the ACF plugin is activated and that get_field() exists
        if ( !function_exists( \'get_field\' ) )
            return $html;
    
        // Great, we made it to here, our checks checked out, lets continue
        $terms  = get_terms( $taxonomy );
    
        // Make sure we have terms, no need to check for WP_Error object because we know the taxonomy exists
        if( !$terms )
            return $html;
    
        // We have terms, lets loop through them and build our array
        $sorted = [];
        foreach ( $terms as $term ) {
            // Get our field value and make sure we have a field value, if not, just continue
            $field  = get_field( \'height\', $term ); // Make sure we can pass the term object, don\'t know ACF
    
            if ( !$field )
                continue;
    
            // Our term have a field, lets build the array
            $sorted[$field][]  = $term->name;
        }
    
        // Lets sort the array DESC according to array key, which is our $field value
        krsort( $sorted, SORT_NUMERIC ); // Make sure here that your field is actually numeric to avoid bugs
    
        if ( !$sorted )
            return $html;
    
        // We are done, lets build our string and return it
        foreach( $sorted as $key=>$value ) {
            foreach ( $value as $v ) {
                $html .= $key . \', \' . $v . \'<br>\';
            }
        }
        return $html;
    }
    

  • 相关推荐

    GET_THE_TERMS与wp_GET_POST_TERMS中的奇怪结果

    我正在尝试制作一个面包屑函数,但有一个小问题。。。使用时:$categories = get_the_terms( $post->ID, \'product_cat\' ); 我得到了一个循环中使用的类别数组,等等。唯一的问题是它是按字母顺序排列的。(我希望它按层次顺序排列。)经过一番挖掘,我发现了一种替代方法,即使用wp\\u get\\u post\\u terms(),但我肯定遗漏了一些东西,因为当我使用此方法时:$categories = wp_get_post_terms( $p