如何按最后一个单词的字母顺序列出自定义分类术语

时间:2021-01-27 作者:Jascha Goltermann

我创建了一个自定义分类法,因此可以手动创建支持者列表。这可能不是最好的方法,但这是我唯一知道的方法。每个条目由名字和姓氏组成,例如;约翰·多伊;。

现在,我有以下代码,它从这个自定义分类法创建了一个列表,并使用第一个单词的第一个字母按字母顺序对其进行排序:

<?php
    // Get the taxonomy\'s terms
    $terms = get_terms(
        array(
            \'taxonomy\'   => \'supporter\',
            \'hide_empty\' => false,
        )
    );
    // Check if any term exists
    if ( ! empty( $terms ) && is_array( $terms ) ) {
        // Run a loop and print them all
        foreach ( $terms as $term ) { ?>
            <li class="supporter-name"><?php echo $term->name; ?></li> <?php
        }
    } 
?>
然而,我想使用最后一个单词的第一个字母按字母顺序排列列表,这样我就可以有效地按姓氏排序。有没有一种既稳定又高效的方法来实现这一点?

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

这里的技巧是用分类法的术语创建一个数组并对其进行排序。在进行排序之前,我们需要划分全名“;约翰·多伊;“分隔字符串”;“约翰”;和;能源部;。然后我们可以按姓氏对姓名进行排序。

其余的说明和文档都在代码中。

这应该是可行的,但我还没有用实际的WP术语对此进行测试,所以请先进行测试。

<?php    // Get the taxonomy\'s terms
$terms = get_terms(
    array(
        \'taxonomy\'   => \'supporter\',
        \'hide_empty\' => false,
    )
);

// Check if any term exists
if ( ! empty( $terms ) && is_array( $terms ) ) {
    
    // Create a new empty array of supporters ( $supporters ) which will include first and last names.
    $supporters = [];
    foreach ( $terms as $term ) {
        // Divide the whole name to different words.
        // First word ( name_divided[0] ) will be the person\'s first name
        // Second word ( name_divided[1] ) will be the person\'s last name
        $name_divided = explode( \' \', trim($term->name) );
        
        // We\'ll create an array $supporters which has the following structure:
        // $supporters[0] = array (
        //      \'firstname\' => \'John\',
        //      \'lastname\' =>  \'Doe\' ),
        // )
        $supporters[] = array( \'firstname\' => $name_divided[0], \'lastname\' => $name_divided[1] );
    }

    // Here\'s the magic. Sort the array by last name
    array_multisort (array_column($supporters, \'lastname\'), SORT_ASC, $supporters);
    
    // Run a loop and print them all
    foreach ( $supporters as $supporter ) { ?>
        <li class="supporter-name"><?php echo $supporter[\'lastname\'] . \', \' . $supporter[\'firstname\']; ?></li>
        <?php
    }
} ?>

Edit: If the name list consists of names that has 3 or more names, ie. "John of England".

更换节段

$supporters[] = array( \'firstname\' => $name_divided[0], \'lastname\' => $name_divided[1] );
代码如下:

//Get all other names than last name
        $firstnames = \'\';
        for ($x = 0; $x < (count($name_divided) - 1); $x++ ) {
            $firstnames .= $name_divided[$x];
            
            // If this is not the last one of first names, add space between names
            if ( $x != (count($name_divided) - 2) )
                $firstnames .= \' \';
        }

        // Use last word (key in array) as last name
        $lastname = array_pop($name_divided);
        
        $supporters[] = array( \'firstname\' => $firstnames, \'lastname\' => $lastname );
此修改与之前的代码相结合,将输出;英国的约翰“;像

英国约翰

相关推荐

get taxonomies from terms

我有两种帖子类型文档、新闻项目以及每种帖子类型的类别,文档--PDF、Word、Excel、新闻项目--文章、版本,但它们共享相同的标记。文档—BOSS、EFF、CDF—新闻项目—BOSS、EFF、CDF—如何检索其帖子(或帖子计数。无论帖子类型如何)具有指定标记的类别列表,例如。BOSS--PDF(2),版本(1)CDF——文章(1),Excel(1)