私はどこかにこのコードを見つけました、それは投稿を数えますが、それは特定のカテゴリの下にあるだけです。誰かがこれを拡張して、その子カテゴリに属するすべての投稿を数えることができれば幸いです。
function wp_get_cat_postcount($id) {
$cat = get_category_by_slug( $id );
$count = (int)$cat->count;
$taxonomy = 'category';
$args = array(
'child_of' => $id,
);
$tax_terms = get_terms($taxonomy,$args);
foreach ($tax_terms as $tax_term) {
$count +=$tax_term->count;
}
return $count;
}
あなたが使っている関数はスクランブルされていてあまり意味がありません。また、投稿タイプ、投稿ステータス、カスタムフィールドなどのカスタムパラメータに従ってカウントを返すことができないという点で、非常に静的です。もう1つ注意が必要なのは、投稿がその用語とその子用語の1つに属している場合、その投稿は2回カウントされるため、実際の投稿数より多い投稿カウントになることです。
私見、関数を動的にし、親と子の用語に属する投稿のために肥大化したものの代わりに真の数を返すためにカスタムクエリを利用するだけです。
tax_query
にはinclude_children
という名前のパラメーターがあり、これはデフォルトでtrue
に設定されています。このパラメーターはterms
パラメーターに渡された用語のすべての子用語を含むため、渡された用語とそのすべての子から投稿を返します。
次に、投稿数を取得するために1つの投稿をクエリするだけです。 WP_Query
がデフォルトで行うことは、クエリを数学的に処理するために必要な投稿がすでに見つかっていても、一致する投稿を探してdbを検索し続けることです。これはページ付けを計算するために行われ、クエリに一致するこれらすべての投稿の数はクエリオブジェクトの$found_posts
プロパティに格納されます。
Dbの呼び出しとそれを行うのに費やす時間を節約するために、完全なWP_Post
オブジェクトではなく、ID
のpostフィールドを照会するだけです。
まず第一に、いくつかのメモ
コードはテストされておらず、バグがある可能性があります。デバッグをオンにしてローカルテストインストールでこれを最初にテストするようにしてください。
コードには最低限PHP 5.4が必要です。
あなたがフォローし理解することができるように、私は一緒に行くときにコードをコメントします。
/**
* Funtion to get post count from given term or terms and its/their children
*
* @param (string) $taxonomy
* @param (int|array|string) $term Single integer value, or array of integers or "all"
* @param (array) $args Array of arguments to pass to WP_Query
* @return $q->found_posts
*
*/
function get_term_post_count( $taxonomy = 'category', $term = '', $args = [] )
{
// Lets first validate and sanitize our parameters, on failure, just return false
if ( !$term )
return false;
if ( $term !== 'all' ) {
if ( !is_array( $term ) ) {
$term = filter_var( $term, FILTER_VALIDATE_INT );
} else {
$term = filter_var_array( $term, FILTER_VALIDATE_INT );
}
}
if ( $taxonomy !== 'category' ) {
$taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
if ( !taxonomy_exists( $taxonomy ) )
return false;
}
if ( $args ) {
if ( !is_array )
return false;
}
// Now that we have come this far, lets continue and wrap it up
// Set our default args
$defaults = [
'posts_per_page' => 1,
'fields' => 'ids'
];
if ( $term !== 'all' ) {
$defaults['tax_query'] = [
[
'taxonomy' => $taxonomy,
'terms' => $term
]
];
}
$combined_args = wp_parse_args( $args, $defaults );
$q = new WP_Query( $combined_args );
// Return the post count
return $q->found_posts;
}
あなたは以下の方法で関数を使うことができます
ケース1
デフォルトのカテゴリ分類法による単一の用語(用語ID 21
)
$count = get_term_post_count( 'category', 21 );
echo $count;
ケース2
カスタム分類法を持つ用語IDの配列my_taxonomy
$count = get_term_post_count( 'my_taxonomy', [21, 41, 52] );
echo $count;
ケース3
カスタム投稿タイプcpt
および投稿ステータスtrash
からのデフォルトカテゴリ分類からの単一用語
$args = [
'post_type' => 'cpt',
'post_status' => 'trash'
];
$count = get_term_post_count( 'category', 21, $args );
echo $count;
使用法4
特定の分類法のすべての用語から投稿数を取得する必要がある場合は、単に$term
パラメーターをallに設定します。
$count = get_term_post_count( 'category', 'all' );
echo $count;