1. カスタム関数の追加
まず、DedeCMSの機能拡張ファイル dede/include/extend.func.php の最後に、以下の2つのカスタム関数を追加します。これらの関数は、記事のタグ情報を基にして関連記事のリンクを動的に生成する役割を担います。
関連記事のURLを取得する関数
この関数は、指定された記事IDのタグに基づいて、関連する他の記事のURLをランダムに1件取得します。
// 指定された記事のタグに基づいて、関連記事のURLをランダムに取得する
function getRelatedArticleLink($articleId)
{
global $dsql;
// 1. 記事IDから関連するタグIDのリストを取得
$dsql->SetQuery("SELECT tag_id FROM `#@__taglist` WHERE article_id = '{$articleId}' ");
$dsql->Execute();
$tagIds = array();
while($row = $dsql->GetArray()) {
$tagIds[] = $row['tag_id'];
}
if (empty($tagIds)) {
return '';
}
// 2. 取得したタグIDを使い、自分自身を除いた関連記事IDのリストを取得
$relatedArticleIds = array();
$inClause = implode(',', $tagIds);
$dsql->SetQuery("SELECT article_id FROM `#@__taglist` WHERE tag_id IN ({$inClause}) AND article_id != {$articleId}");
$dsql->Execute();
while($row = $dsql->GetArray()) {
$relatedArticleIds[] = $row['article_id'];
}
// 3. 重複を排除し、ランダムに1件を選択
$relatedArticleIds = array_unique($relatedArticleIds);
if (empty($relatedArticleIds)) {
return '';
}
$randomIndex = array_rand($relatedArticleIds);
$randomArticleId = $relatedArticleIds[$randomIndex];
// 4. 選択した記事IDのURLを取得して返す
$articleInfo = GetOneArchive($randomArticleId);
return $articleInfo['arcurl'];
}
// 記事のタグリストを取得し、それぞれのタグにランダムな関連記事リンクを付与する
function generateTagLinks($articleId)
{
global $dsql;
// 1. 記事IDから関連するタグIDのリストを取得
$dsql->SetQuery("SELECT tag_id FROM `#@__taglist` WHERE article_id = '{$articleId}' ");
$dsql->Execute();
$tagIds = array();
while($row = $dsql->GetArray()) {
$tagIds[] = $row['tag_id'];
}
if (empty($tagIds)) {
return '';
}
// 2. タグIDのリストから、タグ名のリストを取得
$inClause = implode(',', $tagIds);
$dsql->SetQuery("SELECT tag_name FROM `#@__tagindex` WHERE id IN ({$inClause}) LIMIT 0, 3");
$dsql->Execute();
$tagList = array();
while($row = $dsql->GetArray()) {
$tagList[] = dede_htmlspecialchars($row['tag_name']);
}
// 3. 各タグに対して、関連記事のリンクを生成
$linksHtml = '';
foreach ($tagList as $tag) {
$relatedLink = getRelatedArticleLink($articleId);
if ($relatedLink) {
$linksHtml .= "<a href='{$relatedLink}' target='_blank'>{$tag}</a>, ";
}
}
return $linksHtml;
}
2. 記事テンプレートの修正
次に、記事の詳細表示テンプレート dede/templates/default/article_article.htm を編集します。{dede:field.body/} タグを、以下のカスタムPHPコードに置き換えます。このコードは、記事本文の中からランダムな位置を選び、そこに先ほど作成した関数で生成したタグリンクを挿入します。
{dede:field.id runphp='yes'}
$GLOBALS['currentArticleId'] = @me;
{/dede:field.id}
{dede:field.body runphp='yes'}
$articleId = $GLOBALS['currentArticleId'];
$articleBody = @me;
$bodyLength = strlen($articleBody);
// 本文のランダムな挿入ポイントを計算
$insertionPoint = rand(0, $bodyLength - 1);
$remainingLength = $bodyLength - $insertionPoint;
// 挿入ポイントで本文を分割
$prefixText = cn_substr(Html2text($articleBody), $insertionPoint, 0);
$suffixText = cn_substr(Html2text($articleBody), $remainingLength, $insertionPoint);
// タグリンクを生成
$tagLinksHtml = generateTagLinks($articleId);
// 新しい本文を構成
$finalBody = $prefixText . $tagLinksHtml . $suffixText;
@me = $finalBody;
{/dede:field.body}