Obtenga el recuento de categorías en relación con la consulta actual

5 minutos de lectura

avatar de usuario
Juan Rangel

Estoy usando WordPress y en la página de búsqueda necesito tomar la cantidad de publicaciones dentro de la categoría y mostrarla junto al nombre. Al igual que

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

Actualmente estoy usando el get_categories() funciones que te dan un objeto y agarrar el conteo con $cat->count(). Esto toma la cantidad total de publicaciones dentro del término, pero necesito tomar ese recuento solo de la publicación dentro de la consulta actual. estoy usando pre_get_posts para actualizar la consulta. ¿Alguien sabe de una manera de hacer esto?

Aquí está mi bloque de código actual

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

Aquí está mi pre_get_posts acción:

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

  • Mi respuesta no funcionará, necesito hacerle un par de ajustes. Desafortunadamente no puedo hacer eso ahora. Verá esto un poco más tarde. Te mantendré actualizado. Mientras tanto, agregue su pre_get_posts acción por la que filtra la consulta de búsqueda, esto es importante para mi respuesta

    – Pieter Goosen

    22 de julio de 2015 a las 7:19

  • Comprender completamente. Gracias por su aporte.

    – Juan Rangel

    22 de julio de 2015 a las 16:44

  • Estoy ocupado arreglando todo. Solo esperando tu pre_get_posts acción

    – Pieter Goosen

    22 de julio de 2015 a las 16:51

  • Acabo de actualizar mi pregunta. Gracias por tu ayuda.

    – Juan Rangel

    22 de julio de 2015 a las 16:59

  • OK, incorporaré eso ahora para arreglar cuentas 😉

    – Pieter Goosen

    22/07/2015 a las 17:00

avatar de usuario
pieter goosen

Pregunta agradable e interesante debe decir. Desafortunadamente, no vas a hacer que esto funcione con get_categoriespor lo que necesitará otro enfoque aquí.

Así es como lo haremos:

  • Cree una consulta personalizada muy sencilla para obtener todos los ID de publicación de todas las publicaciones que coincidan con la consulta

  • Obtener todas las categorías adjuntas a una publicación

  • Recorra todas las publicaciones y las categorías dentro de las publicaciones y cree una matriz con los nombres de categoría como claves y las ID de publicación como valores

  • Recorra esta nueva matriz y muestre el nombre de la categoría y también cuente y muestre la cantidad de publicaciones para esa clave específica (categoría)

EL CÓDIGO:

(NOTA: El siguiente código no está probado y necesita al menos PHP 5.4+ debido a la nueva sintaxis de matriz ([]))

$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

  • Hola Pieter, acabo de ver esta respuesta. Gracias por tomarse el tiempo para escribirlo. Me ha puesto en el camino correcto. Todavía tengo un problema con el conteo. Si yo var_dump($v); Obtengo el número 1 repetido sin importar cuántas publicaciones haya para esa categoría. El recuento solo muestra 1, por lo que la categoría se ve así: Cat 1 (1) cuando en realidad hay más que eso. ¿Alguna idea de cómo almacenar el recuento de cada variable? Gracias

    – Juan Rangel

    22 de julio de 2015 a las 6:52

  • Actualicé la respuesta, está funcionando ahora, el único problema es que si la consulta está paginada, los recuentos son incorrectos. Tendré que ejecutar una consulta personalizada para que todas las publicaciones ejecuten el conteo correctamente. Agregaré una solución genérica.

    – Pieter Goosen

    22 de julio de 2015 a las 16:59


  • Listo, la consulta ahora debería funcionar. Solo una nota, eliminé el control principal. avísame si necesitas esto para que pueda volver a agregarlo 😉

    – Pieter Goosen

    22 de julio de 2015 a las 17:08

  • ¡Impresionante! Muchas gracias. Me puse a trabajar antes de que editaras tu publicación usando get_posts(). ¡Realmente aprecio tu ayuda!

    – Juan Rangel

    22 de julio de 2015 a las 17:10

  • Mi placer. Sólo asegúrese de agregar el fields parámetro en su código, de lo contrario, la consulta se vuelve muy pesada 😉

    – Pieter Goosen

    22 de julio de 2015 a las 17:11

¿Ha sido útil esta solución?