使用自定义字段对GET_TERMS进行排序

时间:2014-09-12 作者:Phil Hoyt

我有一个“crb\\U issues”的自定义分类法,它有一个与之关联的自定义字段,即“issue\\U date”,它为每个术语输出一个日期值,看起来很像“20140601”yearmonthday。

我正在尝试使用get\\u terms输出所有分类法术语,并按该自定义字段对它们进行排序。下面是我一直在编写的代码,它可以很好地输出术语名称和“issue\\u date”的值。但我很难通过自定义字段获得要排序的输出。

$args = array(
    \'meta_key\'          => \'issue_date\',
    \'orderby\'           => \'meta_value_num\', 
    \'order\'             => \'DESC\',
    \'hide_empty\'        => true,
    \'number\'            => \'4\', 
    \'fields\'            => \'all\', 
); 

$terms = get_terms("crb_issues", $args);

 if ( !empty( $terms ) && !is_wp_error( $terms ) ){
    echo "<ul>";
    foreach ( $terms as $term ) {
        echo "<li>" . $term->name . "</li>";
        the_field(\'issue_date\', $term);
    }
    echo "</ul>";
 }
任何帮助都将不胜感激。

6 个回复
最合适的回答,由SO网友:vancoder 整理而成

与其在初始循环中输出您的术语,不如使用它来构建一个新的数组,以您的issue\\u date为键:

$my_new_array = array( );
foreach ( $terms as $term ) {
    $issue_date = get_field( \'issue_date\', $term );
    $my_new_array[$issue_date] = $term->name;
}
然后,可以按以下顺序循环此新阵列:

ksort( $my_new_array, SORT_NUMERIC );

foreach ( $my_new_array as $issue_date => $term_name ) {
   echo "<li>" . $term_name . " " . $issue_date . "</li>";
}
这是未经测试的。

SO网友:Grigur

一个短得多的解决方案,只需在前面添加foreach:

usort($terms, function($a, $b) {
    return get_field(\'issue_date\', $a) - get_field(\'issue_date\', $b);
});

SO网友:RCNeil

我使用了类似的方法,但我想存储分类法中的值,而不是我给出的名称和自定义字段值,所以我最终将其存储为object 以及创建array 很像使用函数时实际返回的内容get_terms.

获取您的条款:

$terms = get_terms(\'your-taxonomy\');
然后创建一个新数组,按我的自定义字段值存储它们,在本例中该值恰好是数字:

$newterms = array(); 
foreach($terms as $term) {
    $order = get_field(\'order\', $term); //THIS MY CUSTOM FIELD VALUE                
    $newterms[$order] = (object) array(
            \'name\' => $term->name,
            \'slug\' => $term->slug,
            \'term_id\' => $term->term_id
    );
}
按数字排序:

ksort( $newterms, SORT_NUMERIC );
然后使用foreach 循环以获取每个对象的值:

foreach ( $newterms as $newterm ) {     
        echo \'<a href="#\' . $newterm->slug . \'">\' . $newterm->name . \'</a>\';
}
因此,本质上我是在重写数组以使用自定义顺序的键,但在本例中,我需要术语的slug、name和ID,因此我将其存储为对象,而不是上面的方法。

我的最终目标是Advanced Custom Field 因此,当创建一个分类术语时,用户可以给它一个数字顺序,然后我可以根据它们所需的顺序循环遍历这些术语。

希望这对别人有帮助!

SO网友:Phil Hoyt

感谢Vancoder的帮助!!!我整天都在把头发扯下来想弄清楚。有趣的是,你的解决方案是我在白板上写的半打解决方案之一,但我不知道如何实际创建一个以它为键的数组。我是这样的傻瓜。下面是我最后使用的代码,并为其他尝试这样做的人提供了一些注释!

<?php
$terms = get_terms("crb_issues");
$issue_archive = array( ); // creates an array for all terms inside of crb_issues tax using the custom field "issue_date" as the key
foreach ( $terms as $term ) {
    $issue_date = get_field( \'issue_date\', $term );
    $issue_archive[$issue_date] = $term->name;
}

krsort( $issue_archive, SORT_NUMERIC ); //sorts the issue_archive array from high to low

foreach ( $issue_archive as $issue_date => $term_name ) {
    echo "<li>" . $term_name . " " . $issue_date . "</li>"; //displays the term name and customfield issue_date
    if (++$i == 4) break; //Stops the foreach after 4
}
?>
如果有人对此代码有更好的评论,请让我知道,或者有更好的方法来处理任何事情。但我认为这是一个非常棒的解决方案。

SO网友:tigre

谢谢菲尔·霍伊特,这正是我想要的。但是,唉,我无法让它与我的设置一起工作。工作原理如下:

    <?php
    // Solution for sorting by ACF custom-field for tracks categories
    // http://support.advancedcustomfields.com/forums/topic/sorting-categories-list-by-custom-field/
    $categories = get_categories(\'taxonomy=tracks\');
    $sorted_cats = array();
    foreach($categories as $cat){
    //$ordr = get_field(\'track_order\', \'tracks_\'.$cat>term_id); //wasn\'t working so used the line below
        $ordr = get_field( \'track_order\', $cat );
        $sorted_cats[$ordr] = $cat;
    }
    krsort($sorted_cats);//ksort orders ascending, krsort reverses order (i.e. biggest to smallest)
    ?>
干杯

SO网友:Bobz

按数组值“order”而不是数组键对术语进行排序。如果有两个项具有相同的键,则最后一个项将覆盖第一个项。这将防止出现这种情况,并使所有这些问题都可见:

$sorted = array();
$args   = array( \'hide_empty\' => false );
$terms  = get_terms( \'my-tax\', $args );

if( $terms ) : 

    foreach ( $terms as $term ) {

        $sorted[]  = array(
            \'order\' => get_field( \'order\', $term ), // Get field from ACF
            \'name\'  => $term->name,
        );
    }

    function sortByOrder($a, $b) {
        return $a[\'order\'] - $b[\'order\'];
    }

    usort($sorted, \'sortByOrder\');

    foreach( $sorted as $t ) :?>
        <span>
            <?php echo $t[\'name\']; ?>
        </span>
    <?php endforeach;
endif;

结束
使用自定义字段对GET_TERMS进行排序 - 小码农CODE - 行之有效找到问题解决它

使用自定义字段对GET_TERMS进行排序

时间:2014-09-12 作者:Phil Hoyt

我有一个“crb\\U issues”的自定义分类法,它有一个与之关联的自定义字段,即“issue\\U date”,它为每个术语输出一个日期值,看起来很像“20140601”yearmonthday。

我正在尝试使用get\\u terms输出所有分类法术语,并按该自定义字段对它们进行排序。下面是我一直在编写的代码,它可以很好地输出术语名称和“issue\\u date”的值。但我很难通过自定义字段获得要排序的输出。

$args = array(
    \'meta_key\'          => \'issue_date\',
    \'orderby\'           => \'meta_value_num\', 
    \'order\'             => \'DESC\',
    \'hide_empty\'        => true,
    \'number\'            => \'4\', 
    \'fields\'            => \'all\', 
); 

$terms = get_terms("crb_issues", $args);

 if ( !empty( $terms ) && !is_wp_error( $terms ) ){
    echo "<ul>";
    foreach ( $terms as $term ) {
        echo "<li>" . $term->name . "</li>";
        the_field(\'issue_date\', $term);
    }
    echo "</ul>";
 }
任何帮助都将不胜感激。

6 个回复
最合适的回答,由SO网友:vancoder 整理而成

与其在初始循环中输出您的术语,不如使用它来构建一个新的数组,以您的issue\\u date为键:

$my_new_array = array( );
foreach ( $terms as $term ) {
    $issue_date = get_field( \'issue_date\', $term );
    $my_new_array[$issue_date] = $term->name;
}
然后,可以按以下顺序循环此新阵列:

ksort( $my_new_array, SORT_NUMERIC );

foreach ( $my_new_array as $issue_date => $term_name ) {
   echo "<li>" . $term_name . " " . $issue_date . "</li>";
}
这是未经测试的。

SO网友:Grigur

一个短得多的解决方案,只需在前面添加foreach:

usort($terms, function($a, $b) {
    return get_field(\'issue_date\', $a) - get_field(\'issue_date\', $b);
});

SO网友:RCNeil

我使用了类似的方法,但我想存储分类法中的值,而不是我给出的名称和自定义字段值,所以我最终将其存储为object 以及创建array 很像使用函数时实际返回的内容get_terms.

获取您的条款:

$terms = get_terms(\'your-taxonomy\');
然后创建一个新数组,按我的自定义字段值存储它们,在本例中该值恰好是数字:

$newterms = array(); 
foreach($terms as $term) {
    $order = get_field(\'order\', $term); //THIS MY CUSTOM FIELD VALUE                
    $newterms[$order] = (object) array(
            \'name\' => $term->name,
            \'slug\' => $term->slug,
            \'term_id\' => $term->term_id
    );
}
按数字排序:

ksort( $newterms, SORT_NUMERIC );
然后使用foreach 循环以获取每个对象的值:

foreach ( $newterms as $newterm ) {     
        echo \'<a href="#\' . $newterm->slug . \'">\' . $newterm->name . \'</a>\';
}
因此,本质上我是在重写数组以使用自定义顺序的键,但在本例中,我需要术语的slug、name和ID,因此我将其存储为对象,而不是上面的方法。

我的最终目标是Advanced Custom Field 因此,当创建一个分类术语时,用户可以给它一个数字顺序,然后我可以根据它们所需的顺序循环遍历这些术语。

希望这对别人有帮助!

SO网友:Phil Hoyt

感谢Vancoder的帮助!!!我整天都在把头发扯下来想弄清楚。有趣的是,你的解决方案是我在白板上写的半打解决方案之一,但我不知道如何实际创建一个以它为键的数组。我是这样的傻瓜。下面是我最后使用的代码,并为其他尝试这样做的人提供了一些注释!

<?php
$terms = get_terms("crb_issues");
$issue_archive = array( ); // creates an array for all terms inside of crb_issues tax using the custom field "issue_date" as the key
foreach ( $terms as $term ) {
    $issue_date = get_field( \'issue_date\', $term );
    $issue_archive[$issue_date] = $term->name;
}

krsort( $issue_archive, SORT_NUMERIC ); //sorts the issue_archive array from high to low

foreach ( $issue_archive as $issue_date => $term_name ) {
    echo "<li>" . $term_name . " " . $issue_date . "</li>"; //displays the term name and customfield issue_date
    if (++$i == 4) break; //Stops the foreach after 4
}
?>
如果有人对此代码有更好的评论,请让我知道,或者有更好的方法来处理任何事情。但我认为这是一个非常棒的解决方案。

SO网友:tigre

谢谢菲尔·霍伊特,这正是我想要的。但是,唉,我无法让它与我的设置一起工作。工作原理如下:

    <?php
    // Solution for sorting by ACF custom-field for tracks categories
    // http://support.advancedcustomfields.com/forums/topic/sorting-categories-list-by-custom-field/
    $categories = get_categories(\'taxonomy=tracks\');
    $sorted_cats = array();
    foreach($categories as $cat){
    //$ordr = get_field(\'track_order\', \'tracks_\'.$cat>term_id); //wasn\'t working so used the line below
        $ordr = get_field( \'track_order\', $cat );
        $sorted_cats[$ordr] = $cat;
    }
    krsort($sorted_cats);//ksort orders ascending, krsort reverses order (i.e. biggest to smallest)
    ?>
干杯

SO网友:Bobz

按数组值“order”而不是数组键对术语进行排序。如果有两个项具有相同的键,则最后一个项将覆盖第一个项。这将防止出现这种情况,并使所有这些问题都可见:

$sorted = array();
$args   = array( \'hide_empty\' => false );
$terms  = get_terms( \'my-tax\', $args );

if( $terms ) : 

    foreach ( $terms as $term ) {

        $sorted[]  = array(
            \'order\' => get_field( \'order\', $term ), // Get field from ACF
            \'name\'  => $term->name,
        );
    }

    function sortByOrder($a, $b) {
        return $a[\'order\'] - $b[\'order\'];
    }

    usort($sorted, \'sortByOrder\');

    foreach( $sorted as $t ) :?>
        <span>
            <?php echo $t[\'name\']; ?>
        </span>
    <?php endforeach;
endif;

相关推荐

WooCommerce:如何在Order元数据对象中获得具有自定义ID的订单?

因为一个项目,我需要你的帮助。我找了很多,但找不到解决办法。我正在尝试编辑一个名为woocommerce\\u account\\u订单我已经添加了该字段mycustom\\u id到订单元数据对象,因为我需要在字段mycustom\\u id中获取当前登录用户的所有订单:(mycustom\\u id=current\\u user\\u id())检查customer 应该留下来。我只需要再加上这个current_user_id 检查这应该保持原样:\'客户\'=>获取当前用户id()。这是我的