web-dev-qa-db-ja.com

子カテゴリを含むカテゴリ内の投稿数を数える

私はどこかにこのコードを見つけました、それは投稿を数えますが、それは特定のカテゴリの下にあるだけです。誰かがこれを拡張して、その子カテゴリに属する​​すべての投稿を数えることができれば幸いです。

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
Marko

あなたが使っている関数はスクランブルされていてあまり意味がありません。また、投稿タイプ、投稿ステータス、カスタムフィールドなどのカスタムパラメータに従ってカウントを返すことができないという点で、非常に静的です。もう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;
2
Pieter Goosen