コメント承認時にbcacheをクリアする方法
TOP › Forums › 使い方全般(Fixing KUSANAGI) › コメント承認時にbcacheをクリアする方法
コメント承認時にbcacheをクリアする方法
- This topic has 3 replies, 2 voices, and was last updated 4 days, 16 hours ago by
even-eleven.
-
AuthorPosts
-
-
2025年8月2日 at 22:58 #1561
ページに対してコメントが投稿され、更にそれが承認されたタイミングでそのページのみ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 ***
offstatus completed.
-
2025年8月12日 at 16:52 #1562
こんにちは、 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 ); }
-
2025年8月13日 at 00:14 #1563
katakuraさん
教えて頂いて、ありがとうございます!
早速、時間がある次の土日に試させていただきます。 -
2025年8月19日 at 00:24 #1564
無事に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
WHEREtype
= 'single' ANDhash
IN ( $placeholders )",
$hashes
);if ( $sql ) {
$cache_db->query( $sql );
}}
-
-
AuthorPosts
- You must be logged in to reply to this topic.