it-swarm.com.de

Zählen Sie Posts mit einem bestimmten Taxonomiebegriff

Beim Upgrade unseres Portfolios suche ich nach etwas, das die Anzahl der Beiträge in einer (aktuellen) Kategorie eines Beitragstyps anzeigt.

Beispiel: Ich habe eine Kategorie mit 'Features'. Jede Funktion hat eine eigene Beschreibung sowie eine Seite mit Apps und Blog-Beiträgen

Ich hole die aktuelle Kategorie mit:

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

und bekomme Beiträge mit:

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

Wie ist es möglich, die Posts von post_type = apps und category = $ cat_id zu zählen?

Es tut mir leid für meinen Mangel an PHP/WP Erfahrung. Weiß jemand, wie man diese 2 Dinge zum Laufen bringt?

Danke im Voraus.

2
rwzdoorn

Öffentliche API für die Rettung

category ist eine Taxonomie, die bereits integriert ist. Daher ist es ziemlich einfach, die Anzahl der Begriffe mit get_terms( $tax, array( /* args */ ) ); zu ermitteln.

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

Dies führt eine ziemlich schnelle COUNT (*)-Abfrage durch, sodass Sie sich keine Sorgen um die Leistung machen müssen.

Alternative Lösung

Sie können auch einfach einen normalen Aufruf von get_terms() ausführen und dann die selects mit dem Filter ändern:

// 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(*)' );
}

... wobei $selects ein Array ist (das in eine durch Kommas getrennte Zeichenfolge implodiert wird).

Noch schneller

Sie können die Abfrage dann weiter modifizieren und sie auf bestimmte Kategorien (Begriffe/Taxons) mit einem WHERE t.slug = whatever einschränken.

// 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;
}

Sie können den $pieces['join'] = ''; auch festlegen, wenn Sie keinen Zugriff auf die term_taxonomy- Tabelle benötigen.

Zwischenzuspeichern

Schließlich können Sie die Transients-API verwenden, um Ihre Ergebnisse (als serialisiertes Array) in der Datenbank zu speichern, sodass Sie die Anzahl nicht jedes Mal abfragen müssen, wenn Sie sie benötigen.

8
kaiser

Die Anzahl der Beiträge wird in Kategorieobjekt für solche Dinge zwischengespeichert. In der Kategorie Archiv sollte so etwas am einfachsten sein:

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

Wenn Sie versuchen, alle Posts in der Kategorie über diese Schleife abzurufen, sollten Sie posts_per_page=-1, -1 für alle und posts_per_page als neueren Ersatz für showposts verwenden.

Um Links zum Kategoriearchiv zu erstellen, können Sie get_category_link() function verwenden.

2
Rarst

Hatte am Anfang einige Probleme, aber das funktioniert für mich:

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