コメント承認時にbcacheをクリアする方法

TOP Forums 使い方全般(Fixing KUSANAGI) コメント承認時にbcacheをクリアする方法

コメント承認時にbcacheをクリアする方法

Viewing 3 reply threads
  • Author
    Posts
    • #1561
      even-eleven
      Participant

        ページに対してコメントが投稿され、更にそれが承認されたタイミングでそのページのみbcacheをクリアしたいのですが、なにかやり方はありますでしょうか?
        ご存じの場合、教えて頂けるとありがたいです。
        ※現状ですと、ページが「公開」や「更新」された場合のみbcacheがクリアされる仕様と拝見していますが、勘違いだったらすみません
        page-cache.php
        > add_action( 'transition_post_status', array( $this, 'post_publish_clear_cache' ), 10, 3 );

        背景としては、負荷軽減のためにbcacheの期限を長めにとりたいのですが、そうするとキャッシュ更新時までコメント反映が遅れるため、bcache期限を長くしつつ、コメント承認時にキャッシュをクリアしてコメント表示もリアルタイムにしたいと考えております。
        またコメントは自動承認にしていますが、スパムコメントも結構きてAkismetが捕獲してくれているので、「コメント投稿時」でなく、「コメント承認時」にキャッシュクリアしたいと考えております。

        kusanagi status
        KUSANAGI Version 9.6.13-1.el9
        conoha
        CentOS Stream 9

        *** (active) nginx : nginx127 ***
        * nginx127.service - The NGINX HTTP and reverse proxy server
        Loaded: loaded (/usr/lib/systemd/system/nginx127.service; enabled; preset: disabled)
        Active: active (running) since Sat 2025-08-02 22:03:12 JST; 44min ago

        *** (inactive) httpd : httpd24 ***
        * httpd.service - The Apache HTTP Server
        Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
        Active: inactive (dead)

        *** (active) php : php83 ***
        * php-fpm.service - The PHP FastCGI Process Manager
        Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled)
        Active: active (running) since Sat 2025-08-02 22:03:13 JST; 44min ago

        *** (active) mariadb : mariadb10.5 ***
        * mariadb.service - MariaDB 10.5.29 database server
        Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled)
        Active: active (running) since Fri 2025-08-01 08:40:45 JST; 1 day 14h ago

        *** (inactive) psql : ***

        *** (inactive) pgpool-II : ***

        *** python ***
        Python 3.9.23

        *** Cache status ***

        *** WAF ***
        on

        *** SELinux ***
        off

        status completed.

      • #1562
        katakura
        Participant

          こんにちは、 even-eleven さん。

          bcache on の状態で、コメントが承認されたタイミングにキャッシュクリアしたい場合は、以下のコードをテーマの functions.php に組み込んでみてください。

          
          add_action( 'comment_approved_comment', 'my_clear_single_cache', 10, 2 );    
          function my_clear_single_cache( $comment_id, $comment ) {
                  global $cache_db;
           
                  $regexes = get_option( 'sitemanager_device_rules', array() );
                  $groups  = array_keys( $regexes );
                  $groups  = array_merge( array( '' ), $groups );
           
                  $permalink = get_permalink( $comment->comment_post_ID );
                  $permalink = parse_url( $permalink );
                  $path      = $permalink['path'];
                  if ( isset( $permalink['query'] ) && $permalink['query'] ) {
                      $path .= '?' . $permalink['query'];
                  }
           
                  $hashes = array();
                  foreach ( $groups as $group ) {
                      $device_url = array(
                          $group,
                          $permalink['scheme'],
                          $permalink['host'],
                          $path,
                      );
                      $device_url = implode( '|', $device_url );
                      $hashes[]   = md5( $device_url );
                  }
                  $hashes = implode( "', '", $hashes );
           
                  $sql = "
          DELETE
          FROM    <code>{$cache_db->prefix}site_cache</code>
          WHERE   <code>type</code> = 'single'
          AND     <code>hash</code> IN ( '{$hashes}' )
          ";
                  $cache_db->query( $sql );
          }
          
        • #1563
          even-eleven
          Participant

            katakuraさん
            教えて頂いて、ありがとうございます!
            早速、時間がある次の土日に試させていただきます。

          • #1564
            even-eleven
            Participant

              無事にbcacheをクリアすることができました。
              ありがとうございます。
              DBでキャッシュがクリアされることも確認しまして、問題なく動いております。
              1点、知らなかったのですが、コメントを自動承認しているとcomment_approved_commentが発生せず、承認状態でcomment_postだけ発生するようでして、comment_postを拾った上で承認済みかチェックする形になりました。

              add_action( 'comment_post', 'my_clear_single_cache', 10, 2 );
              function my_clear_single_cache( $comment_id, $comment_approved ) {
              if ( 1 !== $comment_approved ) {
              return;
              }
              $comment = get_comment( $comment_id );
              if ( ! $comment ) {
              return;
              }

              $post_id = $comment->comment_post_ID;

              global $cache_db;
              if ( ! is_object( $cache_db ) || ! method_exists( $cache_db, 'prepare' ) ) {
              error_log( 'KUSANAGI bcache clear: cache_db object not available. Cannot clear bcache for comment_id: ' . $comment_id );
              return;
              }

              $regexes = get_option( 'sitemanager_device_rules', array() );
              $groups = array_keys( $regexes );
              $groups = array_merge( array( '' ), $groups );

              $url = get_permalink( $post_id );
              $permalink = parse_url( $url );
              if ( ! $permalink || ! isset( $permalink['path'], $permalink['scheme'], $permalink['host'] ) ) {
              error_log('Failed to parse permalink or missing components for comment_id: ' . $comment_id);
              return;
              }

              $path = $permalink['path'];
              if ( isset( $permalink['query'] ) && $permalink['query'] ) {
              $path .= '?' . $permalink['query'];
              }

              $hashes = array();
              foreach ( $groups as $group ) {
              $device_url = array(
              $group,
              $permalink['scheme'],
              $permalink['host'],
              $path,
              );
              $device_url = implode( '|', $device_url );
              $hashes[] = md5( $device_url );
              }

              if ( empty( $hashes ) ) {
              return;
              }

              $placeholders = implode( ', ', array_fill( 0, count( $hashes ), '%s' ) );
              $sql = $cache_db->prepare(
              "DELETE FROM {$cache_db->prefix}site_cache WHERE type = 'single' AND hash IN ( $placeholders )",
              $hashes
              );

              if ( $sql ) {
              $cache_db->query( $sql );
              }

              }

          Viewing 3 reply threads
          • You must be logged in to reply to this topic.

          Next article

          フォーラムについて