如果是_ADMIN仪表板,为什么不注册快捷代码?

时间:2015-05-21 作者:NoBugs

我注意到一些插件,如Contact-form-7, Nextgen-gallery, 可能其他人有一个有趣的反功能,即在is_admin() 是真的。

问题是,如果您想从ajax生成一些动态内容(可能有短代码),并使用“正确的”wp方式,那么就需要管理ajax。php中,WP\\u ADMIN不可能为true。请参阅管理ajax的第一行。php:

define( \'DOING_AJAX\', true );
if ( ! defined( \'WP_ADMIN\' ) ) {
    define( \'WP_ADMIN\', true );
}
现在,似乎有一些PHP扩展可以让您取消设置一个已定义的常量(hacky),或者有一种方法可以搞乱未记录的WP\\U屏幕系统和$GLOBALS[\'current_screen\'] 制作is_admin() 函数返回false??最有用的解决方法似乎是发布到页面或网站根目录。

插件在is_admin() 是否为假?如果是这样的话,我找不到任何文档或理由,除了它可能是一个过早的优化。

2 个回复
最合适的回答,由SO网友:Philipp 整理而成

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

但请注意,基于is_admin 是不是做错了(see gmazzap`s answer)

有两个原因乍一看似乎是合理的(以及为什么它们是错误的):

插件作者试图optimize 仅在需要时注册短代码的脚本。在这种情况下,作者没有考虑在Ajax请求中可能会使用短代码。

Wrong because: 此优化不会提供任何性能增益。它只是向全局“注册的短代码”数组添加一个值。

插件作者intentionally disable Ajax请求中对短代码的支持。对于Contact-Form-7,可能就是这种情况,因为表单可以设置为“通过Ajax提交”。但是,此功能要求表单加载其他javascript文件,当通过Ajax解析短代码并通过enqueue_scripts().

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

因此,用户要么看到保证的工作表单,要么根本看不到表单。

Wrong because: 正在检查is_admin 这里的做法很糟糕。条件应检查常数DOING_AJAX 已定义且为真。

尽管大多数插件都不使用这种情况,但有这种限制的少数插件可能是因为过去的问题而有这种限制。

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

SO网友:gmazzap

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

如果插件作者想要禁用Ajax格式的插件,他们应该这样做

if (defined(\'DOING_AJAX\') && DOING_AJAX)
而不是检查is admin。

请注意,将来可能Shortcake 将嵌入core,因为它是一个“功能插件”。

如果发生这种情况,admin中未定义的短代码将无法使用。这让您再次确认,没有理由不在admin上注册短代码:即使核心开发人员也在开发需要admin上可用的短代码的东西。

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

请与插件作者联系,看看他们是否可以修复该行为,试着自己找到一个解决方案,关于#2,实际存在的库可以强制is_admin 是真的。顺便说一句,它们是黑客的,我永远不会在生产中使用它们。

例如Patchwork.

使用它可以重写任何PHP自定义函数。

在a中MU plugin 您可以执行(完全未经测试):

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。

然而,正如前面所说的,这是非常黑客的,并且会影响其他插件(和核心)的行为,产生不可预测的影响。

您可以做的另一件事是在管理请求上注册插件短代码处理程序。

E、 g.如果插件代码为:

if (! is_admin()) {
  add_shortcode( \'shortcode\' , \'plugin_shortcode_handler\' );
}
那么you 可以编写另一个插件:

if (is_admin()) {
  add_shortcode( \'shortcode\' , \'plugin_shortcode_handler\' );
}
这样,两种情况下都会添加短代码。

这可能单独起作用,也可能不起作用,这取决于其他插件代码,但对此没有一个通用的答案。

结束

相关推荐

通过admin-ajax.php进行的AJAX调用返回404错误

目前,我正在尝试执行一个非常基本的AJAX请求,只是为了测试功能,通过管理AJAX路由我的调用。php。然而,每次我尝试触发AJAX请求时,都会收到一个404错误,上面写着“未捕获的语法错误:意外的标记<;”。Wtf?这似乎是因为我的DTD中的carot。。。我已经检查了我的代码,但不知道我在这里做错了什么。。。我对AJAX的工作还比较陌生,所以如果有任何帮助,我将不胜感激。函数中的php。php什么都不是。。。function shows_callback(){ echo \'<