まずは config.php(htmlディレクトリの中)で define('WP_DEBUG', false); の false を true に変える
以下を、function.phpに貼り付ける。
add_filter('wp_insert_post_data', function($data, $postarr) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $data;
$current_post_id = $postarr['ID'];
$content = $data['post_content'];
$upload_dir = wp_upload_dir();
$csv_path = $upload_dir['basedir'] . '/test_api/link/test.csv';
// --- 【ここからデバッグ用ログ出力】 ---
error_log("--- Link Replace Debug Start (Post ID: $current_post_id) ---");
error_log("Expected CSV path: " . $csv_path);
if (!file_exists($csv_path)) {
error_log("RESULT: File NOT FOUND. (パスが間違っているか、ファイルがありません)");
} else {
error_log("RESULT: File EXISTS. (ファイルは見つかりました)");
if (($handle = fopen($csv_path, "r")) !== FALSE) {
fgetcsv($handle); // ヘッダー読み飛ばし
$found_match = false;
while (($csv_row = fgetcsv($handle)) !== FALSE) {
$target_id = trim($csv_row[0]);
if ($current_post_id == $target_id) {
error_log("RESULT: MATCH FOUND! ID $target_id is in CSV.");
$found_match = true;
// 置換処理の実行(ログ付き)
$keyword = trim($csv_row[1], " \t\n\r\0\x0B\xEF\xBB\xBF\"");
$link_url = trim($csv_row[2]);
if (strpos($content, $link_url) === false) {
$link_html = '<a href="' . esc_url($link_url) . '">' . esc_html($keyword) . '</a>';
$new_content = preg_replace('/' . preg_quote($keyword, '/') . '/u', $link_html, $content, 1);
if ($new_content !== $content) {
$content = $new_content;
error_log("RESULT: Successfully replaced keyword with link.");
} else {
error_log("RESULT: Keyword '$keyword' not found in post content.");
}
} else {
error_log("RESULT: Link already exists. Skipping.");
}
}
}
if (!$found_match) error_log("RESULT: This Post ID was not found in the CSV rows.");
fclose($handle);
} else {
error_log("RESULT: Permission Denied. Could not open the file.");
}
}
error_log("--- Debug End ---");
// --- 【デバッグ用ログ出力ここまで】 ---
$data['post_content'] = $content;
return $data;
}, 10, 2);
もしdegug.log が出力されていない場合、画面に直接表示させると確実。
wp-config.php の設定を少しだけ変える。
define( 'WP_DEBUG_DISPLAY', true ); に変更(falseからtrueへ)
プログラムが動かない原因が「エラー」ではなく、単に**「条件に合致しなくてスルーされているだけ」**の場合、画面には何も表示されません。
そのため、検証する際は以下の**「3つのパターン」**のどれになるかを確認してください。
パターンA:画面に「Notice」や「Error」が出る
今の状態で「記事を更新」したとき、先ほどの画像のような英語のメッセージが新しく増えていれば、それがヒントになります。
パターンB:画面には何も出ず、普通に更新が終わる
これが一番厄介です。「プログラムは動いたけれど、置換する条件(IDが一致するなど)を満たさなかった」という状態です。
対策: wp_die() を使い、強制的に結果を表示させる必要があります。
パターンC:画面が真っ白になる
「致命的なエラー(Fatal Error)」が起きています。
対策: WP_DEBUG が true なら、必ず原因(「○○行目が間違っている」など)が表示されます。
「確実な検証コード」
今の functions.php のコードを、以下のように**「成功しても失敗しても、画面に大きな文字で結果を表示する」**形に書き換えて「更新」ボタンを押す。
PHP
add_filter('wp_insert_post_data', function($data, $postarr) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $data;
$current_post_id = $postarr['ID'];
$upload_dir = wp_upload_dir();
$csv_path = $upload_dir['basedir'] . '/test_api/link/test.csv';
// --- 【ここから強制表示デバッグ】 ---
$debug_msg = "<h3>検証開始 (Post ID: $current_post_id)</h3>";
$debug_msg .= "探しているパス: <code>$csv_path</code><br>";
if (!file_exists($csv_path)) {
$debug_msg .= "<b style='color:red;'>結果: CSVファイルが存在しません!</b>";
} else {
$debug_msg .= "<b style='color:green;'>結果: CSVファイルは見つかりました。</b><br>";
// CSVの中身を確認
if (($handle = fopen($csv_path, "r")) !== FALSE) {
fgetcsv($handle); // 見出し
$found = false;
while (($row = fgetcsv($handle)) !== FALSE) {
if (trim($row[0]) == $current_post_id) {
$found = true;
$debug_msg .= "一いた!CSV内のキーワード: " . $row[1];
break;
}
}
if (!$found) $debug_msg .= "結果: CSVの中にこの投稿ID($current_post_id)は見つかりませんでした。";
fclose($handle);
}
}
// 画面にこのメッセージを叩きつけて処理を止める
wp_die($debug_msg);
// --- 【ここまで】 ---
return $data;
}, 10, 2);
このコードでわかること
この記事を「更新」した瞬間、通常の画面ではなく真っ白な背景に上のメッセージだけが出ます。
- 「CSVファイルが存在しません」 と出た場合
⇒ FTPで見ている場所と、WordPressが認識している場所が違います。 - 「投稿IDは見つかりませんでした」 と出た場合
⇒ CSVのID列に、余計なスペースや全角文字が入っている可能性があります。
これなら、debug.log が出なくても、100%原因が特定できます。