ChatGPT 帮我优化“历史上的今天” WordPress 插件代码

我在文章页添加了“历史上的今天”功能,即在文章末端调用前几年同一天发布的文章列表。

这个功能最初是由柳城创建的 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>&nbsp;&nbsp;<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 插件。以下是代码的主要功能和一些改进建议:


功能说明:

  1. wp_today 函数
    • 获取当前文章的发布日期(年、月、日)。
    • 查询数据库,获取与当前文章同月同日但不同年份的文章。
    • 将这些历史文章整理成一个 HTML 列表,每篇文章包含标题、年份和评论数。
  2. wp_today_auto 函数
    • 自动将“历史上的今天”功能添加到单篇文章内容的末尾。
  3. 钩子绑定
    • 使用 add_filterwp_today_auto 函数挂载到 the_content 过滤器,优先级设置为 9999,确保内容修改发生在最后阶段。

改进建议:

  1. 变量初始化
    • $h_post 在拼接字符串前没有初始化,可能会导致未定义变量的错误。
  2. SQL 查询优化
    • 直接使用 $wpdb->prepare 来防止 SQL 注入。
  3. 代码安全性
    • 使用 esc_htmlesc_url 对输出进行转义,防止 XSS 攻击。
  4. 空结果处理
    • 当前代码在没有历史文章时会返回空内容,建议添加友好的提示。
  5. 代码格式与可读性
    • 优化缩进和格式,增强代码的可读性和可维护性。

改进后的代码

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>&nbsp;&nbsp;<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 漏洞。


历史上的今天:

相关推荐

如何禁止 WordPress 自动安装 WPCode 插件?

小编之前曾报道过,旗下有个 WordPress 网站,访问时经常会跳转至无关网站。经排查,是网站被注入了恶意代码。 但在将网站的 WordPress 核心目录、文件替换为 WordPress 最新版本,及重新安装主题文件后,没过两天仍发生了类似跳转情况。 我仔细查看网站文件,在插件目录(plugins)下多了 WPCode 文件夹,并在 language ...

WordPress 更新插件出现"下载失败。cURL error 77"的解决方法

最近在网站后台更新 WordPress 插件时,一直是“更新失败:下载失败。 cURL error 77”的错误提示,无法更新插件。也同样无法更新升级 WordPress 到最新版,及更新 WordPress 主题,但有“新版本可用”的提示,刷新后又正常显示。 遇到这种情况,我的判断是 WordPress 的源站出现了连接问题。因为 wordpress.org 网站在国外 ...

WordPress 插件升级原来已经变得如此智能

作为全球最流行的建站程序,WordPress 的易用性为广大站长称颂,不仅 WordPress 程序本身的更新升级非常便捷,而且相关的主题和插件更新,也是省却了下载-上传-启用的繁琐步骤,在网站后台一键搞定。 但能一键搞定的主题和插件,需要它们本身具备了在线更新功能,这样后台会自动搜索、显示有更新可用,点击“更新”按钮, ...

试用百度版 ChatGPT “文心一言”:反应有点慢,回答挺呆板

终于收到了参加内测百度“文心一言”邀请的短信: 【百度】文心一言:你现在可以体验了,快来向我提问吧。访问链接:https://yiyan.baidu.com/ 点击登录百度账号,弹出了“文心一言测试规则”: 亲爱的内测伙伴,欢迎您参与文心一言测试! 在开启我们的测试之旅之前,请您认真阅读以下内容。 百度提示您,在测试期间您应积极 ...

5 条评论

  1. AI果然强大。。。

    • @Lvtu 像我这类代码小白有福了。

    • @Lvtu 你把“历史上的今天”改成“那年·今日”,更加文艺范。赞!

  2. 竟然在茫茫网络中碰到了同市的,哈哈

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。