in_admin()
来确定用户是在站点的前端还是在管理区域中。但是,当插件使用admin-ajax.php
处理ajax请求时,就会出现问题。 我只需要在处理
admin-ajax.php
文件时或在站点的前端中注册钩子和插件的方法。这样做的最佳方法是什么?#1 楼
检查常数DOING_AJAX
。它的定义是wp-admin/admin-ajax.php
中的第一个工作代码。一些非常奇怪的插件(例如Jetpack)正在意外位置定义该常量,因此您可能还需要检查is_admin()
。示例:
if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
// do something
}
很久以前,我就要求一种更简单的方法来检查此问题,该方法最终在4.7.0中实现。
因此,对于4.7或更高版本的WP,您可以使用:
if ( wp_doing_ajax() )
{
// do something
}
#2 楼
好消息,该函数已经存在。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: }
评论
感谢更新!我错过了4.7版本说明中的那个。
–汤姆·俄格(Tom Auger)
17年2月1日,在2:11
嘿@TomAuger,太酷了。此功能是ajax的Michael Jordan。谢谢23
–prosti
17年2月1日在14:42
#3 楼
Fuxias解决方案也返回false
,用于从管理面板发出的ajax请求。但是这些请求应该返回true
,因为您请求的数据是为管理员视图提供的。要解决此问题,可以使用以下功能:function saveIsAdmin() {
//Ajax request are always identified as administrative interface page
//so let's check if we are calling the data for the frontend or backend
if (wp_doing_ajax()) {
$adminUrl = get_admin_url();
//If the referer is an admin url we are requesting the data for the backend
return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
}
//No ajax request just use the normal function
return is_admin();
}
#4 楼
DOING_AJAX
常数会检查您是否在admin-ajax.php
中if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
// do something
}
评论
if(define('DOING_AJAX'))本身就足够了。该常数仅在admin-ajax.php中设置,因此您无需检查值。
–约翰·里德(John Reid)
2014年11月26日13:55
@JohnReid这是一个全局常量,任何人都可以将其设置为任何值,包括FALSE。
– fuxia♦
2014年11月26日下午16:36
好点子。 WP内核中没有设置该值的地方,但是我想这并不意味着某些流氓插件可能不会将其设置为false。先生,+ 1!
–约翰·里德(John Reid)
2014年12月1日上午10:32
这是Codex的方式,但是在实践中我看到人们在主题中设置该标志,因此,如果您想知道是否应该像ajax那样工作,则此解决方案很好,但如果您实际上需要知道这是一个ajax请求。
–马克·卡普伦
16-3-11在9:05