问题描述

现在我的插件,我正在使用 in_admin()来确定用户是在该站点的前端还是在管理区域。但是,当插件使用 admin-ajax.php 处理 ajax 请求时,会出现此问题。

只有在处理 admin-ajax.php 文件或站点的前端时,才需要注册钩子和插件。做这个的最好的方法是什么?

最佳解决方案

检查常数 DOING_AJAX 。它的定义是 wp-admin/admin-ajax.php 中的第一个工作代码。一些非常奇怪的插件,如 Jetpack,是 defining that constant in unexpected places,所以你也可以包括支票 is_admin()以及。

例:

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}

很久以前我有 asked for a simpler way to check this,最终在 4.7.0 中实现了。

所以对于 WP 4.7 及更高版本,您可以使用:

if ( wp_doing_ajax() )
{
    // do something
}

次佳解决方案

好消息,功能现在在。

File: /wp-includes/load.php
1037: /**
1038:  * Determines whether the current request is a WordPress Ajax request.
1039:  *
1040:  * @since 4.7.0
1041:  *
1042:  * @return bool True if it's a WordPress Ajax request, false otherwise.
1043:  */
1044: function wp_doing_ajax() {
1045:   /**
1046:    * Filters whether the current request is a WordPress Ajax request.
1047:    *
1048:    * @since 4.7.0
1049:    *
1050:    * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
1051:    */
1052:   return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }

只是为了回顾一下,admin-ajax.php 定义了这样的东西。

File: /wp-admin/admin-ajax.php
11: /**
12:  * Executing Ajax process.
13:  *
14:  * @since 2.1.0
15:  */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18:     define( 'WP_ADMIN', true );
19: }

参考文献

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