如果使用is_admin仪表板,为什么不注册简码?


10

我已经注意到,某些插件(例如Contact-form-7Nextgen-gallery,可能还有其他插件)具有一个有趣的反功能,即当其is_admin()为true 时不注册其短代码。

有问题的是,如果您想从ajax生成一些动态内容(可能包含短代码),并使用“正确的” wp方式(admin-ajax.php),则不可能使WP_ADMIN为真。请参阅admin-ajax.php的第一行:

define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
    define( 'WP_ADMIN', true );
}

现在,似乎有PHP扩展允许您取消设置已定义的常量(hacky),或者可能有一种方法可以使未记录的WP_Screen系统混乱$GLOBALS['current_screen']并使is_admin()函数返回false?最有用的解决方法似乎是发布到页面或网站根目录。

is_admin()假时,插件注册其短代码是否很常见?如果是这样,除了可能是过早的优化,我找不到任何文档或原因。

Answers:


6

不久前,我在contact-form-7中也观察到了同样的问题。

但是请注意,基于注册短代码is_admindo_it_wrong请参见gmazzap的答案

有两个原因似乎一见钟情(为什么他们是错的)合法的:

  1. (不太可能)插件作者试图优化脚本以仅在需要时注册短代码。在这种情况下,作者不认为该短代码可以在Ajax请求中使用。

    错误的原因是:此优化无法提高性能。它只是向全局“已注册的简码”数组添加一个值。

  2. (这是最可能的一种)。插件作者确实有意在Ajax请求中禁用了对短码的支持。对于Contact-Form-7,可能是这种情况,因为可以将表单设置为“通过Ajax提交”。但是,此功能要求表单加载其他javascript文件,当通过Ajax解析简码并通过添加javascript时,这些文件不会加载enqueue_scripts()

    作者决定禁用Ajax支持,以防止出现错误报告,例如“不要使用此功能:显示表单,但单击提交按钮不起作用。完全浪费时间!”

    因此,用户将看到保证工作的表格,或者根本看不到任何表格。

    错误的原因is_admin在这里进行检查是错误的做法。条件应检查常量DOING_AJAX是否已定义和正确。

尽管大多数插件不使用这种条件,但是由于过去的问题,少数具有该条件的插件可能具有这种条件。

当简码只是在页面上执行一些输出时,没有理由添加任何管理条件。但是,当短代码也将js或css文件放入队列时,将用法限制为非管理员/非ajax请求是有意义的。


2
不注册简码对性能的影响几乎为零。注册只是将变量添加到数组中。什么是可能慢是进行短码,不进行注册。因此,如果这是一种性能优化,那将是一次失败。如果插件作者想禁用ajax的简码,则检查是否is_admindoing_it_wrong,WP中有更好的方法来检查ajax请求。最后,如果插件让js / css入队,则如果使用'wp_enqueue_scripts'操作,如果它做得很好,它将不会影响管理页面,因为该钩子不会在管理页面中触发。
gmazzap

@gmazzap感谢您的反馈,我完全同意!我已经更新了答案,并添加了您的输入,以使您更清楚地了解这种情况是一种不良做法。
菲利普

我认为#2不太可能,因为enqueue_scripts不应影响the_content调用和admin-ajax调用。
NoBugs 2015年

3

实际上,没有理由不在admin上注册简码。

如果插件作者想要禁用插件表单Ajax,则应该这样做

if (defined('DOING_AJAX') && DOING_AJAX)

而不是检查是管理员。

请注意,由于它是“功能插件” ,因此将来可能会将Shortcake嵌入到内核中。

如果会发生,则在admin中未定义的简码将无法使用。这使您再次确认没有理由不在admin上注册简码:即使是核心开发人员也在从事需要 admin上可用简码的工作。

也就是说,您必须具备以下可能性:

  1. 联系插件作者,看看他们是否可以解决该问题
  2. 尝试自己寻找解决方案

关于#2,实际上存在可以强制is_admin为真的库。通过他们是hackish,我永远不会在生产中使用那些。

一个例子是Patchwork

使用它,您可以覆盖任何PHP自定义函数。

MU插件中,您可以执行(完全未测试):

add_action('muplugins_loaded', function() {
  if ( defined('DOING_AJAX') && DOING_AJAX ) {
     require 'path/to/Patchwork.php';
     Patchwork\replace("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' );
}

这样,在两种情况下都将添加简码。

根据其他插件代码的不同,此方法可能会单独起作用,也可能不会单独起作用,但是对此没有通用的答案。


您也可以add_shortcode('shortcode', array('their-class', 'their-function') )或类似的。
NoBugs 2015年

@nobugs当然:)
gmazzap

或更好的“解决方法”,只需发布​​到网站的根目录或页面,具有讽刺意味的是NextGen所做的。
NoBugs 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.