深度优化 WordPress:不用查数据库,通过图片链接即可获取图片 ID!

WordPress 有个函数 attachment_url_to_postid( $url ),它可以通过图片的链接获取该图片在媒体库中对应的 ID。

但是该函数有个不好的地方,它是直接通过数据库查询来获取的,如果你在模板中大量使用,那么你整个页面将会有大量的 SQL 查询。

比如我就看到一些站点因为这个函数有上百条 SQL 查询,虽然这些 SQL 查询都很快,但是太多的 SQL 还是占用了数据库连接池资源,如果网站流量上来了,很容易就造成了性能问题,所以这类问题最好是能够通过内存缓存来优化它。

还好 attachment_url_to_postid 函数提供了两个 filter 正好可以完美的缓存这个过程。

首先,这个函数提供了再进行数据库查询之前提供了 pre_attachment_url_to_postid filter,这类 pre 之类的 filter 都是其他方式来替换原始的获取数据的方式,这里我们就通过该 filter 到 memcached 中看看是否有缓存:

add_filter('pre_attachment_url_to_postid', fn($pre, $url)=> wp_cache_get($url, 'wpjam_attachment_url_to_postid') ?: $pre, 10, 2);

代码很简单,聪明的同学一眼就看懂,就是通过 wp_cache_get 函数使用图片链接 $url 到内存中看看有没有缓存,有的话直接返回,这样就不用数据库查询了。

那么我们什么时候将链接 $url 对应的 $id 存到内存中呢?这时候就用到了 attachment_url_to_postid 函数提供的第二个 filter,这个 filter 是该函数在数据库查询获取到 ID 之后提供的:

add_filter('attachment_url_to_postid', function($post_id, $url){
	wp_cache_set($url, $post_id, 'wpjam_attachment_url_to_postid', DAY_IN_SECONDS);

	return $post_id;
}, 10, 2);

代码也很简单,我们将数据库查询获取到 $id 存到内存中,这样下次相同的链接就直接从缓存中获取了,无需数据库查询了。

你只需要将相关的两段代码复制到当前主题的 functions.php 中, attachment_url_to_postid( $url )函数就变成了带有缓存的版本了。当然我已经实现了一个 WordPress 深度优化插件,可以清理无用的 WordPress 数据和通过 Memcached 在各个方面对 WordPress 进行优化,其中就包含该功能。😄

我们的模块化 WordPress 企业主题 Modular 已经集成这个函数,新版应该会快很多,嘿嘿,感兴趣的同学可以点击这里:

深度自定义与模块化设计的 WordPress 企业主题来了


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。