在使用Emlog搭建博客时,通过标签名获取文章列表是常见的需求。以下是实现这一功能的详细方法和代码解析。
通过标签名称获取对应的文章列表,并支持分页显示。
我们将实现两个主要函数:
tagSearchArticlesByName
:通过标签名获取标签ID,并调用文章查询功能。tagSearchArticles
:通过标签ID获取文章列表,并支持分页。function tagSearchArticlesByName($tag_name, $num_per_page) {
$db = MySql::getInstance();
// 防止 SQL 注入
$tag_name = $db->escape_string($tag_name);
// 获取标签 ID
$sql_tag_id = "SELECT tid FROM " . DB_PREFIX . "tag WHERE tagname = '$tag_name'";
$result_tag_id = $db->query($sql_tag_id);
if (!$result_tag_id || !$db->num_rows($result_tag_id)) {
echo '<p>标签不存在或无内容。</p>';
return;
}
$row_tag_id = $db->fetch_array($result_tag_id);
$tag_id = intval($row_tag_id['tid']);
// 调用通过标签ID查询文章的函数
tagSearchArticles($tag_id, $num_per_page);
}
function tagSearchArticles($tag_id, $num_per_page) {
$db = MySql::getInstance();
$page = isset($_GET['page']) && intval($_GET['page']) > 0 ? intval($_GET['page']) : 1;
// 获取文章总数
$sql_total = "SELECT COUNT(DISTINCT gid) as total FROM " . DB_PREFIX . "blog WHERE FIND_IN_SET('$tag_id', tags)";
$result = $db->query($sql_total);
$row_total = $db->fetch_array($result);
$total_articles = $row_total['total'];
// 计算分页
$offset = ($page - 1) * $num_per_page;
$total_pages = ceil($total_articles / $num_per_page);
// 查询当前页文章 ID
$sql_blog_ids = "SELECT DISTINCT gid FROM " . DB_PREFIX . "blog WHERE FIND_IN_SET('$tag_id', tags) LIMIT $offset, $num_per_page";
$result_ids = $db->query($sql_blog_ids);
$blog_ids = [];
while ($row = $db->fetch_array($result_ids)) {
$blog_ids[] = $row['gid'];
}
if (!empty($blog_ids)) {
$ids_string = implode(',', $blog_ids);
$sql_articles = "SELECT gid, title, date, cover, content, excerpt, views, comnum
FROM " . DB_PREFIX . "blog
WHERE gid IN ($ids_string) AND hide='n' ORDER BY `date` DESC";
$result_articles = $db->query($sql_articles);
while ($row = $db->fetch_array($result_articles)) {
// 输出文章
echo "<div>{$row['title']} - {$row['date']}</div>";
}
} else {
echo '<p>没有找到相关文章。</p>';
}
// 输出分页
for ($i = 1; $i <= $total_pages; $i++) {
echo "<a href='?page=$i'>$i</a>";
}
}
通过以上代码,我们可以实现:
希望这篇文章对您理解Emlog标签功能有所帮助!