web-dev-qa-db-fra.com

Est-il possible d'obtenir une URL d'archive de terme de taxonomie précédente/suivante?

J'ai un type de message personnalisé appelé shows et une taxonomie appelée podcast. En utilisant taxonomy-podcast.php, j’ai du mal à trouver une fonction qui va générer l’archive d’URL de terme suivante/précédente.

Par exemple:

URL: url.com/podcast/example-term-2

Exemple de terme 2

poste 1, poste 2, poste 3

Sortie désirée

< Previous Term(url.com/podcast/example-term-1)    .   . . . . | . . . . .     Next Term(url.com/podcast/example-term-3)>
1
user3137901

Il est tout à fait possible d'y parvenir. Ce que nous devons faire est

  • Obtenez tous les termes triés par slug ( ou tout autre champ souhaité ) associé à notre taxonomie

  • Obtenir l'objet terme actuel

  • Déterminer où dans le tableau notre terme actuel est

  • Obtenez les deux termes adjacents ( le cas échéant )

  • Construire les liens vers ces pages de termes

LA FONCTION

J'ai écrit une fonction pour prendre soin de cela. Il est toujours important de garder la logique métier en dehors des modèles. Les modèles ne doivent connaître que les noms de fonction et non la fonction entière. De cette façon, vous gardez vos modèles propres et maintenables

La fonction nécessite un minimum de PHP 5.4 et couvre les bases, c'est à vous de l'adapter à vos besoins

function get_tax_navigation( $taxonomy = 'category' ) 
{
    // Make sure we are on a taxonomy term/category/tag archive page, if not, bail
    if ( 'category' === $taxonomy ) {
        if ( !is_category() )
            return false;
    } elseif ( 'post_tag' === $taxonomy ) {
        if ( !is_tag() )
            return false;
    } else {
        if ( !is_tax( $taxonomy ) )
            return false;
    }

    // Make sure the taxonomy is valid and sanitize the taxonomy
    if (    'category' !== $taxonomy 
         || 'post_tag' !== $taxonomy
    ) {
        $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
        if ( !$taxonomy )
            return false;

        if ( !taxonomy_exists( $taxonomy ) )
            return false;
    }

    // Get the current term object
    $current_term = get_term( $GLOBALS['wp_the_query']->get_queried_object() );

    // Get all the terms ordered by slug 
    $terms = get_terms( $taxonomy, ['orderby' => 'slug'] );

    // Make sure we have terms before we continue
    if ( !$terms ) 
        return false;

    // Because empty terms stuffs around with array keys, lets reset them
    $terms = array_values( $terms );

    // Lets get all the term id's from the array of term objects
    $term_ids = wp_list_pluck( $terms, 'term_id' );

    /**
     * We now need to locate the position of the current term amongs the $term_ids array. \
     * This way, we can now know which terms are adjacent to the current one
     */
    $current_term_position = array_search( $current_term->term_id, $term_ids );

    // Set default variables to hold the next and previous terms
    $previous_term = '';
    $next_term     = '';

    // Get the previous term
    if ( 0 !== $current_term_position ) 
        $previous_term = $terms[$current_term_position - 1];

    // Get the next term
    if ( intval( count( $term_ids ) - 1 ) !== $current_term_position ) 
        $next_term = $terms[$current_term_position + 1];

    $link = [];
    // Build the links
    if ( $previous_term ) 
        $link[] = 'Previous Term: <a href="' . esc_url( get_term_link( $previous_term ) ) . '">' . $previous_term->name . '</a>';

    if ( $next_term ) 
        $link[] = 'Next Term: <a href="' . esc_url( get_term_link( $next_term ) ) . '">' . $next_term->name . '</a>';

    return implode( ' ...|... ', $link );
}

USAGE

Vous pouvez maintenant utiliser la fonction si nécessaire comme suit:

echo get_tax_navigation( 'podcast' );

EDIT - des commentaires

Juste deux questions: (1) Quand nous sommes au dernier mandat, pouvons-nous toujours créer le prochain terme: (URL vers le premier terme) et inversement? Fondamentalement, une boucle de termes infinie. (2) Pour les thèmes, comment utiliser cette fonction pour générer individuellement les URLs NEXT et PREVIOUS? (par exemple, get_tax_navigation ('podcast', 'précédent') et get_tax_navigation ('podcast', 'suivant')

  1. Lorsque nous sommes sur le dernier mandat du premier mandat, tout ce que nous avons à faire est de saisir le premier ou le dernier mandat en fonction de la situation. Évidemment, lorsque nous serons à la fin, nous attraperons le premier et vica-versa

  2. Nous pouvons introduire un paramètre $direction qui accepte trois valeurs, une chaîne vide, previous ou next

Voici un exemple de ce que vous pouvez faire. Vous pouvez l'ajuster d'ici pour répondre à vos besoins

function get_tax_navigation( $taxonomy = 'category', $direction = '' ) 
{
    // Make sure we are on a taxonomy term/category/tag archive page, if not, bail
    if ( 'category' === $taxonomy ) {
        if ( !is_category() )
            return false;
    } elseif ( 'post_tag' === $taxonomy ) {
        if ( !is_tag() )
            return false;
    } else {
        if ( !is_tax( $taxonomy ) )
            return false;
    }

    // Make sure the taxonomy is valid and sanitize the taxonomy
    if (    'category' !== $taxonomy 
         || 'post_tag' !== $taxonomy
    ) {
        $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
        if ( !$taxonomy )
            return false;

        if ( !taxonomy_exists( $taxonomy ) )
            return false;
    }

    // Get the current term object
    $current_term = get_term( $GLOBALS['wp_the_query']->get_queried_object() );

    // Get all the terms ordered by slug 
    $terms = get_terms( $taxonomy, ['orderby' => 'slug'] );

    // Make sure we have terms before we continue
    if ( !$terms ) 
        return false;

    // Because empty terms stuffs around with array keys, lets reset them
    $terms = array_values( $terms );

    // Lets get all the term id's from the array of term objects
    $term_ids = wp_list_pluck( $terms, 'term_id' );

    /**
     * We now need to locate the position of the current term amongs the $term_ids array. \
     * This way, we can now know which terms are adjacent to the current one
     */
    $current_term_position = array_search( $current_term->term_id, $term_ids );

    // Set default variables to hold the next and previous terms
    $previous_term = '';
    $next_term     = '';

    // Get the previous term
    if (    'previous' === $direction 
         || !$direction
    ) {
        if ( 0 === $current_term_position ) {
            $previous_term = $terms[intval( count( $term_ids ) - 1 )];
        } else {
            $previous_term = $terms[$current_term_position - 1];
        }
    }

    // Get the next term
    if (    'next' === $direction
         || !$direction
    ) {
        if ( intval( count( $term_ids ) - 1 ) === $current_term_position ) {
            $next_term = $terms[0];
        } else {
            $next_term = $terms[$current_term_position + 1];
        }
    }

    $link = [];
    // Build the links
    if ( $previous_term ) 
        $link[] = 'Previous Term: <a href="' . esc_url( get_term_link( $previous_term ) ) . '">' . $previous_term->name . '</a>';

    if ( $next_term ) 
        $link[] = 'Next Term: <a href="' . esc_url( get_term_link( $next_term ) ) . '">' . $next_term->name . '</a>';

    return implode( ' ...|... ', $link );
}

Vous pouvez utiliser le code de trois manières différentes

  • echo get_tax_navigation( 'podcast' ); pour afficher les termes suivants et précédents

  • echo get_tax_navigation( 'podcast', 'previous' ); pour afficher uniquement le terme précédent

  • echo get_tax_navigation( 'podcast', 'next' ); pour afficher uniquement le terme suivant

3
Pieter Goosen

Quelque chose comme ça va le faire, si vous avez beaucoup de termes, cela pourrait être une requête assez coûteuse, même si elle les récupère tous, vous ne pouvez pas trouver une solution pour le moment ... (même si vous pouvez mettre en cache tous les résultats des termes dans un transitoire peut-être alors il ne se fait pas chaque pageload.)

function custom_term_navigation() {
    $thistermid = get_queried_object()->term_id;
    if (!is_numeric($thistermid)) {return;}

    // remove commenting to use transient storage
    // $terms = get_transient('all_podcast_terms');
    // if (!$terms) {
        $args = array('orderby'=>'slug');
        $terms = get_terms('podcast',$args);
    //  set_transient('all_podcast_terms',$terms,60*60);
    // }

    $termid = ''; $termslug = ''; $foundterm = false;
    foreach ($terms as $term) {
        $prevterm = $termslug;
        $termid = $term->term_id;
        if ($foundterm) {$nextterm = $term->slug; break;}
        if ($termid == $thistermid) {
            $foundterm = true; $previousterm = $prevterm;
        }
        $termslug = $term->slug;
    }

    $navigation = '';
    if ($previousterm != '') {
        $previoustermlink = get_term_link($previousterm,'podcast');
        $navigation .= "".$previoustermlink."' style='float:left; display:inline;'>&larr; Previous Term</a>";
    }
    if ($nexterm != '') {
        $nexttermlink = get_term_link($nexterm,'podcast');
        $navigation .= "<a href='".$nextermlink."' style='float:right; display:inline;'>Next Term &rarr;</a>";
    }

    return $navigation;
}
1
majick