カテゴリページとアーカイブページのタグで投稿をソートしたいです。 (残念ながら、タグ用の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;
}
どんなアイデアでも大歓迎です。前もって感謝します。
これを実現するための正しい方法は、実際にはありません。特に、複数のタグに割り当てられている投稿がある場合(ほとんどの場合)。非常に確実なこと、あなたはあなたがあなたのために切り取られて働いています。
ここにあなたが持続することができるいくつかの考えと考えがあります:
投稿に複数のタグ(またはそのことを表す用語)が割り当てられている場合、別の投稿または投稿のセットに対して複数の関係があり、それらをグループ化すると、次のいずれかになります。 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 );