问题描述

我注意到,一些插件,如 Contact-form-7Nextgen-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)

有一些似乎合法的原因有两个原因 (为什么它们是错误的):

  1. (不太可能) 插件作者试图优化脚本,只需要在需要时注册短码。在这种情况下,作者没有认为在 Ajax 请求中可能会使用短码。错误原因:此优化不能提供任何性能增益。它只是向全局”registered shortcodes” 数组添加一个值。

  2. (这是更可能的一个) 插件作者有意地禁用对 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 将不会使用它。这给你另一个确认,没有理由不在管理员注册短码:即使是核心开发人员正在处理需要管理员可用的短码的东西。

也就是说,你必须有可能:

  1. 联系插件作者,看看他们是否可以修复这种行为

  2. 尝试自己找一个解决方案

关于#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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。