对于程序员来说,找到问题比解决问题更重要,WordPress 性能优化也是一样,重点也是找到性能的卡点,WordPress 和其他 PHP 程序一样,最大的卡点就是数据库请求,慢 SQL 请求或者大量 SQL 请求往往就是性能最大的卡点。
Log 定位系统
「WordPress 文章超过10万就会负载很高,是不是不适合做大网站?」这篇文章中我就提到我是自己开发的一插件,将慢查询或者同时大量 SQL 查询记录下来:
![图片[1]-一个实际的例子,给大家演示一下如何发现 WordPress 性能卡点以及怎么优化!-AI Express News](https://www.aiexpress.news/wp-content/uploads/2026/01/20260124002518357-1769185518-3403be50121c696fe48662a03dbd3696.png)
上图就是 Autumn Pro 主题的后台检测结果,举个例子,打开其中一个文件:
![图片[2]-一个实际的例子,给大家演示一下如何发现 WordPress 性能卡点以及怎么优化!-AI Express News](https://www.aiexpress.news/wp-content/uploads/2026/01/20260124002519955-1769185519-a2161ae63cded185707808352592b958.png)
原来是 Automn-Pro 主题的标签汇云页面:
![图片[3]-一个实际的例子,给大家演示一下如何发现 WordPress 性能卡点以及怎么优化!-AI Express News](https://www.aiexpress.news/wp-content/uploads/2026/01/20260124002522739-1769185522-fe3686b7b73ff5c08afcc1ac5f0bd22e.png)
该标签云页面现实热门的标签,然后每个标签并且也显示最新的一篇文章,查看实现的源代码:
if($tags = get_tags('orderby=count&order=DESC&number=28')){foreach($tags as $tag){echo '<li><a class="name" href="'.get_tag_link($tag).'">'. $tag->name .'</a><small>x '. $tag->count .'</small><br>';foreach(get_posts( "tag_id=". $tag->term_id ."&numberposts=1") as $post) {echo '<p><a class="tit" href="'.get_permalink($post).'">'.get_the_title($post).'</a></p>';}echo '</li>';}}
这些热门标签下的最新文章的获取,每一个都是独立通过 WP_Query 获取,在有缓存的情况下:
![图片[4]-一个实际的例子,给大家演示一下如何发现 WordPress 性能卡点以及怎么优化!-AI Express News](https://www.aiexpress.news/wp-content/uploads/2026/01/20260124002522626-1769185522-5725d53f6348f66bc40f0d085f68988b.png)
如果缓存都失效,也就是缓存塌陷的情况下,就是会有 28 个 WP_Query 的缓存都失效:
![图片[5]-一个实际的例子,给大家演示一下如何发现 WordPress 性能卡点以及怎么优化!-AI Express News](https://www.aiexpress.news/wp-content/uploads/2026/01/20260124002524561-1769185524-86fc962e20191df3a347706ff7684ded.png)
整整有 100 多条 SQL,虽然耗时都差不多,但是如果这样的情况很多,访问量一大,那么 MySQL 请求资源池就会被耗尽。
修改代码优化性能
发现了问题,优化就很简单了,就不能用每个标签去都使用一个 WP_Query获取,使用 tag__in 参数一起获取,但是文章使用标签的可能会连续,我们把获取的文章数量放大一些,并且改成 while 操作,直到所有标签都有了相应的文章:
$tag_ids = array_column(get_tags('orderby=count&order=DESC&number=28'), 'term_id');$tag_posts = array_fill_keys($tag_ids, null);while($tag_ids){foreach(get_posts(['tag__in'=>$tag_ids, 'posts_per_page'=>count($tag_ids)*5]) as $post){foreach(get_the_tags($post) as $tag){$tag_id = $tag->term_id;if(!isset($tag_posts[$tag_id]) && in_array($tag_id, $tag_ids)){$tag_ids = array_diff($tag_ids, [$tag_id]);$tag_posts[$tag_id] = [$tag, $post];}}if(!$tag_ids){break;}}}foreach($tag_posts as [$tag, $post]){echo '<li><a class="name" href="'.get_tag_link($tag).'">'. $tag->name .'</a><small>x '. $tag->count .'</small><br>';echo '<p><a class="tit" href="'.get_permalink($post).'">'.get_the_title($post).'</a></p>';echo '</li>';}
这样最佳的情况只要一个 WP_Query 就能解决问题,我上面放到了 5 倍的数量,最差 2-3 个 WP_Query 也就基本查到所有热门标签对应的文章。
当然我们的 WordPress Jam 也提供 WordPress 性能优化外包服务,只要你的服务器有 root 权限,请直接联系我的 denis@wpjam.com,或者加我的微信:chenduopapa。
点击卡片关注「WordPress果酱」
每天分享 WordPress 使用技巧
⏬⏬ 下载 WPJAM Basic 请点击阅读原文
<原文链接:https://mp.weixin.qq.com/s/PiBjLsAs6NdkKtozfxmAyg
















暂无评论内容