web-dev-qa-db-ja.com

前/次の分類用語のアーカイブURLを取得することは可能ですか?

showsというカスタム投稿タイプとpodcastという分類法があります。 taxonomy-podcast.phpを使用して、次/前のTerm URLアーカイブを生成する関数を見つけるのに苦労しています。

例えば:

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

例2

投稿1、投稿2、投稿3

望ましい出力

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

これを達成することはかなり可能です。私たちがする必要があるのは

  • 分類法に関連するすべての用語をslug(またはその他の希望のフィールド)でソートして取得します。

  • 現在の用語オブジェクトを取得する

  • 現在の用語が配列内のどこにあるかを判断します。

  • 隣接する2つの用語を取得します(もしあれば)。

  • それらの用語ページへのリンクを構築する

関数

私はこれを引き受ける機能を書きました。ビジネスロジックをテンプレートから除外することは常に重要です。テンプレートは関数名だけを知っているべきで、関数全体を知るべきではありません。このようにして、あなたはあなたのテンプレートを清潔で保守可能に保ちます

この機能はPHP 5.4以上を必要とし、基本をカバーします、それはあなたのニーズに合わせて調整するのはあなた次第です

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

使用法

以下のように、必要に応じてこの機能を使用することができます。

echo get_tax_navigation( 'podcast' );

編集 - コメントから

2つだけ質問してください。(1)私たちが最後の学期に来たとき、私たちはまだ次の学期を作ることができますか:基本的には無限項ループです。 (2)テーマ設定のために、この関数を使用してNEXTとPREVIOUSのURLを個別に出力するにはどうすればよいですか? (例:get_tax_navigation( 'podcast'、 'previous')およびget_tax_navigation( 'podcast'、 'next')

  1. 私たちが最初の学期の最後にいるとき、私たちがする必要があるのは私たちがどこにいるかに応じて最初か最後の学期をつかむことだけです。明らかに、私たちが最新の用語を使っているとき、最初のものをつかむでしょう、そしてその逆も

  2. 空の文字列、previousまたはnextの3つの値を受け取る$directionパラメータを導入できます。

これがあなたができることの例です。あなたはあなたのニーズを満たすためにここからそれを調整することができます

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

あなたは3つの異なる方法でコードを使うことができます

  • 次の用語と前の用語を表示するecho get_tax_navigation( 'podcast' );

  • 前の用語のみを表示するecho get_tax_navigation( 'podcast', 'previous' );

  • 次の用語だけを表示するecho get_tax_navigation( 'podcast', 'next' );

3
Pieter Goosen

このようなことでうまくいくでしょう、たくさんの用語がある場合、それらすべてを取得するのでかなり高価なクエリになる可能性がありますが、現在のところ回避策を見つけることはできません。おそらく一時的なので、ページロードごとに行われるわけではありません。

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