inpsyde / translation-cache
通过使用WordPress对象缓存来缓存翻译文件,提高网站性能。
Requires
- php: >=5.5
This package is auto-updated.
Last update: 2024-08-05 14:07:37 UTC
README
通过使用WordPress对象缓存来缓存翻译文件,提高网站性能。
描述
'Inpsyde Translation Cache' 使用 WP Object Cache 机制缓存翻译 .mo
文件。
当使用 持久缓存插件 时,该插件的性能优势可以体现出来,因为默认情况下,WordPress对象缓存不会“存活”于单个请求中,并且翻译文件在WP中已经按请求进行了缓存。
因此,默认情况下,如果没有安装持久缓存插件,该插件将不执行任何操作。
MU插件自安装
考虑到许多插件都有自己的语言文件,为了允许缓存插件翻译,'Inpsyde Translation Cache' 必须作为 MU插件 运行。
因此,'Inpsyde Translation Cache' 在安装时将主文件复制到MU插件文件夹,以便作为MU插件工作。
尽管“常规”插件仍然处于激活状态,但它什么也不做,或者更好的说法,它被列出以禁用,以便删除MU插件的副本。
实际上,当“常规”插件被禁用时,MU插件的副本将被删除(除非它已被修改)。
请注意,在某些配置中,此“自安装”过程可能无法正常工作,例如,如果MU插件文件夹不可写。
在这种情况下,'Inpsyde Translation Cache' 将继续作为常规插件工作,但它将无法缓存在 'plugins_loaded'
钩子触发之前加载的翻译文件。此外,还会显示一个管理通知,建议用户手动将主插件文件复制到MU插件文件夹以提高性能。
缓存失效
'Inpsyde Translation Cache' 存储所有文本域
- 核心
- 插件
- 主题
这意味着当安装这些组件的新版本时,需要清除缓存。
自动失效
对于WordPress核心翻译的失效,插件依赖于WordPress版本:如果版本更改,则所有缓存的内核翻译都将失效。
对于插件和主题,事情则不那么直接。
'Inpsyde Translation Cache' 使用 'switch_theme'
钩子来失效旧主题和新主题的缓存。
它还使用 'activated_plugin'
和 'deactivated_plugin'
来失效插件的缓存。
然而,为了失效主题和插件的缓存,'Inpsyde Translation Cache' 需要知道它们使用的文本域。
为此,'Inpsyde Translation Cache' 使用插件和主题的 'TextDomain' 文件头。
考虑到 'TextDomain' 文件头不是强制性的,可能存在一些插件或主题没有提供该头部(即使它们应该提供)。
手动失效
在这种情况下,可以通过调用 Inpsyde\MoCache::flush_cache()
方法“手动”失效缓存。
例如,假设有一个插件加载了一个文本域,如下所示
load_plugin_textdomain( 'some-plugin-txt-domain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
并且假设这个插件在插件头部没有以下内容
Text Domain: some-plugin-txt-domain
'Inpsyde Translation Cache' 将无法在插件激活和停用时自动清除该插件的缓存。
然而,手动清除该插件的缓存只是以下操作
function invalidate_some_plugin_translation_cache() { if ( class_exists( 'Inpsyde\TranslationCache\MoCache' ) ) { Inpsyde\TranslationCache\MoCache::flush_cache( 'some-plugin-txt-domain' ); } } register_activation_hook( WP_PLUGIN_DIR . '/some-plugin-dir/some-plugin-filename.php', 'invalidate_some_plugin_translation_cache' ); register_deactivation_hook( WP_PLUGIN_DIR . '/some-plugin-dir/some-plugin-filename.php', 'invalidate_some_plugin_translation_cache' );
当然,如果可能编辑插件以包含 Text Domain
插件头部,这肯定更好,因为 'Inpsyde Translation Cache' 将能够自动清除插件翻译的缓存。
对于主题,工作流程非常相似,只需使用 'switch_theme'
钩子来拦截主题更改。
按版本无效化
还有另一种无效化缓存翻译的方法。
'Inpsyde Translation Cache' 为文本域和 .mo
文件路径的组合构建一个唯一的密钥。
这个唯一密钥是通过以下 'hash' 构建的
- 文本域
.mo
文件路径- 'Inpsyde Translation Cache' 自身版本
- 可以通过
mocache_cache_version
过滤器设置的任意 '版本' 字符串
这意味着使用 mocache_cache_version
过滤器,可以无效化给定文本域的所有存储密钥。
例如,假设与上面相同的插件,我们可以这样做
add_filter( 'mocache_cache_version', function( $version, $domain ) { $plugin_path = WP_PLUGIN_DIR . '/some-plugin-dir/some-plugin-filename.php'; $headers = get_plugin_data( $plugin_file_path, FALSE, FALSE ); return $headers['Version']; }, 10, 2 );
因此,我们使用 '版本' 插件头部来在版本更改时清除缓存。
与上述 '手动' 方法相比,这种方法的好处是无需显式调用 'Inpsyde Translation Cache' 对象,因此不需要检查类是否存在。实际上,如果 'Inpsyde Translation Cache' 没有安装或未激活,则代码将没有任何效果。
但它也有两个缺点
- 旧版本的缓存条目 不会 被删除,它们只是因为存在新版本而被忽略。然而,当密钥的自然到期时间到达时,它们将被丢弃。考虑到默认的自然到期时间是 12 小时,这个问题应该不会那么严重。
- 上述代码要求插件在头部定义版本,并且为了有效,它依赖于每次翻译文件更改时都更新版本。即使这些是常见做法,主题/插件作者可能只是忽略或忘记它们。
因此,再次建议,在可能的情况下使用 Text Domain
头部,也许可以向第三方插件和主题的维护者建议,如果不存在,则添加它。
可用的钩子
'Inpsyde Translation Cache' 提供了一些用于定制的钩子。大多数钩子仅从 MU 插件中正常工作,特别是如果 'Inpsyde Translation Cache' 作为 MU 插件运行。
可用的 action 钩子
inpsyde_translation_cache
,在插件类加载后触发。用于包装对Inpsyde\TranslationCache\MoCache::flush_cache()
的调用。
可用的 filter 钩子
-
mocache_cache_enabled
可以用来通过挂钩回调以false
程序化地禁用插件。 -
mocache_cache_version
可以用来为给定的文本域(作为参数传递)无效化缓存。如果返回的版本有变化,则缓存将被无效化。参见上面的 '按版本无效化'。 -
mocache_cache_expire
可以用来自定义缓存值的持续时间(以秒为单位)。返回的值小于或等于零将阻止执行任何缓存。
安装
'Inpsyde Translation Cache' 通过 Composer 提供包名为 inpsyde/mo-cache
,但它不要求安装或使用 Composer。
“传统”安装方法(下载 -> 放入插件文件夹 -> 激活)同样有效。
要求
- PHP 5.5 或更高版本。
- WordPress,目前测试版本为 5.1
许可证
本存储库是免费软件,根据 GNU 通用公共许可证第 2 版或(根据您的选择)任何后续版本发布。请参阅 LICENSE 了解完整的许可证。
“Inpsyde Translation Cache” 集成了以下版权和许可声明所涵盖的工作
- “MO Cache” WordPress 插件,版权所有(c)Masaki Takeuchi(m4i),根据 MIT 许可发布。
___ _
|_ _|_ __ _ __ ___ _ _ __| | ___
| || '_ \| '_ \/ __| | | |/ _` |/ _ \
| || | | | |_) \__ \ |_| | (_| | __/
|___|_| |_| .__/|___/\__, |\__,_|\___|
|_| |___/
自 2006 年以来,Inpsyde 团队一直在开发网络。