web-dev-qa-db-ja.com

投稿の投稿数を取得する

特定の投稿の投稿の子の数(数)を取得するための迅速な方法はありますか? (投稿にはカスタム投稿タイプがあります)

余分なデータをすべて必要としないため、WP_Queryを使用したくありません。

LE:wyrfelの答えに基づいて、私は次のものを使いました。

function reply_count($topic, $type = 'topic-reply'){
  global $wpdb;
  $cache_key = "{$type}_{$topic}_counts";
  $count = wp_cache_get($cache_key, 'counts');
  if(false !== $count) return $count;
  $query = "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = %s";
  $count = $wpdb->get_var($wpdb->prepare($query, $topic, $type));
  wp_cache_set($cache_key, $count, 'counts');
  return $count;
}
2
onetrickpony
class MyClass {

    ...

    function post_count_filter($where) {
        global $wpdb;
        str_replace("WHERE", "WHERE ".$wpdb->posts.".post_parent = ".$this->count_parent." AND", $where);
        return $where;
    }

    function count_children($post_id) {
        $this->count_parent = $post_id;
        add_filter('query', ( &$this, 'post_count_filter') );
        $stats = wp_count_posts('myposttype');
        remove_filter('query', ( &$this, 'post_count_filter') );
        unset($this->count_parent);
        return array_sum( (array)$stats );
    }

    // example of use
    function xyz() {
        global $post;
        ...
        $child_count = $this->count_children($post->ID);
        ...
    }

    ...

}

これに関する唯一の問題は、wp_count_posts()が結果をキャッシュし、フィルタがキャッシュをバイパスするので、まずキャッシュを無効にする必要があるかもしれないということです。

あるいは(より良い)wp_count_posts()関数をコピーしてあなたの必要に応じて修正してください。そうすればあなたはフィルタを使う必要はなく、結果をまとめる必要はありません。

3
wyrfel