如何利用WordPress的`WP_Comment_Query`优化评论查询性能?

WordPress WP_Comment_Query 性能优化讲座

大家好!今天我们来深入探讨 WordPress 中 WP_Comment_Query 类的性能优化。评论系统是网站交互的重要组成部分,而高效的评论查询对于用户体验至关重要。WP_Comment_Query 提供了一种灵活的方式来检索评论,但如果不合理使用,可能会导致严重的性能问题。本次讲座将详细讲解如何利用 WP_Comment_Query 编写高效的评论查询,避免常见的性能陷阱。

1. WP_Comment_Query 简介

WP_Comment_Query 是 WordPress 提供的一个类,用于从数据库中检索评论。它提供了一系列参数,允许开发者根据各种条件(如评论作者、文章 ID、状态等)过滤和排序评论。与直接使用 $wpdb->get_results() 执行 SQL 查询相比,WP_Comment_Query 提供了更安全、更易于维护的代码,并利用了 WordPress 的缓存机制。

2. 基本用法示例

以下是一个简单的 WP_Comment_Query 用法示例:

<?php
$args = array(
    'post_id' => get_the_ID(), // 获取当前文章的 ID
    'status'  => 'approve',   // 只获取已批准的评论
);

$comments_query = new WP_Comment_Query( $args );

$comments = $comments_query->comments;

if ( $comments ) {
    echo '<ul>';
    foreach ( $comments as $comment ) {
        echo '<li>';
        echo get_comment_author_link( $comment->comment_ID ) . ': ';
        echo get_comment_text( $comment->comment_ID );
        echo '</li>';
    }
    echo '</ul>';
} else {
    echo '<p>没有评论。</p>';
}
?>

这段代码首先定义了一个 $args 数组,指定了查询条件:post_idstatus。然后,创建了一个 WP_Comment_Query 对象,并将 $args 传递给构造函数。最后,从 $comments_query->comments 属性中获取评论列表,并循环输出。

3. 影响性能的关键参数

WP_Comment_Query 提供了大量的参数,但某些参数对性能的影响远大于其他参数。了解这些关键参数并合理使用它们是优化评论查询性能的关键。

| 参数 | 描述 | 性能影响 | 优化建议 |
|—————|——————————————————————————————————————————————————————————————————————————————————————————————————————————————-|————-|—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-Rừngi, Jendela, Kamar tidur, 833, 1514, 1111.

3.1. comment__incomment__not_in

这两个参数允许你指定一个评论 ID 列表,用于包含或排除在查询结果中。虽然使用起来很方便,但它们通常会导致 MySQL 对 wp_comments 表进行全表扫描,尤其是在数据量大的情况下。

优化建议: 尽量避免使用 comment__incomment__not_in,如果必须使用,尽量减少列表中的 ID 数量。考虑使用其他更具体的参数进行过滤。 例如,可以先使用其他条件缩小搜索范围,然后再使用 comment__in 对结果进行二次筛选。

3.2. author_emailauthor_name, author_url

这些参数允许你根据评论作者的信息进行筛选。 虽然单个查询可能看起来很快,但在大量数据的情况下,对字符串字段进行搜索可能会很慢,特别是如果没有建立索引。

优化建议: 如果只需要根据作者信息进行查询,且查询频率很高,可以考虑在 wp_comments 表中为 comment_author_emailcomment_authorcomment_author_url 字段添加索引。 但要注意,增加索引会增加数据库的写操作负担。

3.3. date_query

date_query 允许你根据日期范围过滤评论。虽然它很灵活,但在某些情况下可能会导致性能问题。

优化建议: 尽量使用更简单的日期参数,例如 date(指定日期字符串)或 yearmonthday 等参数。 避免使用复杂的日期范围,特别是跨度很大的范围。

3.4. orderbyorder

orderby 参数指定了评论的排序方式,order 参数指定了排序顺序(ASC 或 DESC)。不同的排序方式对性能的影响不同。

优化建议: 默认情况下,WordPress 按照 comment_date_gmt 排序。 如果需要按照其他字段排序,如 comment_IDcomment_author, 尽量使用已建立索引的字段。 避免使用自定义字段进行排序,因为这通常需要进行额外的查询。

3.5. numberoffset

number 参数指定了要返回的评论数量,offset 参数指定了要跳过的评论数量。这两个参数通常用于分页。

优化建议: 虽然 numberoffset 是分页的常用方法,但当 offset 很大时,性能会显著下降。 因为 MySQL 需要先找到所有匹配的记录,然后跳过 offset 条记录,最后返回剩余的记录。 对于大型数据集,考虑使用基于游标的分页(cursor-based pagination),或者其他更高效的分页方法。 例如,可以记录上一页的最后一个评论的 ID 或日期,然后使用 comment_ID__gtdate_query 来获取下一页的评论。

4. WP_Comment_Query 的高级优化技巧

除了针对特定参数进行优化之外,还有一些更高级的技巧可以显著提升 WP_Comment_Query 的性能。

4.1. 利用缓存

WordPress 具有强大的缓存机制,可以缓存数据库查询结果。WP_Comment_Query 会自动利用 WordPress 的对象缓存,但前提是查询参数必须相同。因此,要确保在不同的页面或请求中,使用相同的查询参数来检索评论。

<?php
// 第一次查询
$args = array(
    'post_id' => 123,
    'status'  => 'approve',
    'number'  => 10,
);
$comments_query = new WP_Comment_Query( $args );
$comments1 = $comments_query->comments;

// 第二次查询,参数相同
$comments_query = new WP_Comment_Query( $args );
$comments2 = $comments_query->comments;

// 第二次查询会从缓存中读取结果,而不会再次执行数据库查询。
?>

4.2. 使用 fields 参数

fields 参数允许你指定要从数据库中检索哪些字段。默认情况下,WP_Comment_Query 会检索所有字段,但如果你只需要几个字段,可以显式地指定它们。

<?php
$args = array(
    'post_id' => 123,
    'fields'  => 'ids', // 只检索评论 ID
);

$comments_query = new WP_Comment_Query( $args );
$comment_ids = $comments_query->comments;

// 现在 $comment_ids 数组只包含评论 ID,而不是完整的评论对象。
?>

使用 fields 参数可以减少数据库的负载,并节省内存。 如果只需要评论 ID,或者只需要评论作者和日期,那么只检索这些字段就足够了。 常见的 fields 值包括:

  • ids: 只返回评论 ID。
  • id=>parent: 返回一个关联数组,键是评论 ID,值是父评论 ID。
  • all: 返回完整的评论对象(默认值)。

4.3. 避免 N+1 查询

N+1 查询是指在循环中执行数据库查询的情况。例如,如果你需要获取每个评论的作者信息,可能会在循环中调用 get_user_by() 函数。

<?php
$args = array(
    'post_id' => 123,
);

$comments_query = new WP_Comment_Query( $args );
$comments = $comments_query->comments;

if ( $comments ) {
    foreach ( $comments as $comment ) {
        $author = get_user_by( 'id', $comment->user_id ); // 每次循环都会执行数据库查询
        echo $author->display_name;
    }
}
?>

这种做法会导致大量的数据库查询,严重影响性能。 为了避免 N+1 查询,可以使用 WP_User_Query 一次性获取所有评论作者的信息。

<?php
$args = array(
    'post_id' => 123,
);

$comments_query = new WP_Comment_Query( $args );
$comments = $comments_query->comments;

if ( $comments ) {
    $user_ids = array_unique( array_map( function ( $comment ) {
        return $comment->user_id;
    }, $comments ) );

    $user_query = new WP_User_Query( array( 'include' => $user_ids ) );
    $users = $user_query->get_results();

    $user_map = array();
    foreach ( $users as $user ) {
        $user_map[ $user->ID ] = $user;
    }

    foreach ( $comments as $comment ) {
        if ( isset( $user_map[ $comment->user_id ] ) ) {
            echo $user_map[ $comment->user_id ]->display_name;
        }
    }
}
?>

这段代码首先获取所有评论作者的 ID,并使用 array_unique() 去重。然后,使用 WP_User_Query 一次性获取所有作者的信息,并将结果存储在一个关联数组中。最后,在循环中从关联数组中获取作者信息,避免了 N+1 查询。

4.4. 使用原生 SQL 查询(谨慎使用)

在某些情况下,WP_Comment_Query 可能无法满足所有的需求,或者性能不是最佳。在这种情况下,可以考虑使用 $wpdb->get_results() 执行原生 SQL 查询。 但是,使用原生 SQL 查询需要非常小心,以避免 SQL 注入和其他安全问题。

<?php
global $wpdb;

$post_id = 123;
$status = 'approve';

$sql = $wpdb->prepare(
    "SELECT * FROM {$wpdb->comments} WHERE comment_post_ID = %d AND comment_approved = %s",
    $post_id,
    $status
);

$comments = $wpdb->get_results( $sql );

if ( $comments ) {
    foreach ( $comments as $comment ) {
        echo $comment->comment_content;
    }
}
?>

这段代码使用 $wpdb->prepare() 函数来构建 SQL 查询,以防止 SQL 注入。 在使用原生 SQL 查询时,要确保对所有输入进行验证和转义。 此外,需要手动处理缓存,以避免重复查询。 因此,建议只在确实需要的情况下才使用原生 SQL 查询。

5. 性能测试和监控

优化 WP_Comment_Query 的性能之后,需要进行性能测试和监控,以确保优化效果达到预期。

  • 使用 WordPress 插件: 可以使用 Query Monitor 等 WordPress 插件来监控数据库查询的性能,并识别慢查询。
  • 使用 Web 服务器日志: 可以分析 Web 服务器的日志,查找执行时间长的请求。
  • 使用性能分析工具: 可以使用 Xdebug 等性能分析工具来分析 PHP 代码的性能,并找出瓶颈。

定期进行性能测试和监控,可以及时发现和解决性能问题,确保网站的稳定性和性能。

6. 案例分析:优化评论分页

假设一个网站的文章有很多评论,使用默认的分页方式会导致性能问题。以下是一个优化评论分页的案例分析。

问题:

使用 numberoffset 参数进行评论分页,当 offset 很大时,性能会显著下降。

解决方案:

使用基于评论 ID 的游标分页。

代码示例:

<?php
function get_paged_comments( $post_id, $per_page = 10, $last_comment_id = 0 ) {
    $args = array(
        'post_id'         => $post_id,
        'status'          => 'approve',
        'number'          => $per_page,
        'orderby'         => 'comment_ID',
        'order'           => 'ASC',
        'comment_ID__gt'  => $last_comment_id, // 只获取 ID 大于 $last_comment_id 的评论
    );

    $comments_query = new WP_Comment_Query( $args );
    $comments = $comments_query->comments;

    return $comments;
}

// 使用示例:
$post_id = get_the_ID();
$per_page = 10;
$last_comment_id = isset( $_GET['last_comment_id'] ) ? intval( $_GET['last_comment_id'] ) : 0; // 从 URL 参数中获取 last_comment_id

$comments = get_paged_comments( $post_id, $per_page, $last_comment_id );

if ( $comments ) {
    echo '<ul>';
    foreach ( $comments as $comment ) {
        echo '<li>';
        echo get_comment_author_link( $comment->comment_ID ) . ': ';
        echo get_comment_text( $comment->comment_ID );
        echo '</li>';
    }
    echo '</ul>';

    // 获取下一页的 last_comment_id
    $last_comment = end( $comments );
    $next_last_comment_id = $last_comment->comment_ID;

    // 生成下一页的 URL
    $next_page_url = add_query_arg( 'last_comment_id', $next_last_comment_id, get_permalink( $post_id ) );

    echo '<a href="' . esc_url( $next_page_url ) . '">下一页</a>';
} else {
    echo '<p>没有更多评论。</p>';
}
?>

这段代码使用 comment_ID__gt 参数来获取 ID 大于 $last_comment_id 的评论。 $last_comment_id 从 URL 参数中获取,表示上一页最后一个评论的 ID。 这样,每次查询只需要获取指定数量的评论,而不需要跳过大量的记录,从而提高了性能。

7. 结合 Transients API 缓存评论片段

如果评论内容变化不频繁,可以使用 WordPress Transients API 缓存评论片段,进一步提高性能。

<?php
function get_cached_comments( $post_id ) {
    $transient_key = 'comments_' . $post_id;
    $comments_html = get_transient( $transient_key );

    if ( false === $comments_html ) {
        // 没有缓存,则生成评论 HTML
        $args = array(
            'post_id' => $post_id,
            'status'  => 'approve',
        );

        $comments_query = new WP_Comment_Query( $args );
        $comments = $comments_query->comments;

        $comments_html = '<ul>';
        foreach ( $comments as $comment ) {
            $comments_html .= '<li>';
            $comments_html .= get_comment_author_link( $comment->comment_ID ) . ': ';
            $comments_html .= get_comment_text( $comment->comment_ID );
            $comments_html .= '</li>';
        }
        $comments_html .= '</ul>';

        // 缓存评论 HTML,有效期为 1 小时
        set_transient( $transient_key, $comments_html, 3600 );
    }

    return $comments_html;
}

// 使用示例:
$post_id = get_the_ID();
echo get_cached_comments( $post_id );

// 在评论提交、更新或删除时,需要删除缓存
add_action( 'comment_post', 'delete_comments_cache' );
add_action( 'edit_comment', 'delete_comments_cache' );
add_action( 'delete_comment', 'delete_comments_cache' );

function delete_comments_cache( $comment_id ) {
    $comment = get_comment( $comment_id );
    $post_id = $comment->comment_post_ID;
    $transient_key = 'comments_' . $post_id;
    delete_transient( $transient_key );
}
?>

这段代码使用 Transients API 缓存评论的 HTML 代码。 如果缓存存在,则直接从缓存中读取,否则生成评论 HTML 并缓存。 在评论提交、更新或删除时,需要删除缓存,以便下次访问时重新生成。

8. 总结:选择合适的查询策略,优化数据库操作

本次讲座我们深入探讨了 WP_Comment_Query 的性能优化。 关键在于了解哪些参数影响性能,如何合理使用这些参数,以及如何利用缓存、避免 N+1 查询等高级技巧。 通过采取这些优化措施,可以显著提升 WordPress 评论系统的性能,改善用户体验。 记住,优化是一个持续的过程,需要根据实际情况不断调整和改进。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注