web-dev-qa-db-ja.com

カテゴリページのタグで投稿を並べ替える

カテゴリページとアーカイブページのタグで投稿をソートしたいです。 (残念ながら、タグ用のorderbyパラメータはありません。それは事をそれほど簡単にするでしょう!)

そのため、カテゴリページは次のようになります。

種別名

  • 投稿1(タグ1)
  • 投稿2(タグ1)
  • 投稿3(タグ1)
  • 投稿4(タグ2)
  • 投稿5(タグ2)
  • 投稿6(タグ2)
  • 投稿7(タグ3)
  • 投稿8(タグ3)
  • 投稿9(タグ3)...

あるいは、もっと良いのは

種別名

タグ1

  • 投稿1
  • 投稿2
  • 投稿3

タグ2

  • 投稿4
  • 投稿5
  • 投稿6

タグ3

  • 投稿7
  • 投稿8
  • 投稿9.

タグはアルファベット順に表示されます。タグの下の投稿もアルファベット順に表示されます。

投稿に複数のタグがある場合は、複数回表示する必要があります(タグごとに1つ)。

それをする方法はありますか?

このように することを考えたが、カテゴリ内の投稿とタグだけを表示するような解決策を思いつくことができなかった。 (リンクされたコードはすべての投稿とタグを表示します。)

あるいは、タグをmeta_valueとして扱う方法はありますか?それなら、私は単にpre_get_postsをこのように使うことができました:

add_action( 'pre_get_posts', 'archive_post_order'); 

function archive_post_order($query){
    if(is_archive()):
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'metakey', 'tag' );
        $query->set( 'order', 'ASC' );
    endif;    
}

どんなアイデアでも大歓迎です。前もって感謝します。

3
Argumentum

これを実現するための正しい方法は、実際にはありません。特に、複数のタグに割り当てられている投稿がある場合(ほとんどの場合)。非常に確実なこと、あなたはあなたがあなたのために切り取られて働いています。

ここにあなたが持続することができるいくつかの考えと考えがあります:

複数の条件があるポスター

投稿に複数のタグ(またはそのことを表す用語)が割り当てられている場合、別の投稿または投稿のセットに対して複数の関係があり、それらをグループ化すると、次のいずれかになります。 a)。なし複製不可能、または(b)可能な限り、with投稿の重複。

特定の分類法からの投稿に割り当てられた用語(この場合はタグ)(この場合はpost_tag)は、複数の用語が存在する場合は特定の順序で並べられます。単に最初の用語をつかむことがあなたが使いたいと思うであろう用語ではないかもしれません。

get_the_tags()またはより一般的なget_the_terms())からタグを並べ替えるには、ニーズに合わせてタグオブジェクトの返された配列を並べ替えるための追加のPHP並べ替えが必要になります。 SQLを使用してソートを実行するにはwp_get_post_tags()が、追加のdb呼び出しが必要になります。

最初のタグだけでソートしたい場合は、タグ配列をスイートまたはニーズに合わせてソートすると非常に簡単です。サンプルコードを後で投稿します

_回避策_

複数のタグを含む投稿がある場合は、投稿間に固有の関係を見つける必要があります。それに応じて、次のいずれかを実行します。

  • 並べ替え可能な値を持つカスタムフィールドを一連の投稿に割り当て、次にpre_get_postsを使用してカスタムフィールド値に従ってカテゴリページを並べ替えます。

  • このために特定の分類法を作成してから、一連の投稿に特別な用語を割り当て、次に投稿するthe_postsフィルターを使用して、返された投稿の配列を並べ替えます。

投稿の重複を気にしないのであれば、 この投稿 を見てください。これはカスタムフィールドのために行われたので、分割してタグで機能するように修正する必要があります。多次元配列を作成し、後でそれを平坦化してから、重複した投稿を含むソートされた配列を返す

シングルタグ付きのポスター

1つのタグのみに投稿が割り当てられている場合(または最初のタグのみで並べ替えることができます)、それに応じてthe_postsフィルタを使用して投稿を並べ替えるのは非常に簡単です。あなたは次のことを試すことができます(UNTESTEDそして非常に基本的な

add_filter( 'the_posts', function ( $posts, \WP_Query $q )
{
    // Make sure we only target the main query on category pages
    if (    !is_admin()
         && $q->is_main_query()
         && $q->is_category()
    ) {
        // Use usort to sort the posts
        usort( $posts, function( $a, $b )
        {
            return strcasecmp( 
                get_the_tags( $a->ID )[0]->name, 
                get_the_tags( $b->ID )[0]->name 
            );
        });
    }
}, 10, 2 );
2
Pieter Goosen