- WordPressの投稿文字数を日々集計し、データベースに保存するプラグインを作成しています。
- 従来は集計画面表示時のみ実行されていた処理を、記事保存時に自動実行するように改善しました。
- 下書き保存時の処理は負荷を考慮して省略し、公開・更新・削除時のみ実行する仕様としました。
1. 日ごとの投稿文字数を集計
自作プラグインには、以下のようなコードで、日ごとの投稿文字数を集計しています。
/**
* 投稿の文字数を集計してデータベースに保存する関数
* 毎日の文字数と、前回からの差分を記録する
*/
function add_count_to_db() {
// 全投稿の文字数を計算
$count = calc_total_post_characters();
// WordPressのデータベース操作用のグローバル変数
global $wpdb;
// 保存先のテーブル名を設定
$table_name = CHIILABO_COUNT_TABLE_NAME;
// タイムゾーンを東京に設定
date_default_timezone_set('Asia/Tokyo');
// 今日の日付を取得(時刻は00:00:00形式)
$date = date("Y-m-d H-i-s", strtotime("today"));
// 同じ日付のデータが存在する場合は削除
$delete_result = $wpdb->query($wpdb->prepare("DELETE FROM $table_name WHERE date = %s", $date));
if ($delete_result === false) {
// 削除に失敗した場合はエラーログを記録
error_log("Failed to delete existing entry: " . $wpdb->last_error);
}
// 最新のデータを取得(差分計算用)
$results = $wpdb->get_results($wpdb->prepare("SELECT date, count, diff FROM $table_name ORDER BY date DESC LIMIT 1"));
// 前回との差分を計算
$diff = 0;
if (!empty($results)) {
// 過去のデータが存在する場合、前回の文字数との差分を計算
$diff = $count - $results[0]->count;
}
// 新しいデータを挿入
$insert_result = $wpdb->insert(
$table_name,
array(
'date' => $date, // 日付
'count' => $count, // 総文字数
'diff' => $diff, // 差分
),
array('%s', '%d', '%d') // データ型の指定(文字列、数値、数値)
);
if ($insert_result === false) {
// 挿入に失敗した場合はエラーログを記録
error_log("Failed to insert new entry: " . $wpdb->last_error);
}
}
これまで、この処理は集計結果画面を表示したときに実行していました。
そのため、記事を更新しても結果を確認していないと、その日の文字数に記録されず翌日にまとめて記録されることがありました。
![日ごとの投稿文字数を集計](https://chiilabo.com/wp-content/uploads/2025/02/ScreenShot-2025-02-12-8.56.04.png)
![日ごとの投稿文字数を集計](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
0の次の日に急に2倍になるのは、「記録漏れ」が理由です。
2. 記事保存時に総文字数をカウント
その誤差をなくすため、いちいち記録されているか意識するのも面倒です。
そこで、記事保存時に総文字数をカウントしてデータベースに記録する処理を追加してみました。
/**
* 2025-02-12 記事の保存時に文字数カウントを更新する処理を追加
*/
function init_post_count_hooks() {
// 投稿を公開した時
add_action('publish_post', 'handle_post_saved');
// 投稿を更新した時
add_action('post_updated', 'handle_post_saved');
// 投稿を下書き保存した時
// これは頻度が多くなりすぎるかも。
//add_action('save_post', 'handle_post_saved');
// 投稿を削除した時
add_action('delete_post', 'handle_post_saved');
}
/**
* 記事保存時の処理をハンドリング
*
* @param int $post_id 投稿ID
*/
function handle_post_saved($post_id) {
// リビジョンの場合はスキップ
if (wp_is_post_revision($post_id)) {
return;
}
// 自動保存の場合はスキップ
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// 権限チェック
if (!current_user_can('edit_post', $post_id)) {
return;
}
// 文字数を集計してDBに保存
add_count_to_db();
}
// フックの初期化
add_action('init', 'init_post_count_hooks');
![記事保存時に総文字数をカウント](https://chiilabo.com/wp-content/uploads/2020/09/instructor-m.png)
投稿を下書き保存した時は、頻度が多くて処理が重くなりすぎるので省略しました。
こちらもどうぞ。
![[WordPress] 自作プラグインに投稿文字数を計測するスクリプトを追加した【dbDelta】](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iMTk4IiB2aWV3Qm94PSIwIDAgMzIwIDE5OCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==)
![WordPressのカスタムプラグインのエラー(get_postsのメモリ不足)](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iMTk4IiB2aWV3Qm94PSIwIDAgMzIwIDE5OCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==)
![WordPressカスタムプラグインに日毎のPVを表示する機能を追加した](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iMTk4IiB2aWV3Qm94PSIwIDAgMzIwIDE5OCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==)
![[WordPress] 投稿月でグループ分けした月別PV集計表を見るためのカスタムプラグインを作った【ChatGPTと】](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iMTk4IiB2aWV3Qm94PSIwIDAgMzIwIDE5OCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==)
![[WordPress] 自作プラグインに投稿文字数を計測するスクリプトを追加した【dbDelta】](https://chiilabo.com/wp-content/uploads/2023/05/image-3-16-320x198.jpg)
[WordPress] 自作プラグインに投稿文字数を計測するスクリプトを追加した【dbDelta】
自作 WordPressプラグインに、一日の投稿文字数をカウントする機能を追加しました。大まかな処理の流れはプラグインの有効化時に投稿文字数カウント用のデータベースを作成するプラグイン表示時に、累計の投稿文字数を追加する(ただし、同じ日付のデータがあれば更新する)管理メニューでデータベース集計を表形式で表示する一日の成果を文字数で把握できると、ちょっとモチベーションアップになるかも?前回はこちら。データベースの作成(dbDelta)一番手間取ったのは、データベースを作成する処...
![WordPressのカスタムプラグインのエラー(get_postsのメモリ不足)](https://chiilabo.com/wp-content/uploads/2024/07/image-21-5-320x198.jpg)
WordPressのカスタムプラグインのエラー(get_postsのメモリ不足)
自作プラグインが動かなくなった原因は、サーバー処理のメモリ不足でした。 $posts = get_posts( array( 'post_type' => 'post', 'post_status' => array( 'publish', 'pending', 'draft', 'future'), 'orderby' => 'modified', /* date, modified */ 'numberposts' => -1 ) ); $count = 0; forea...
![WordPressカスタムプラグインに日毎のPVを表示する機能を追加した](https://chiilabo.com/wp-content/uploads/2024/05/image-8-9-320x198.jpg)
WordPressカスタムプラグインに日毎のPVを表示する機能を追加した
WordPressプラグインに日毎のPVを表示する機能を追加しました。add_menuを追加自作のカスタムプラグインを使っています。今回は、そのプラグインに機能を追加します。※以前にプラグインを作成したのは、こちら。まず、新しいサブメニューページを chiilabo_stats_admin_menu関数内のadd_menu_page関数の引数に追加しました。add_submenu_page( 'chiilabo-stats', // 親メニューのスラッグ '日別PV', '日...
![[WordPress] 投稿月でグループ分けした月別PV集計表を見るためのカスタムプラグインを作った【ChatGPTと】](https://chiilabo.com/wp-content/uploads/2023/03/image-23-26-320x198.jpg)
[WordPress] 投稿月でグループ分けした月別PV集計表を見るためのカスタムプラグインを作った【ChatGPTと】
一ヶ月分のブログ公開がどれぐらいのページビューにつながっているのか、集計する自分用のWordPressプラグインを作成しました。自分にとっては未経験の分野でしたが、対話型AI「ChatGPT」に相談してみると、使える叩き台を用意してくれました。WordPressプラグインづくりははじめてでしたが、かなりの時間短縮。無事に完成しました。アクセス集計プラグイン一ヶ月分のブログ公開が、どれぐらいの成果になっているのか知りたいことがあります。これまでは、Google Analytic...
QRコードを読み込むと、関連記事を確認できます。
![[WordPress]カスタムプラグインで投稿文字数の自動集計機能を追加した](https://api.qrserver.com/v1/create-qr-code/?data=?size=200x200&data=https%3A%2F%2Fchiilabo.com%2F2025-02%2Fwordpress-custom-plugin-post-character-count-hook%2F)