欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > WordPress 建站

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_relationshipsterm_taxonomy
php
运行
<?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 ❌缺点:
  1. 不会自动运行插件钩子;
  2. 分页需要自己写 SQL LIMIT;
  3. 缩略图、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]
⚠️重要提醒
  1. 如果你使用古腾堡编辑器、部分主题插件依赖 REST API,关闭后后台编辑器异常,不要关闭
  2. 纯前台展示网站,不使用块编辑器,才适合完全关闭 REST API;
  3. 如果只是想隐藏 head 输出,后台继续使用 API,只删除wp_head相关 remove_action,不要写 rest_authentication_errors 拦截。

第三部分:常见问题排查

  1. SQL 查询输出乱码、特殊符号 标题使用esc_html()做转义,链接使用esc_url(),防止 XSS 漏洞。
  2. SQL 分页怎么实现 自己接收$paged参数,计算 offset,LIMIT offset,size;原生 SQL 没有内置分页函数。
  3. 关闭 REST API 后后台报错 古腾堡块编辑器强依赖 rest‑api,出现报错就注释掉rest_authentication_errors那一段,只清理前端 head 冗余标签即可。
  4. xmlrpc 关闭会影响什么 手机 APP、xmlrpc 发布文章功能失效;普通网站几乎用不到。

小结

  1. 小数据列表优先WP_Query;首页、大流量推荐列表,使用$wpdb原生 SQL 提升性能;
  2. $wpdb‑>prepare()必须使用,杜绝 SQL 注入;
  3. REST API:块编辑器站点仅清理前端 head 输出;纯展示静态站点可以直接拦截接口。

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程