こんにちは「ai」です。
投稿本文の中に設置した内部リンクを記事下に自動挿入する方法です。
本文途中に気になるリンクがあったとき、現在のページを読み終えてからリンクの箇所に戻るのは面倒くさいと考えて作成しました。
紹介したリンクを記事下にまとめて表示することで、記事を読み終えた流れで関連ページに遷移して貰うことを期待しています。
WordPressのfunctions.phpに記載して使用します。
内部リンクを記事下に自動挿入するコード
///////////////////////////////////////
// 記事中で紹介した内部リンクを記事下に挿入
///////////////////////////////////////
function add_related_page($the_content){
// 投稿ページ
if(is_single()){
// 自サイトのドメイン
$my_domain = 'sakuraorange.minibird.jp';
// 自サイトのドメイン内の特殊文字をエスケープ
$my_domain = preg_quote($my_domain, '/');
// 内部リンクのパターンとして正規表現とドメイン文字列を結合
$link_style = '/<a href="https*:\/\/'.$my_domain.'.*?<\/a>/is';
// 内部リンクのパターンが本文中にあるか検索して$internal_linkに多次元配列で格納
preg_match_all($link_style, $the_content, $internal_link);
// 取得した内部リンクに同一のものが複数ある場合は重複を削除
$unique_link = array_unique($internal_link[0], SORT_REGULAR);
// 画像リンクと重複削除後に空となった要素を除外する
$unique_link = array_filter($unique_link, function($unique_link){
if(strpos($unique_link, 'img src') !== false){
return false;
}else{
return true;
}
});
// 要素の削除された配列の添え字を振り直す
$unique_link = array_values($unique_link);
// 重複のない内部リンクの数として配列の要素数を取得
$link_count = count($unique_link);
// 内部リンクの数がゼロではなければ実行
if($link_count){
// 内部リンクの内容が格納されていれば実行
if($unique_link){
// 挿入する内部リンク用の変数に初期値としてH3見出しを設定
$link_tag = "\n<h3>ページ本文で紹介した記事</h3>";
// 配列内の内部リンク数分ループして追記用の変数に連結
foreach($unique_link as $value){
$link_tag .= "\n".$value;
}
// 本文の最後に作成した内部リンクの一覧を追記
$the_content .= $link_tag;
}
}
}
return $the_content;
}
// 実行タイミングとしてthe_content読み込み時を指定
add_filter('the_content','add_related_page');
説明
ソースコードの以下の部分をご自身のサイトのドメインに書き換えて利用してください。
// 自サイトのドメイン
$my_domain = 'sakuraorange.minibird.jp';
記事本文に記載されたすべての内部リンクを検索して、<a>
タグから</a>
タグまでを配列に格納します。
重複するリンクは削除していますので、同じ記載のリンクがあった場合は1つだけ挿入されます。
また画像リンクは反映しないように取得した文字列に「img src」が含まれる場合は配列から除外していますので、画像リンクも必要であれば修正が必要になります。
実行した結果、配列が空でなければ投稿本文の最後にH3見出し付きで作成した内部リンクの一覧を追記します。
このソースコードでは、重複リンクと画像リンクだけ除外しています。
ダウンロードリンクやmailtoスキームなどを除外したい場合も修正が必要です。