it-swarm.com.de

Ist es möglich, eine Archiv-URL für Vorige/Nächste Taxonomie zu erhalten?

Ich habe einen benutzerdefinierten Beitragstyp namens shows und eine Taxonomie namens podcast. Mit taxonomy-podcast.php kann ich nur schwer eine Funktion finden, die das nächste/vorherige Term-URL-Archiv generiert.

Zum Beispiel:

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

Beispiel Term 2

post 1, post 2, post 3

Gewünschte Ausgabe

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

Es ist durchaus möglich, dies zu erreichen. Was wir tun müssen, ist

  • Holen Sie sich alle Begriffe sortiert nach Slug ( oder einem anderen gewünschten Feld ) in Verbindung mit unserer Taxonomie

  • Liefert das aktuelle Termobjekt

  • Bestimmen Sie, wo sich in dem Array unser aktueller Begriff befindet

  • Holen Sie sich die beiden benachbarten Begriffe ( falls vorhanden )

  • Erstellen Sie die Links zu diesen Begriffsseiten

DIE FUNKTION

Ich habe eine Funktion geschrieben, die sich darum kümmert. Es ist immer wichtig, die Geschäftslogik von Vorlagen fernzuhalten. Vorlagen sollten nur Funktionsnamen und nicht die gesamte Funktion kennen. Auf diese Weise halten Sie Ihre Vorlagen sauber und wartbar

Die Funktion erfordert ein Minimum von PHP 5.4 und deckt die Grundlagen ab. Es liegt an Ihnen, sie an Ihre Bedürfnisse anzupassen

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

VERWENDUNGSZWECK

Sie können die Funktion jetzt wie folgt verwenden:

echo get_tax_navigation( 'podcast' );

BEARBEITEN - von Kommentaren

Nur zwei Fragen: (1) Wenn wir uns in der letzten Amtszeit befinden, können wir dann noch die nächste Amtszeit festlegen: (URL zur ersten Amtszeit) und umgekehrt? Grundsätzlich eine Endlosschleife. (2) Wie kann ich diese Funktion für Themen verwenden, um NEXT- und PREVIOUS-URLs einzeln auszugeben? (zB get_tax_navigation ('podcast', 'previous') und get_tax_navigation ('podcast', 'next')

  1. Wenn wir am Ende des ersten Semesters sind, müssen wir nur entweder das erste oder das letzte Semester auswählen, je nachdem, wo wir uns gerade befinden. Wenn wir uns in letzter Zeit befinden, greifen wir natürlich zur ersten und umgekehrt

  2. Wir können einen $direction-Parameter einführen, der drei Werte akzeptiert, eine leere Zeichenfolge, eine previous oder eine next.

Hier ist ein Beispiel dafür, was Sie tun können. Sie können es von hier aus an Ihre Bedürfnisse anpassen

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

Sie können den Code auf drei verschiedene Arten verwenden

  • echo get_tax_navigation( 'podcast' );, um die nächsten und vorherigen Begriffe anzuzeigen

  • echo get_tax_navigation( 'podcast', 'previous' );, um nur den vorherigen Begriff anzuzeigen

  • echo get_tax_navigation( 'podcast', 'next' );, um nur den nächsten Begriff anzuzeigen

3
Pieter Goosen

Etwas wie dieses wird es tun, wenn Sie viele Begriffe haben, könnte es eine ziemlich teure Abfrage sein, da es sie alle abruft, kann es im Moment keinen Weg finden, das zu umgehen ... (obwohl Sie alle Termergebnisse zwischenspeichern könnten ein vorübergehender Vorgang, vielleicht wird er nicht bei jedem Laden ausgeführt.)

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