WordPress自定义SQL调取文章列表 + 彻底关闭REST API冗余接口完整教程
时间:2026-08-13 22:38:26 来源:aliz.cn 作者:SKY 阅读:
原创实测|适用于 WordPress6.x。 WP_Query 是 WordPress 标准查询类,但数据量大时会加载很多附加对象,开销较高;追求高性能可以直接使用$wpdb原生 SQL 读取文章。 同时 WordPress 默认开启 REST API,会在页面头部输出大量wp‑json链接,不需要接口业务场景可以彻底关闭,减少 html 冗余,降低被扫描探测风险。
第一部分:$wpdb 自定义 SQL 调取文章列表
注意:直接 SQL 查询不会触发 WP 钩子,不会自动输出缩略图、自定义字段 meta,需要自己 JOIN 关联表;适合纯展示列表,追求查询速度。 禁止直接拼接用户输入变量,防止 SQL 注入。
1、基础示例:调取公开文章
php
运行
<?php
global $wpdb;
$sql = "
SELECT ID,post_title,post_excerpt,post_date,post_name
FROM {$wpdb->posts}
WHERE post_type='post' AND post_status='publish'
ORDER BY post_date DESC
LIMIT 10
";
$rows = $wpdb->get_results($sql);
if($rows){
foreach ($rows as $row){
$post_id = $row->ID;
$title = esc_html($row->post_title);
$permalink = get_permalink($post_id);
//获取特色图片
$thumb_html = has_post_thumbnail($post_id) ? get_the_post_thumbnail($post_id,'medium',['class'=>'list‑thumb']) : '';
?>
<div class="item">
<div class="pic"><?php echo $thumb_html; ?></div>
<h3><a href="<?php echo esc_url($permalink); ?>"><?php echo $title; ?></a></h3>
<time><?php echo esc_html($row->post_date); ?></time>
</div>
<?php
}
}
?>
2、带栏目分类条件查询 SQL
需要关联分类关系表:
term_relationships、term_taxonomyphp
运行
<?php
global $wpdb;
$cat_id = 3; //分类ID
$sql = $wpdb->prepare("
SELECT p.ID,p.post_title,p.post_name,p.post_date
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->term_relationships} tr ON p.ID=tr.object_id
LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id
WHERE p.post_type='post' AND p.post_status='publish' AND tt.taxonomy='category' AND tt.term_id=%d
GROUP BY p.ID
ORDER BY p.post_date DESC
LIMIT 10
",$cat_id);
$rows = $wpdb->get_results($sql);
foreach ($rows as $row){
echo '<a href="'.esc_url(get_permalink($row->ID)).'">'.esc_html($row->post_title).'</a>';
}
?>
$wpdb‑>prepare()做参数预处理,防止 SQL 注入,必须使用。
3、读取自定义字段示例
php
运行
$sql = $wpdb->prepare("
SELECT p.ID,p.post_title,pm.meta_value
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON p.ID=pm.post_id AND pm.meta_key='my_key'
WHERE p.post_type='post' AND post_status='publish'
LIMIT 10
");
直接 SQL 优缺点
✅优点:查询速度快,不加载 WP 对象,大数据列表性能优于
WP_Query ❌缺点:
- 不会自动运行插件钩子;
- 分页需要自己写 SQL LIMIT;
- 缩略图、meta 需要自己 JOIN;
小流量站点优先使用WP_Query;大流量栏目、首页推荐列表,适合原生 SQL。
第二部分:彻底关闭 REST API、清理头部冗余标签
WordPress 默认 head 会输出:
<link rel="https://api.w.org/" href="https://xxx/wp‑json/">- REST API 链接、oembed、shortlink 等大量冗余代码。
把下面全部代码复制到主题
functions.php末尾。php
运行
<?php
/**
* aliz.cn 关闭REST API、清理头部冗余
*/
//1.完全禁用REST API接口
add_filter('rest_authentication_errors', function($result) {
if (!empty($result)) return $result;
if (!is_user_logged_in()) {
return new WP_Error('rest_disabled','REST API已关闭',['status' => 403]);
}
return $result;
});
//2.移除页面头部输出 rest‑api meta
remove_action('wp_head', 'rest_output_link_wp_head', 10);
remove_action('wp_head', 'wp_oembed_add_discovery_links',10);
remove_action('template_redirect', 'rest_output_link_header',11);
//3.移除 oembed
remove_action('wp_head','wp_oembed_add_host_js');
//4.移除shortlink简短链接
remove_action('wp_head','wp_shortlink_wp_head',10);
//5.移除wp‑generator版本号
remove_action('wp_head','wp_generator');
//6.移除rsd、wlwmanifest
remove_action('wp_head','rsd_link');
remove_action('wp_head','wlwmanifest_link');
//7.关闭xmlrpc(很多扫描攻击目标)
add_filter('xmlrpc_enabled','__return_false');
add_filter('pre_update_option_enable_xmlrpc','__return_false');
add_filter('pre_option_enable_xmlrpc','__return_zero');
?>
Nginx 层面屏蔽 /wp‑json 访问(双重防护)
nginx
location ~ ^/wp‑json/ {
return 403;
}
Apache .htaccess
apache
RewriteRule ^wp‑json/ - [R=403,L]
⚠️重要提醒
- 如果你使用古腾堡编辑器、部分主题插件依赖 REST API,关闭后后台编辑器异常,不要关闭;
- 纯前台展示网站,不使用块编辑器,才适合完全关闭 REST API;
- 如果只是想隐藏 head 输出,后台继续使用 API,只删除
wp_head相关 remove_action,不要写 rest_authentication_errors 拦截。
第三部分:常见问题排查
- SQL 查询输出乱码、特殊符号 标题使用
esc_html()做转义,链接使用esc_url(),防止 XSS 漏洞。 - SQL 分页怎么实现 自己接收
$paged参数,计算 offset,LIMIT offset,size;原生 SQL 没有内置分页函数。 - 关闭 REST API 后后台报错 古腾堡块编辑器强依赖 rest‑api,出现报错就注释掉
rest_authentication_errors那一段,只清理前端 head 冗余标签即可。 - xmlrpc 关闭会影响什么 手机 APP、xmlrpc 发布文章功能失效;普通网站几乎用不到。
小结
- 小数据列表优先
WP_Query;首页、大流量推荐列表,使用$wpdb原生 SQL 提升性能; $wpdb‑>prepare()必须使用,杜绝 SQL 注入;- REST API:块编辑器站点仅清理前端 head 输出;纯展示静态站点可以直接拦截接口。
本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载
发表评论
共有0条评论