web-dev-qa-db-ja.com

特定の分類用語が添付された投稿を数える

ポートフォリオをアップグレードするときに、投稿タイプの(現在の)カテゴリに含まれる投稿の数を示すものを探しています。

例:私は「機能」を持つカテゴリがあります。各機能には独自の説明、アプリ関連、ブログ関連の投稿ページがあります

現在のカテゴリを取得しています:

<?php $cat_id = get_query_var('cat'); ?>

との投稿を取得:

 <?php query_posts("post_type=apps&cat=$cat_id&showposts=3");?>

Post_type = appsとcategory = $ cat_idの投稿を数えるにはどうすればいいですか?

PHP/WPの経験が足りないのが残念です。2つのことをうまく動かす方法を誰かが知っていますか?

前もって感謝します。

2
rwzdoorn

救助用のパブリックAPI

categoryはすでに組み込まれている分類法です。したがって、 get_terms( $tax, array( /* args */ ) ); を使用して用語カウントを取得するのは非常に簡単です。

$terms = get_terms( 'category', array(
    'fields' => 'count',
) );

これはかなり速いCOUNT (*)クエリを実行するので、パフォーマンスについて心配する必要はありません。

代替ソリューション

get_terms()を普通に呼び出してから、フィルタを使ってselectsを変更することもできます。

// The core filter:
apply_filters( 'get_terms_fields', $selects, $args )

// Example callback:
add_action( 'get_terms_fields', 'wpse105174_get_terms_fields_cb', 10, 2 );
function wpse105174_get_terms_fields_cb( $selects, $args )
{
    return array( 't.term_id', 'COUNT(*)' );
}

... $selectsは配列です(これはカンマ区切りの文字列に分解されます)。

さらに速くする

その後、クエリをさらに修正し、WHERE t.slug = whateverを使用して特定のカテゴリ(用語/分類群)のみに制限することができます。

// The core filter:
apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );

// Example callback:
add_action( 'terms_clauses', 'wpse105174_terms_clauses_cb', 10, 3 );
function wpse105174_terms_clauses_cb( $pieces, $taxonomies, $args )
{
    $pieces['where'] = " WHERE t.slug = whatever";
    // Or do some `str_replace`, `preg_replace`, whatever fits in here

    return $pieces;
}

$pieces['join'] = '';-テーブルにアクセスする必要がない場合は、term_taxonomyも設定できます。

キャッシュする

最後に Transients API を使用して結果を(直列化された配列として)DBに保存することができるので、必要なときに毎回カウントを問い合わせる必要はありません。

8
kaiser

投稿数は、このようなことのためにカテゴリオブジェクトにキャッシュされます。カテゴリアーカイブでは、次のようなものが最も簡単です。

$category = get_queried_object();
// $category->count has count

そのループを介してカテゴリ内のすべての投稿を取得しようとしている場合は、すべてにposts_per_page=-1-1を使用し、posts_per_pageshowpostsに置き換えてください。

カテゴリアーカイブへのリンクを作成するには、 get_category_link() functionを使用します。

2
Rarst

最初は多少のトラブルがありましたが、これは私にとってはうまくいきます。

<?php $posts = get_posts("post_type=apps&cat=$cat_id"); 
$count = count($posts); 
 echo "$count"; 
?>
1
rwzdoorn