カスタム投稿タイプのカスタム分類をすべて取得し、それぞれに最新の投稿を表示するカスタムクエリがあります。現時点ではall分類法を利用しています。ページごとに表示される分類法の数を設定数に制限してページ付けする方法はありますか。
// Set post type
$post_type = 'prints';
// Get all the taxonomies for this post type
$taxonomies = get_object_taxonomies( (object) array( 'post_type' => $post_type ) );
foreach( $taxonomies as $taxonomy ) :
// Get every "category" (term) in this taxonomy to get the respective posts
$terms = get_terms( $taxonomy );
foreach( $terms as $term ) :
// Query to show first post in taxonomy
$posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );
if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post(); ?><!--
--><div>
<a href="<?php esc_url( the_permalink() ); ?>">
<?php the_post_thumbnail ('medium'); ?>
<h2><?php echo $term->name; ?></h2>
</a>
</div><?php
endwhile; endif;
endforeach;
endforeach;
ページネーションを機能させるには、ページ付きクエリvarを渡します。カスタムページテンプレートの場合もあります。
それで….
$tax_per_page = 2;
$post_type = 'print';
$taxonomies = get_object_taxonomies( $post_type );
$page = get_query_var('paged') > 1 ? get_query_var('paged')-1 : 0;
$splitted_taxes = array_chunk($taxonomies, $tax_per_page);
$taxonomies_on_page = isset($splitted_taxes[$page]) ? $splitted_taxes[$page] : false;
if ($taxonomies_on_page) { foreach( $taxonomies_on_page as $taxonomy ) {
$terms = get_terms( $taxonomy );
foreach( $terms as $term ) :
$posts = new WP_Query( "taxonomy=$taxonomy&term=$term->slug&posts_per_page=1" );
if( $posts->have_posts() ): while( $posts->have_posts() ) : $posts->the_post();
?>
<div>
<a href="<?php esc_url( the_permalink() ); ?>">
<?php the_post_thumbnail('medium'); ?>
<h4><?php echo $term->name; ?></h4>
</a>
</div>
<?php
endwhile; endif;
endforeach;
} }
注:ページ番号の上にポストされたコード分類法ではない問題です。
チャットで議論されたように、そして@Rarstがすでにあなたに言ったように、達成するためのデフォルトのWordPress方法はありません。
複数の分類法とそのすべての用語のアーカイブ
実際には達成する方法はありません
単一分類法のアーカイブとそのすべての用語
wordPressで。 WordPressがそれを実行しないという理由だけで - カスタムSQLクエリなしで。
しかし、アプローチを単純化するためにできることがいくつかあります。
チャットで次のように述べたように、もう少し詳しく説明します。
本質的に私が作成しようとしているのはカテゴリのアーカイブです。そのため、各カテゴリ(カスタム分類法)について、いずれかの投稿からのおすすめ画像とそのカテゴリのタイトルを表示します。
$taxonomies = get_object_taxonomies( get_post_type_object( 'prints' )->name, 'names' );
注: get_object_taxonomies()
の2番目の引数をobjects
に設定すると、後で使用するための完全なオブジェクトが得られます。 .
そして get_terms()
は最初の引数として分類法の配列を取ります。そのため、prints
CPTに割り当てられているすべての分類法のすべての用語を取得するには、次のようにします。
注:上記の2番目の引数を使用して完全なオブジェクトを取得した場合は、 wp_list_pluck()
を使用して分類名を抽出します。
$terms = get_terms( $taxonomies, array() );
順序に影響を与える必要がある場合は、関数呼び出しの2番目の引数/配列でorderby
(デフォルト:name
)およびorder
(デフォルト:ASC
endending)引数を使用するか、フィルタを使用できます。
apply_filters( 'get_terms_orderby', $orderby, $args );
最初に述べたように、用語クエリに沿って単一の投稿を取得するという目標を達成するためのデフォルトの方法はありません。 しかしあなたはまだあなた自身のSQLクエリを構築することができます。そのためのフィルタがあります。
apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );
そのため、ジャンプしたり、クエリを変更したり、postsテーブルを含めたりできます。
add_action( 'terms_clauses', 'wpse114800_get_terms_with_posts', 20, 3 );
function wpse114800_get_terms_with_posts( $clauses, $taxonomies, $args )
{
// Alter the $clauses
return $clauses;
}
上記のフィルタコールバックの結果は、WordPressによるクエリ構築を変更します。コアのデフォルトは次のようになります。
"SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits"
JOIN
句は次のように構築されています。
"INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"
今しなければならないのは、おそらく以下のようなもので$wpdb->term_relationship
をJOIN
にすることです。
INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id
coreの wp_get_object_terms()
から引用。
WHERE
節は、おそらくlikethisのようになります。
$wpdb->prepare( "WHERE tt.taxonomy IN (%s)", "'".implode( "', '", $taxonomies)."'" )
これ以降は、JOIN
の$wpdb->posts
テーブルをID
し、分類用語ごとに1つの投稿をクエリできるはずです。
何らかの理由で結果をキャッシュし、一時的なものとして追加するか、クエリが非常に遅くなる可能性があるため、同様のものとして追加することを強くお勧めします。