mysql-WordPress. Consulta SQL para obtener recuentos de publicaciones post_type personalizadas en la plantilla taxonomy.php

CorePress2024-01-25  8

En mi WordPress v5.7 tengo el siguiente código en mi plantilla taxonomy.php para obtener un recuento de publicaciones post_type personalizado en ese término de taxonomía.

// CURRENT TERM
$term = get_queried_object();

$bookArgs = array(
    'post_type' => 'book',
    'post_status' => 'publish', // get only publish posts
    'posts_per_page' => -1, // get all posts
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => $term->taxonomy,
            'field' => 'term_id',
            'terms' => $term->term_id
        )
    )
);
$total_book_arg = new WP_Query($bookArgs);
$total_book_count = $total_book_arg->post_count;

La consulta anterior hace el trabajo y me proporciona el recuento total de post_type personalizado publicado en el período actual.

Sin embargo, esta consulta parece obtener todos los datos de las publicaciones, solo para contar los números y tengo varias consultas en la misma página taxonomy.php para otros 4 post_type personalizados más.

Como se lee en alguna parte, una consulta SQL puede ahorrar mucho tiempo y mejorar el rendimiento, por lo que probé con la consulta SQL a continuación para obtener los mismos recuentos de post_type personalizados para el término en una plantilla taxonomy.php. (Tengo conocimientos mínimos de SQL).

El siguiente SQL parece no funcionar en términos de darme el recuento:

$SQLquery = "SELECT COUNT * FROM $wpdb->posts
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id IN ($term->term_id)
AND $wpdb->term_taxonomy.taxonomy = $term->taxonomy
AND $wpdb->posts.post_type = 'book'
AND $wpdb->posts.post_status = 'publish'";
echo $wpdb->get_var($SQLquery);

¿Cómo puedo hacer el Qu SQL anterior?¿Qué me funciona para obtener el recuento personalizado de post_type?

1

count * devolvería un error de sintaxis en cualquier versión de MySQL con la que esté familiarizado

- Fresa

28 de marzo de 2021 a las 6:14



------------------------------------

Pruebe esta consulta a continuación.

global $wpdb;

$SQLquery = "
    SELECT $wpdb->posts.ID FROM $wpdb->posts 
    LEFT JOIN $wpdb->term_relationships 
    ON ( $wpdb->posts.ID = $wpdb->term_relationships.object_id  ) 
    WHERE 1=1 
    AND ( $wpdb->term_relationships.term_taxonomy_id IN ( $term->term_id ) ) 
    AND $wpdb->posts.post_type = 'product' 
    AND ( ( $wpdb->posts.post_status = 'publish' ) ) 
    GROUP BY $wpdb->posts.ID ORDER BY $wpdb->posts.post_date DESC
";

$SQLqueryCount = $wpdb->get_results($SQLquery,ARRAY_A);
echo count($SQLqueryCount);

2

El recuento siempre muestra 1, incluso si hay muchas publicaciones.

- el Rey

28/03/2021 a las 11:22

$SQLquery ya está declarado arriba, he usado $SQLqueryCount más tarde

- el Rey

28/03/2021 a las 11:43



------------------------------------

Decir que las consultas SQL sonMejor y más rápido es un mito y una completa tontería. WP_query es solo un contenedor de parámetros, está diseñado para ser fácil de usar pero es, con diferencia, tan eficiente (incluso mejor) como una consulta SQL normal.

Es necesario utilizar los parámetros de la forma correcta. Hay una diferencia entre post_count y found_post.

post_count SÓLO devolverá publicaciones por página, es ineficiente y te obligará a cargar cada artículo primero para poder contarlos. Un escenario de caso de uso práctico serían los resultados por página en una página search.php. found_posts es lo que estás buscando; Obtendrá el recuento de publicaciones de su consulta asociada independientemente de la cantidad de publicaciones cargadas. Directamente de la mesa.

Una forma eficaz de corregir su consulta sería la siguiente:

<?php
if ( get_queried_object() instanceof \WP_Term ) {
    $args = array(
        'post_type' => 'book',
        get_queried_object()->taxonomy => get_queried_object()->slug,
    );
    $query = new WP_Query( $args );
    echo $query->found_posts;
    wp_reset_postdata();
};
?>
get_queried_object() instancia de \WP_TerComo estás en una página taxonomy.php, debes verificar si realmente es un objeto WP_Term. 'post_status' => "publicar" no es necesario; de forma predeterminada, está configurado en "publicar". puede simplificar una consulta de términos con $taxonomy => $término. wp_reset_postdata() es obligatorio. Evita que su consulta interfiera con la principal.

2

1

Gracias. Aunque la respuesta de @Bhautik es correcta para la pregunta que hice, termino usando tu código.

- el Rey

28/03/2021 a las 12:15

Dado que es un contenedor, no puede ser más eficiente que una consulta SQL sin formato (que al final lo es), solo puede ser peor y, a veces, se debe a que tiene que ajustarse a las limitaciones de la construcción del contenedor. - Picard

18 de febrero de 2022 a las 9:36

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare