18 性能、缓存与查询优化
整理 Transients、Object Cache、查询优化、禁用无用资源和 Heartbeat 场景。
本页关键词
transient
cache
WP_Query
dequeue
heartbeat
学习目标
- 会使用 transient 缓存
- 会优化查询参数
- 会按需禁用资源
- 知道后台 Heartbeat 调整
- 理解缓存失效
代码使用提醒
本页代码适合用于学习和研究。复制到正式网站前,请先备份,并优先在测试环境验证。
涉及用户输入、后台保存、接口请求、删除操作和邮件发送时,要同时考虑权限、nonce、sanitize、validate 和 escape。
1. Transient 缓存查询结果
缓存
<?php
function mysite_get_featured_posts_cached() {
$cached = get_transient( 'mysite_featured_posts' );
if ( false !== $cached ) {
return $cached;
}
$posts = get_posts( array(
'posts_per_page' => 5,
'meta_key' => '_featured',
'meta_value' => '1',
) );
set_transient( 'mysite_featured_posts', $posts, HOUR_IN_SECONDS );
return $posts;
}
Transient 适合缓存不需要每次实时计算的数据。
2. 保存文章时清理缓存
缓存
<?php
function mysite_clear_featured_posts_cache() {
delete_transient( 'mysite_featured_posts' );
}
add_action( 'save_post', 'mysite_clear_featured_posts_cache' );
有缓存就要考虑什么时候失效。
3. 优化 WP_Query 参数
查询
<?php
$q = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 6,
'no_found_rows' => true,
'ignore_sticky_posts' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
) );
不需要分页、不需要 meta/term 时,可以减少查询负担。
4. 只在需要页面加载重资源
性能
<?php
function mysite_load_map_assets() {
if ( ! is_page( 'contact' ) ) {
return;
}
wp_enqueue_script( 'mysite-map', get_stylesheet_directory_uri() . '/assets/js/map.js', array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'mysite_load_map_assets' );
地图、轮播、动画脚本都适合按需加载。
5. 移除 emoji 脚本
性能
<?php
function mysite_disable_emoji_assets() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
}
add_action( 'init', 'mysite_disable_emoji_assets' );
适合不使用 emoji 功能的网站。
6. 调整 Heartbeat 频率
后台
<?php
function mysite_heartbeat_settings( $settings ) {
$settings['interval'] = 60;
return $settings;
}
add_filter( 'heartbeat_settings', 'mysite_heartbeat_settings' );
Heartbeat 影响后台自动保存、锁定等功能,不要盲目关闭。
本页总结
性能优化不是只装缓存插件。代码层面要掌握按需加载、查询优化、缓存和缓存失效。