我在文章页添加了“历史上的今天”功能,即在文章末端调用前几年同一天发布的文章列表。
这个功能最初是由柳城创建的 WP-Today 插件实现的,其核心代码也不复杂,我们可以复制到 WordPress 网站主题的 functions.php 文件里来实现相同效果。
//历史上的今天,代码来自柳城博客的WP-Today插件
function wp_today(){
global $wpdb;
$post_year = get_the_time('Y');
$post_month = get_the_time('m');
$post_day = get_the_time('j');
$sql = "select ID, year(post_date_gmt) as h_year, post_title, comment_count FROM
$wpdb->posts WHERE post_password = '' AND post_type = 'post' AND post_status = 'publish'
AND year(post_date_gmt)!='$post_year' AND month(post_date_gmt)='$post_month' AND day(post_date_gmt)='$post_day'
order by post_date_gmt DESC limit 5";
$histtory_post = $wpdb->get_results($sql);
if( $histtory_post ){
foreach( $histtory_post as $post ){
$h_year = $post->h_year;
$h_post_title = $post->post_title;
$h_permalink = get_permalink( $post->ID );
$h_comments = $post->comment_count;
$h_post .= "<li><strong>$h_year:</strong> <a href='".$h_permalink."' title='".$h_post_title."' target='_blank'>$h_post_title($h_comments)</a></li>";
}
}
if ( $h_post ){
$result = "<hr><h3>历史上的今天:</h3><ul>".$h_post."</ul>";
}
return $result;
}
function wp_today_auto($content){
if( is_single() ){
$content = $content.wp_today();
}
return $content;
}
add_filter('the_content', 'wp_today_auto',9999);
但这个插件作者已经停更多年了,随着 WordPress 程序的更新升级,这段代码会报“变量初始化”错误。总听网友说现在的 AI 修改代码非常好用,我就把这段代码提交给 ChatGPT 来诊断一下,结果让我亮眼。
这段代码是一个用于 WordPress 的插件功能,展示“历史上的今天”的文章列表,代码源自柳城博客的 WP-Today 插件。以下是代码的主要功能和一些改进建议:
功能说明:
wp_today
函数:
- 获取当前文章的发布日期(年、月、日)。
- 查询数据库,获取与当前文章同月同日但不同年份的文章。
- 将这些历史文章整理成一个 HTML 列表,每篇文章包含标题、年份和评论数。
wp_today_auto
函数:
- 自动将“历史上的今天”功能添加到单篇文章内容的末尾。
- 钩子绑定:
- 使用
add_filter
将wp_today_auto
函数挂载到the_content
过滤器,优先级设置为 9999,确保内容修改发生在最后阶段。
改进建议:
- 变量初始化:
$h_post
在拼接字符串前没有初始化,可能会导致未定义变量的错误。- SQL 查询优化:
- 直接使用
$wpdb->prepare
来防止 SQL 注入。- 代码安全性:
- 使用
esc_html
和esc_url
对输出进行转义,防止 XSS 攻击。- 空结果处理:
- 当前代码在没有历史文章时会返回空内容,建议添加友好的提示。
- 代码格式与可读性:
- 优化缩进和格式,增强代码的可读性和可维护性。
改进后的代码
function wp_today() {
global $wpdb;$post_year = get_the_time('Y');
$post_month = get_the_time('m');
$post_day = get_the_time('j');// 使用 $wpdb->prepare 防止 SQL 注入
$sql = $wpdb->prepare(
"SELECT ID, YEAR(post_date_gmt) AS h_year, post_title, comment_count
FROM $wpdb->posts
WHERE post_password = ''
AND post_type = 'post'
AND post_status = 'publish'
AND YEAR(post_date_gmt) != %d
AND MONTH(post_date_gmt) = %d
AND DAY(post_date_gmt) = %d
ORDER BY post_date_gmt DESC
LIMIT 5",
$post_year, $post_month, $post_day
);$history_posts = $wpdb->get_results($sql);
$h_post = ''; // 初始化变量if ($history_posts) {
foreach ($history_posts as $post) {
$h_year = esc_html($post->h_year);
$h_post_title = esc_html($post->post_title);
$h_permalink = esc_url(get_permalink($post->ID));
$h_comments = intval($post->comment_count);$h_post .= "<li><strong>$h_year:</strong> <a href='$h_permalink' title='$h_post_title' target='_blank'>$h_post_title ($h_comments)</a></li>";
}
}if ($h_post) {
$result = "<hr><h3>历史上的今天:</h3><ul>$h_post</ul>";
} else {
$result = "<hr><h3>历史上的今天:</h3><p>今天没有相关的历史文章。</p>";
}return $result;
}function wp_today_auto($content) {
if (is_single()) {
$content .= wp_today();
}
return $content;
}// 添加过滤器
add_filter('the_content', 'wp_today_auto', 9999);
改进后的代码更安全、可读性更强,且更健壮。通过使用 wpdb->prepare
和转义输出,避免了潜在的 SQL 注入和 XSS 漏洞。
历史上的今天:
- 2022: 郭论“吃饭”的学问 (2)
- 2022: 老薛主机一键升级为云主机套餐方法 (0)
AI果然强大。。。
@Lvtu 像我这类代码小白有福了。
@Lvtu 你把“历史上的今天”改成“那年·今日”,更加文艺范。赞!
竟然在茫茫网络中碰到了同市的,哈哈
@Feng 缘分呀,多来窜门哈。