问题描述

我目前正在对我的一个 WordPress 插件进行重大更新。

该插件允许用户从几个可用的皮肤中进行选择。我经常被要求创建一个自定义的皮肤。为了防止在升级时删除此皮肤,我必须使用 WordPress 钩子来禁用插件的自动更新。这显然不是很理想,因为我希望他们仍然能够更新插件。问题是 WordPress 处理更新的方式 – 它只是删除插件文件夹并安装新版本。因此,删除不是旧版本的文件。

目前我唯一可以解决的问题是拥有两个皮肤文件夹 – 一个在插件文件夹中,一个在上传文件夹中,这真的是我唯一可以为我的用户提供的方式吗?

最佳解决方案

许多插件使用/wp-content/custom-plugin-folder/来存储自定义的插件数据 (WPTouch) 。

只需使用常量 WP_CONTENT_URLWP_CONTENT_DIR Docs 来检查您的文件夹的存在并检索任何可用的外观。

以下文章虽然与本问题没有直接关系,但解释了插件/主题在加载自己打包的.mo 文件之前首先在 wp-content/languages 文件夹中搜索翻译的重要性。这是值得一读的,希望你在下一个版本中应用这个概念:)

Loading WordPress language files the right way
http://www.geertdedeckere.be/
I would like to point out that is important to load custom user language files from WP_LANG_DIR before you load the language files that ship with the plugin. When multiple mo-files are loaded for the same domain, the first found translation will be used. This way the language files provided by the plugin will serve as a fallback for strings not translated by the user.

次佳解决方案

另一种方法是让人们添加自己的 sub-plugin 。例如,您的核心插件中获取外观的代码可能类似于:

function get_available_skins() {
    $skins[] = '/includes/default-skin.css';
    $skins[] = '/includes/2012-skin.css';

    return apply_filters( 'get_available_skins', $skins );
}

然后,用户可以创建一个与您相邻的自定义插件 (单独激活,因此不会影响更新),执行以下操作:

add_filter( 'get_available_skins', 'my_custom_skin' );
function my_custom_skin( $skins ) {
    $skins[] = '/my-custom-skin.css';

    return $skins;
}

这与 WordPress 使用钩子使其本身可扩展完全相同。不要重新发明轮子。

(显然,我不知道你正在使用的插件,自定义的皮肤是什么样的,或者你有什么编码的东西,所以你必须使用上面的代码作为一个模型,如何重构你的自己的代码。)

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。