web-dev-qa-db-fra.com

Commandez get_terms en utilisant un champ personnalisé

J'ai une taxonomie personnalisée de "crb_issues" à laquelle est associé un champ personnalisé "issue_date" qui génère une valeur de date pour chaque terme qui ressemble beaucoup à "20140601" yearmonthday.

J'essaie de mettre tous les termes de Taxonomies en utilisant get_terms et de les commander par ce champ personnalisé. Vous trouverez ci-dessous le code sur lequel j’ai travaillé qui affiche le nom du terme et la valeur de "issue_date". Mais j’ai du mal à obtenir ce qui est produit sur commande par ce champ personnalisé.

$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>";
 }

Toute aide serait très appréciée.

6
Phil Hoyt

Plutôt que de sortir vos termes dans cette boucle initiale, je l’utiliserais plutôt pour construire un nouveau tableau, avec votre date_émission comme clé:

$my_new_array = array( );
foreach ( $terms as $term ) {
    $issue_date = get_field( 'issue_date', $term );
    $my_new_array[$issue_date] = $term->name;
}

Vous pouvez ensuite parcourir ce nouveau tableau dans l'ordre suivant:

ksort( $my_new_array, SORT_NUMERIC );

foreach ( $my_new_array as $issue_date => $term_name ) {
   echo "<li>" . $term_name . " " . $issue_date . "</li>";
}

Ceci n'est pas testé.

4
vancoder

Une solution beaucoup plus courte, ajoutez simplement ceci avant foreach:

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

Merci Vancoder pour votre aide !!! Je me suis déchiré les cheveux toute la journée en essayant de le comprendre. Assez drôle, votre solution était celle d’une demi-douzaine que j’écrivais sur mon tableau blanc, MAIS je n’avais aucune idée de la manière de créer un tableau avec cette clé. Je suis un noob comme ça. Vous trouverez ci-dessous le code que j'ai utilisé avec des commentaires pour tous ceux qui essaient de le faire!

<?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
}
?>

Si quelqu'un a de meilleurs commentaires pour ce code, merci de me le faire savoir, ou de meilleurs moyens de gérer n'importe quoi. Mais je pense que c'est une solution plutôt géniale.

3
Phil Hoyt

J'ai utilisé une méthode similaire, mais je voulais stocker plus de valeurs de la taxonomie que le nom et la valeur de champ personnalisé que j'ai donnés. Je l'ai donc stockée sous la forme d'une object et créé une array très semblable à ce qui est réellement renvoyé lorsque vous utilisez la fonction. get_terms.

Obtenez vos termes:

$terms = get_terms('your-taxonomy');

Ensuite, créez un nouveau tableau, en les stockant par la valeur de mon champ personnalisé, qui est numérique dans ce cas:

$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
    );
}

Triez-les numériquement:

ksort( $newterms, SORT_NUMERIC );

Utilisez ensuite la boucle foreach pour obtenir les valeurs de chaque objet:

foreach ( $newterms as $newterm ) {     
        echo '<a href="#' . $newterm->slug . '">' . $newterm->name . '</a>';
}

Donc, je suis en train de réécrire le tableau pour utiliser la clé de mon ordre personnalisé, mais dans ce cas, j'avais besoin du slug, du nom et de l'ID du terme; je l'ai donc stocké sous la forme d'un objet plutôt que de la méthode ci-dessus.

Mon objectif final était de configurer un Champ personnalisé avancé ainsi, lorsqu'un terme de taxonomie était créé, un ordre numérique de l'utilisateur pouvait lui être attribué, puis je pouvais parcourir les termes en fonction de leur ordre souhaité.

J'espère que cela aide quelqu'un!

2
RCNeil

Triez les termes selon la valeur du tableau 'order' au lieu de la clé du tableau. Si vous avez 2 éléments avec la même clé, le dernier remplacera le premier. Cela empêchera cela et les rendra tous visibles:

$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;
0
Bobz

Merci Phil Hoyt, c'était exactement ce que je cherchais. Mais, hélas, je ne pouvais pas le faire fonctionner avec ma configuration. Qu'est-ce que le travail est le suivant:

    <?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)
    ?>

À votre santé

0
tigre