在 WordPress 中,不推荐直接操作数据库来显示文章,因为这会绕过 WordPress 的核心机制(如缓存、钩子、安全检查等),容易导致安全问题、性能下降或兼容性问题。但如果你确实需要直接查询数据库(例如在特殊插件开发、性能优化或调试场景中),可以使用 WordPress 提供的 $wpdb 类来安全地操作数据库。
✅ 正确方式:使用 $wpdb 查询文章
WordPress 提供了全局变量 $wpdb,用于安全地与数据库交互。
示例:直接查询数据库并显示文章标题和内容
global $wpdb;
// 查询已发布的文章(post_status = 'publish',post_type = 'post')
$posts = $wpdb->get_results(
$wpdb->prepare(
"SELECT ID, post_title, post_content, post_date
FROM $wpdb->posts
WHERE post_status = %s AND post_type = %s
ORDER BY post_date DESC
LIMIT 10",
'publish',
'post'
)
);
if ( $posts ) {
foreach ( $posts as $post ) {
echo '<h2>' . esc_html( $post->post_title ) . '</h2>';
echo '<p><strong>发布于:</strong>' . esc_html( $post->post_date ) . '</p>';
echo '<div>' . wp_kses_post( wp_trim_words( $post->post_content, 50 ) ) . '</div>';
}
} else {
echo '暂无文章。';
}
⚠️ 注意事项
- 不要直接使用 SQL 拼接,务必使用
$wpdb->prepare()防止 SQL 注入。 - 使用 WordPress 函数更安全:如
get_posts()、WP_Query等。 - 手动查询不会触发 the_content 过滤器,比如短代码、自动排版等不会生效,除非手动调用:
echo apply_filters( 'the_content', $post->post_content );
✅ 推荐方式:使用 WP_Query(标准做法)
$args = array(
'posts_per_page' => 10,
'post_status' => 'publish',
'post_type' => 'post',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<div>' . get_the_excerpt() . '</div>';
}
wp_reset_postdata();
} else {
echo '暂无文章。';
}
总结
| 方法 | 是否推荐 | 说明 |
|---|---|---|
$wpdb 直接查询 |
⚠️ 仅限特殊需求 | 需注意安全、过滤、性能 |
WP_Query / get_posts() |
✅ 强烈推荐 | 安全、兼容、支持钩子和缓存 |
建议
除非你有非常特殊的需求(如高性能报表、跨表统计等),否则请使用 WordPress 标准的查询方式(如 WP_Query)来显示文章。
如需帮助构建具体查询,请告诉我你的使用场景(如:显示某个分类的文章、自定义字段等),我可以给出更合适的代码。
CDNK博客