Abrufen der Kategorieanzahl relativ zur aktuellen Abfrage

Lesezeit: 5 Minuten

Benutzeravatar von Juan Rangel
Juan Rangel

Ich verwende WordPress und muss auf der Suchseite die Anzahl der Beiträge innerhalb der Kategorie erfassen und neben dem Namen anzeigen. Wie so

Kat. 1 (3) Kat. 2 (1) Kat. 3 (18) ….

Derzeit verwende ich die get_categories() Funktionen, die Ihnen ein Objekt geben und mit dem Sie die Zählung erfassen $cat->count(). Dies erfasst die Gesamtzahl der Posts innerhalb des Begriffs, aber ich muss diese Anzahl nur aus dem Post innerhalb der aktuellen Abfrage abrufen. ich benutze pre_get_posts um die Abfrage zu aktualisieren. Kennt jemand eine Möglichkeit, dies zu tun?

Hier ist mein aktueller Codeblock

foreach ( get_categories() as $cat ) {
    if ( $cat->parent === 0 ) {
        $checked = ( in_array( $cat->slug, $check ) ) ? 'checked' : '';

        printf( '<input id="%1$s" %4$s type="checkbox" name="category[%1$s]"><label for="%1$s" >%2$s ( %3$d )</label><br>',
            $cat->slug,
            $cat->name,
            $cat->count,
            $checked
        );
    }
}

Hier ist mein pre_get_posts Aktion:

add_action( 'pre_get_posts', 'breed_search_query' );
function breed_search_query( $query ) {
$cats   = ( isset( $_GET['category'] ) ) ? implode( ',', array_keys( $_GET['category'] ) ) : null;
$search = ( isset( $_GET['s'] ) ) ? sanitize_text_field( $_GET['s'] ) : null;

    if ( ! is_admin() && $query->is_main_query() && is_search() ) {
        $query->set( 'post_type', 'post' );
        $query->set( 'posts_per_page', 8 );
        $query->set( 's', $search );
        $query->set( 'category_name', $cats );
    }
}

  • Meine Antwort wird nicht funktionieren, ich muss ein paar Anpassungen daran vornehmen. Das kann ich jetzt leider nicht. Werde das etwas später untersuchen. Werde euch auf dem Laufenden halten. Fügen Sie in der Zwischenzeit Ihre hinzu pre_get_posts Aktion, nach der Sie die Suchanfrage filtern, das ist wichtig für meine Antwort

    – Pieter Goosen

    22. Juli 2015 um 7:19 Uhr

  • Völlig verstehen. Danke für deinen Beitrag.

    – Juan Rangel

    22. Juli 2015 um 16:44 Uhr

  • Ich bin damit beschäftigt, alles zu sortieren. Ich warte nur auf deine pre_get_posts Aktion

    – Pieter Goosen

    22. Juli 2015 um 16:51 Uhr

  • Habe gerade meine Frage aktualisiert. Danke für Ihre Hilfe.

    – Juan Rangel

    22. Juli 2015 um 16:59 Uhr

  • OK, ich werde das jetzt einbauen, um die Anzahl zu korrigieren 😉

    – Pieter Goosen

    22. Juli 2015 um 17:00 Uhr

Benutzeravatar von Pieter Goosen
Pieter Goosen

Schöne und interessante Frage muss man sagen. Leider wirst du das nicht zum Laufen bekommen get_categoriesalso brauchen Sie hier einen anderen Ansatz.

So werden wir es machen:

  • Erstellen Sie eine sehr schlanke benutzerdefinierte Abfrage, um alle Beitrags-IDs von allen Beiträgen zu erhalten, die der Abfrage entsprechen

  • Holen Sie sich alle Kategorien, die an einen Beitrag angehängt sind

  • Durchlaufen Sie alle Posts und die Kategorien innerhalb der Posts und erstellen Sie ein Array mit den Kategorienamen als Schlüssel und Post-IDs als Werte

  • Durchlaufen Sie dieses neue Array und zeigen Sie den Kategorienamen an und zählen und zeigen Sie auch die Anzahl der Beiträge für diesen bestimmten Schlüssel (Kategorie) an.

DER CODE:

(HINWEIS: Der folgende Code ist ungetestet und benötigt aufgrund der neuen Array-Syntax mindestens PHP 5.4+ ([]))

$cats   = ( isset( $_GET['category'] ) ) ? implode( ',', array_keys( $_GET['category'] ) ) : null;
$search = ( isset( $_GET['s'] ) ) ? sanitize_text_field( $_GET['s'] ) : null;

$args = [
    'post_type'     => 'post',
    'nopaging'      => true, // Gets all posts
    's'             => $search,
    'category_name' => $cats,
    'fields'        => 'ids', // Makes the query extremely lean, excellent for performance, only get post ID's
];
$q = get_posts( $args );

// Define our $category_array which will hold the category name/post ID's array
$category_array = [];

// Define our $category_info array which will hold the category name as key and the object as value
$category_info = [];

foreach ( $q as $post ) {
    // Get the categories attached to a post
    $categories = get_the_category( $post );

    foreach ( $categories as $category ) {
        // Create our array which will hold the category name as key and post ID's as values
        $category_array[$category->name][] = $post;
        // Create an array to hold the category objects. Use names as keys and objects as values
        $category_info[$category->name] = $category;
    } // endforeach $categories
} // endforeach $wp_query->posts
wp_reset_postdata();

// Sort the array keys alphabetical. You can change or remove this as necessary
ksort( $category_array );

foreach ( $category_array as $k=>$v ) {

    $category_slug = $category_info[$k]->slug;
    $category_parent = $category_info[$k]->parent;

    $checked = ( in_array( $category_slug, $check ) ) ? 'checked' : ''; // Just make sure that $check is defined somewhere

    // Build our string
    printf ( '<input id="%1$s" %4$s type="checkbox" name="category[%1$s]"><label for="%1$s" >%2$s ( %3$d )</label><br>', // I have not modified anything in this line
        $category_slug, // Holds the category slug
        $k, // Holds the category name
        count( $v ), // Counts and return the post count
        $checked
    );
} // endforeach $category_array

  • Hey Pieter, ich habe gerade diese Antwort gesehen. Vielen Dank, dass Sie sich die Zeit genommen haben, es aufzuschreiben. Es hat mich auf den richtigen Weg gebracht. Ich habe immer noch ein Problem mit der Zählung. Wenn ich var_dump($v); Ich bekomme die Nummer 1 wiederholt, egal wie viele Beiträge für diese Kategorie sind. Die Zählung zeigt nur 1, also sieht die Kategorie so aus: Kat. 1 (1), obwohl es tatsächlich mehr als das gibt. Irgendeine Idee, wie man die Anzahl für jede Variable speichert? Vielen Dank

    – Juan Rangel

    22. Juli 2015 um 6:52 Uhr

  • Ich habe die Antwort aktualisiert, es funktioniert jetzt, das einzige Problem ist, wenn die Abfrage paginiert ist, sind die Zählungen falsch. Ich muss eine benutzerdefinierte Abfrage ausführen, damit alle Posts korrekt gezählt werden. Ich werde eine generische Lösung hinzufügen

    – Pieter Goosen

    22. Juli 2015 um 16:59 Uhr


  • Fertig, die Abfrage sollte jetzt funktionieren. Nur eine Anmerkung, ich habe den übergeordneten Scheck entfernt. lass es mich wissen, wenn du das brauchst, damit ich es wieder hinzufügen kann 😉

    – Pieter Goosen

    22. Juli 2015 um 17:08 Uhr

  • Genial! Ich danke dir sehr. Ich musste arbeiten, bevor Sie Ihren Beitrag mit bearbeitet haben get_posts(). Ich schätze deine Hilfe sehr!

    – Juan Rangel

    22. Juli 2015 um 17:10 Uhr

  • Freut mich. Stellen Sie einfach sicher, dass Sie die hinzufügen fields Parameter in Ihrem Code, sonst wird die Abfrage sehr schwer 😉

    – Pieter Goosen

    22. Juli 2015 um 17:11 Uhr

1395750cookie-checkAbrufen der Kategorieanzahl relativ zur aktuellen Abfrage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy