Steamer Lane Studio技術備忘録WordPress

投稿内の特定のキーワードに指定のリンクを自動で貼るACF対応Ver

wordpress 投稿内の特定のキーワードに指定のリンクを自動で貼るACF対応Ver
作成日: 2025年1月16日

投稿内の特定のキーワードに指定のリンクを自動で貼るACF対応Ver以前作って変えて変えたもの、管理するポータルサイトで、the_contentだけでなくACFによるフィールドにも対応させる要ができたので修正した。

// 指定キーワードに対するリンクの自動挿入function my_autolink_keywords_in_paragraphs($content) {// 内部リンクのキーワードとページID$internal_keywords_and_ids = array('もりの' => 564,'くまさん' => 992,'うさぎさん' => 1780,'りすさん' => 1355,'きつねさん' => 489);

// 外部リンクのキーワードとURL$external_keywords_and_urls = array('外部リンク1' => 'https://ホゲモゲ.com/','外部リンク2' => 'https://モゲフガ.com');

// 除外キーワードのリスト$excluded_keywords = array('除外用1','除外用2');

// 処理をスキップするページID$excluded_page_ids = array(2330, 1354); // ここに処理を除外するページ=要はリンク先になるページ IDを追加

// 現在のページIDを取得$current_page_id = get_the_ID();

// 現在のページが内部リンクキーワードに対応するか、または除外対象のページIDかをチェックif (in_array($current_page_id, $excluded_page_ids)) {return $content;}

// プレースホルダーの準備$placeholders = [];

// <a>タグ内の内容をプレースホルダーに置き換え$content = preg_replace_callback('/<a\b[^>]*>(.*?)<\/a>/is', function($matches) use (&$placeholders) {$placeholder = '__PLACEHOLDER_' . count($placeholders) . '__';$placeholders[$placeholder] = $matches[0];return $placeholder;}, $content);

// ACFのフィールドを取得してフィルタリング$acf_fields = ['guide1', 'guide2', 'guide3', 'guide4', 'guide5', 'guide6', 'guide7', 'guide8', 'guide9', 'guide10']; // 対象のACFフィールド名を追加foreach ($acf_fields as $field) {$acf_content = get_field($field, $current_page_id); // ACFのフィールド内容を取得if ($acf_content) {$acf_content = my_autolink_keywords_process($acf_content, $internal_keywords_and_ids, $external_keywords_and_urls, $excluded_keywords);update_field($field, $acf_content, $current_page_id); // フィルタリング後の内容を更新}}

// <li>タグ内のフィルタリング$content = preg_replace_callback('/<li([^>]*)>(.*?)<\/li>/is', function($matches) use ($internal_keywords_and_ids, $external_keywords_and_urls, $excluded_keywords) {return '<li' . $matches[1] . '>' . my_autolink_keywords_process($matches[2], $internal_keywords_and_ids, $external_keywords_and_urls, $excluded_keywords) . '</li>';}, $content);

// <p>タグ内のフィルタリング$content = preg_replace_callback('/<p([^>]*)>(.*?)<\/p>/is', function($matches) use ($internal_keywords_and_ids, $external_keywords_and_urls, $excluded_keywords) {return '<p' . $matches[1] . '>' . my_autolink_keywords_process($matches[2], $internal_keywords_and_ids, $external_keywords_and_urls, $excluded_keywords) . '</p>';}, $content);

// プレースホルダーを元の<a>タグに戻す$content = str_replace(array_keys($placeholders), array_values($placeholders), $content);

return $content;}add_filter('the_content', 'my_autolink_keywords_in_paragraphs');

// コンテンツをフィルタリングするヘルパー関数function my_autolink_keywords_process($text, $internal_keywords_and_ids, $external_keywords_and_urls, $excluded_keywords) {// 除外キーワードが含まれているかチェックforeach ($excluded_keywords as $excluded_keyword) {if (strpos($text, $excluded_keyword) !== false) {return $text; // 除外キーワードが含まれている場合はそのまま返す}}

// 外部リンクのキーワードにリンクを適用foreach ($external_keywords_and_urls as $keyword => $url) {$keyword_escaped = preg_quote($keyword, '/');$pattern = '/(' . $keyword_escaped . ')(?![^<]*<\/a>)/u'; // <a>タグ内を除外$replacement = '<a href="' . esc_url($url) . '" class="totri">$1</a>';$text = preg_replace($pattern, $replacement, $text);}

// 内部リンクのキーワードにリンクを適用foreach ($internal_keywords_and_ids as $keyword => $page_id) {$url = get_permalink($page_id);$keyword_escaped = preg_quote($keyword, '/');$pattern = '/(' . $keyword_escaped . ')(?![^<]*<\/a>)/u'; // <a>タグ内を除外$replacement = '<a href="' . esc_url($url) . '" class="totri">$1</a>';$text = preg_replace($pattern, $replacement, $text);}

return $text;}

これで内部リンク拡充、内容によっては専門用語の解説に行きやすいから良いかも。