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.
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)>
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
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 );
}
Vous pouvez maintenant utiliser la fonction si nécessaire comme suit:
echo get_tax_navigation( 'podcast' );
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')
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
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
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;'>← Previous Term</a>";
}
if ($nexterm != '') {
$nexttermlink = get_term_link($nexterm,'podcast');
$navigation .= "<a href='".$nextermlink."' style='float:right; display:inline;'>Next Term →</a>";
}
return $navigation;
}