web-dev-qa-db-fra.com

commande personnalisée get_terms

J'utilise la fonction get_terms pour classer par ordre alphabétique tous les termes d'une taxonomie personnalisée. Mon client a toutefois demandé à ce que l’un des termes soit placé à la toute fin (donc pas par ordre alphabétique). Quelqu'un a-t-il des suggestions sur la meilleure façon d'y parvenir?

2
Duncan Morley

Cela peut être facilement fait avec votre propre fonction personnalisée. Ce que vous voulez faire ici, c'est obtenir votre objet dans get_terms() qui contiendra vos objets à terme, vérifier si votre clé unique est définie en tant que paramètre, puis supprimer ensuite cette clé/paire et l'ajouter à l'arrière.

Maintenant, mettons cela dans le code: ( J'ai commenté le code pour le rendre facile à suivre )

Il s'agit de la version antérieure à PHP 5.5 mais qui nécessite toujours au moins PHP 5.4.

function get_term_to_end( $taxonomy = '', $args = [] )
{
    $terms = get_terms( $taxonomy, $args );

    /*
     * Return $terms if our new argument term_to_end is not set or empty
     */
    if ( !isset( $args['term_to_end'] ) || empty( $args['term_to_end'] ) ) 
        return $terms;

    /*
     * If term_to_end is set and has a value, continue to process
     * Return $terms if a wp error is returned or if $terms is empty
     */
    if ( is_wp_error( $terms ) || empty( $terms ) )
        return $terms;
     /*
      * We have came this far, now we can finish this off
      */
    foreach ( $terms as $term ) {
        /*
         * Check the term ids against our new argument term_to_end
         */
        if ( $term->term_id == $args['term_to_end'] ) {
            $end[] = $term;
        } else {
            $terms_array[] = $term;
        }
    }
    /*
     * Merge the two arrays together, adding the term_to_end right at the back
     */
    $terms = array_merge( $terms_array, $end );

    /*
     * For uniformaty, type cast the resultant array to an object
     */
    return (object) $terms;
}

Si vous utilisez PHP 5.5 +, vous pouvez utiliser array_search et array_column et ignorer la boucle foreach à l'intérieur de la fonction.

function get_term_to_end( $taxonomy = '', $args = [] )
{
    $terms = get_terms( $taxonomy, $args );

    /*
     * Return $terms if our new argument term_to_end is not set or empty
     */
    if ( !isset( $args['term_to_end'] ) || empty( $args['term_to_end'] ) ) 
        return $terms;

    /*
     * If term_to_end is set and has a value, continue to process
     * Return $terms if a wp error is returned or if $terms is empty
     */
    if ( is_wp_error( $terms ) || empty( $terms ) )
        return $terms;

     /*
      * We have came this far, now we can finish this off
      *
      * We need to convert the multidimensional objects to a multidimensional array. Lets used
      * json_encode and json_decode. Now we can use 
      * array_search to and array_column to determine the position of the term_to_end
      */
    $terms_array = json_decode( json_encode( $terms ), true );
    $end_term_position = array_search( $args['term_to_end'], array_column( $terms_array, 'term_id'));

    /*
     * First check if $end_term_position in not false (array_search returns false on failure), 
     * if false, return $terms
     */
    if ( !$end_term_position )
        return $terms;

    /*
     * Get the key value pair for term_to_end, unset it from $terms and reset term_to_end pair at the back
     */
    $end_term_pair[] = $terms[$end_term_position];
    unset( $terms[$end_term_position] );
    $new_terms_array = array_merge( (array) $terms, $end_term_pair );

    /*
     * We are done!! Now we can just return $new_terms_array as an object
     */
    return (object) $new_terms_array;
}

Exemple d'utilisation:

Déplacez le terme avec l'ID 15 appartenant à la taxonomie mytax à l'arrière du tableau de termes. Conserve le nom par défaut odering

$terms = get_term_to_end( 'mytax', ['term_to_end' => 15] );

Ou

$args = [
    'term_to_end' => 15
];
$terms = get_term_to_end( 'mytax, $args );

QUELQUES NOTES SUR LE CI-DESSUS

  • Le code ci-dessus est tout non testé et peut être un buggy. J'ai écrit ceci sur une tablette.

  • Pour les anciennes versions (pre PHP 5.4), utilisez le premier bloc de code et remplacez simplement la nouvelle syntaxe de tableau ([]) par l'ancienne syntaxe (array()).

  • Le nouveau paramètre, term_to_end, utilise le terme pour passer à l'ID du terme. Vous pouvez modifier cette option pour utiliser le nom du terme ou le terme slug, quelles que soient les suites dont vous avez besoin. Vous pouvez également modifier cela pour travailler avec toutes ces valeurs

  • La nouvelle fonction utilise exactement les mêmes paramètres que get_terms(). Le seul ajout supplémentaire est le paramètre term_to_end

  • En tant que get_terms, la nouvelle fonction retourne un objet WP_Error si une taxonomie n'existe pas et renvoie également un tableau ampty si aucun terme n'est trouvé. N'oubliez pas de vérifier ces événements de la même manière que vous le feriez avec get_terms

  • Si le paramètre term_to_end est défini, le paramètre fields ne peut pas être défini sur autre chose que all (qui est la valeur par défaut). Toute autre valeur va casser la fonction. Vous pouvez modifier cela très facilement pour fonctionner correctement en intégrant des vérifications de code et en modifiant la variable foreach dans le premier bloc de code ou en modifiant l'utilisation de array_search dans le deuxième bloc de code.

  • Vous pouvez très facilement changer la fonction pour déplacer un terme sélectionné vers l'avant si nécessaire. Vous pouvez également ajuster la fonction pour accepter plusieurs termes à déplacer

  • Pour toute autre information concernant l’utilisation de cette fonction, veuillez consulter get_terms

MODIFIER

Ce code est maintenant testé et fonctionne comme prévu.

3
Pieter Goosen

Il y a peut-être une meilleure façon de le faire, mais vous pouvez probablement simplement faire deux requêtes. Peut-être que quelque chose dans ce sens (non testé):

$loner_term = X; //put whatever the id of the term you want at end
$taxonomies = 'YOUR_TAXONOMY_NAME';
)
// get all of the alphabetical terms and exclude the one you need at the end
$alpha_args = array(
    'orderby' => 'name',
    'exclude' => $loner_term
);
$alpha_terms = get_terms($taxonomies, $alpha_args);

// only get the term you need to come at the end
$na_args = array(
    'include' => $loner_term
);
$na_terms = get_terms($taxonomies, $na_args);

echo '<ul>';
// loop through the alphabetical terms
foreach ($alpha_terms as $alpha_term) {
    echo '<li>'. $alpha_term->name.'</li>';
}
// then loop through the loner term
foreach ($na_terms as $na_term) {
    echo '<li>'. $na_term->name.'</li>';
}    
echo '</ul>';

Édité pour utiliser get_terms correctement!

0
Stephen S.

Je suis tombé sur un problème similaire ces derniers temps. Si vous êtes habitué à utiliser un plugin, vous pouvez installer Trier par taxonomie personnalisée . Même s'il n'a pas été mis à jour depuis plus de deux ans, le problème a été résolu pour moi. En gros, cela vous permet de trier les termes manuellement à partir du tableau de bord.

0
Dmitry Mayorov

Une idée qui m'est venue est d'ajouter un terme dans votre taxonomie appelé "append", puis de définir les termes que vous souhaitez ajouter à la fin de la liste, en indiquant les enfants de ce terme. Ensuite, il ne reste plus qu’à faire les requêtes sur les termes appropriés, c’est-à-dire obtenir tous les termes avec append comme parent, puis les exclure lors de la recherche du reste. De cette façon, vous conservez le contrôle éditorial de cette commande personnalisée et n'avez rien codé en dur dans votre modèle.

0
Sammy Nordström