繁体   English   中英

WordPress。 SQL 查询以获取分类中的自定义 post_type 帖子计数。php 模板

[英]WordPress. SQL Query to get custom post_type posts counts in taxonomy.php template

在我的 WordPress v5.7 中,我的taxonomy.php模板中有以下代码,以获取该分类术语中的自定义 post_type 帖子计数。

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

上面的查询完成了这项工作,并让我获得了当前学期发布的自定义 post_type 总数。

但是,此查询似乎获取了所有帖子数据,只是为了计算数字,并且我在同一个taxonomy.php中有多个查询。php 页面还有 4 个其他自定义 post_type。

正如在某处所读到的,SQL 查询可以节省大量时间和更好的性能,所以我尝试使用下面的 SQL 查询相同的自定义 post_type 对taxonomy.php中的术语计数。ZE1BFD762361E409CEEZ841CEE4AC0 (我的 SQL 技能非常少)。

下面的 SQL 在给我计数方面似乎不起作用:

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

在获取自定义 post_type 计数时,如何使上述 SQL 查询为我工作?

试试下面的查询。

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

说 SQL 查询更好更快是一个神话,完全是胡说八道。 WP_query只是一个参数包装器,它对用户友好,但它与常规的 SQL 查询一样有效(甚至更好)

您需要以正确的方式使用参数。 post_countfound_post之间存在差异

  • post_count只会返回每页的帖子,它效率低下,并且会迫使您首先加载每篇文章才能对它们进行计数。 一个实际的用例场景是search.php页面上的每页结果。
  • found_posts是您要查找的内容; 无论加载的帖子数量如何,它都会从您的关联查询中获取帖子计数。 直接从桌子上。

纠正查询的一种有效方法如下:

<?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() instanceof \WP_Term因为您在taxonomy.php .php 页面上,您应该检查它是否确实是WP_Term object。
  • 'post_status' => 'publish'不是必需的,默认情况下它设置为'publish'
  • 您可以使用$taxonomy => $term简化术语查询。
  • wp_reset_postdata()强制性的。 它可以防止您的查询与主要查询混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM