问题描述
我注意到,一些插件,如 Contact-form-7,Nextgen-gallery,可能是其他的,有一个有趣的 anti-feature 在 is_admin()是真的时没有注册他们的短码。
有问题的是,如果要从 ajax 生成一些动态内容 (可能有短码),并且使用”correct” wp 的方法,admin-ajax.php,不可能没有 WP_ADMIN 为 true 。参见 admin-ajax.php 的第一行:
define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
define( 'WP_ADMIN', true );
}
现在,似乎有 PHP 扩展将让你 un-set 一个定义的常量 (hacky),或者可能有一种方式来混淆无证 WP_Screen 系统和 $GLOBALS['current_screen']使 is_admin()函数返回 false?最有用的解决方法似乎是发布到页面或站点根目录。
当 is_admin()为假时,插件注册短信是否常见?如果是这样,我找不到任何文件或理由,除了它可能是一个过早的优化。
最佳解决方案
我已经观察到与 contact-form-7 一样的问题。
但是请注意,根据 is_admin 注册短码是在做____ _ _ _ _ _ _ _ _ _ _ _ _(see gmazzap`s answer)
有一些似乎合法的原因有两个原因 (为什么它们是错误的):
-
(不太可能) 插件作者试图优化脚本,只需要在需要时注册短码。在这种情况下,作者没有认为在 Ajax 请求中可能会使用短码。错误原因:此优化不能提供任何性能增益。它只是向全局”registered shortcodes” 数组添加一个值。
-
(这是更可能的一个) 插件作者有意地禁用对 Ajax 请求中的短代码的支持。使用 Contact-Form-7 可能是因为窗体可以设置为 「通过 Ajax 提交」 。但是,此功能需要表单加载其他 JavaScript 文件,当通过 Ajax 解析短代码并且通过
enqueue_scripts()添加 JavaScript 时,不会加载该文件。作者决定禁用 Ajax 支持,以防止错误报告,如 「不要使用:窗体显示,但单击提交按钮不起作用,浪费时间!」 所以用户会看到一个 guaranteed-working 表单,或者根本没有表单。错误是因为:检查is_admin是不好的做法。条件应该检查常数DOING_AJAX是否被定义为 true 。
虽然大多数插件不使用这种情况,但是由于过去的问题,有限制的少数可能会有这样的限制。
当一个短码只是在页面上做一些输出时,没有理由添加任何 admin-condition 。但是,当短码也插入 js 或 css 文件时,将使用限制为 non-admin /non-ajax 请求是有意义的。
次佳解决方案
实际上,没有理由不在管理员上注册短码。
如果插件作者想要禁用 Ajax 插件,他们应该做
if (defined('DOING_AJAX') && DOING_AJAX)
而不是检查是管理员。
请注意,将来 Shortcake 可能嵌入到内核中,因为它是一个”Feature Plugin” 。
如果发生这种情况,未在 admin 中定义的 shortcode 将不会使用它。这给你另一个确认,没有理由不在管理员注册短码:即使是核心开发人员正在处理需要管理员可用的短码的东西。
也就是说,你必须有可能:
-
联系插件作者,看看他们是否可以修复这种行为
-
尝试自己找一个解决方案
关于#2,实际上存在可以强制 is_admin 为真的库。他们是黑客,我永远不会使用那些在生产中。
一个例子是 Patchwork 。
使用它可以覆盖任何 PHP 自定义功能。
在 MU plugin 中,您可以 (完全未定义):
add_action('muplugins_loaded', function() {
if ( defined('DOING_AJAX') && DOING_AJAX ) {
require 'path/to/Patchwork.php';
Patchworkreplace("is_admin", function() {
return FALSE;
});
}
});
这将使 is_admin()在 ajax 请求上返回 false 。
但是,如上所述,这是非常糟糕的,并会影响其他插件 (和核心) 行为与不可预测的效果。
您可以做的另一件事是在管理员请求上注册插件短代码处理程序。
例如。如果插件代码是:
if (! is_admin()) {
add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}
那么你可以编写另一个插件:
if (is_admin()) {
add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}
这两种情况都会添加短码。
根据其他插件代码,这可能或不可以单独工作,但是没有一个一般的答案。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。