wordpress
投稿内の特定のキーワードに指定のリンクを自動で貼るACF対応Ver
作成日: 2025年1月16日
以前作って変えて変えたもの、管理するポータルサイトで、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;
}
これで内部リンク拡充、内容によっては専門用語の解説に行きやすいから良いかも。