从前端脚本使用admin-ajax.php时,is_admin()返回TRUE

时间:2012-06-19 作者:Thomas

今天我遇到了一个使用admin ajax的情况。来自前端脚本的php。据我所知,这是进行ajax调用的wp方式(使用wp\\u ajax\\u nopriv\\u myfunction挂钩注册我的函数)

在我看来,自从管理ajax以来。php位于admin端is\\u admin()返回true,而我的脚本从前端调用它。

这会导致我使用的插件出现问题,该插件在前端和管理端的功能有所不同。

所以我想知道我是不是做错了什么

是否有一种方法可以在前端使用ajax,即wp方式,并让is\\u admin()返回false?

希望我能让自己明白

5 个回复
SO网友:Stephen Harris

WordPress集合is_admin() 对于所有ajax请求(前端或管理端),为true。(参见codex).

没有办法超越这一点(而且你无论如何也不应该)。如果您的ajax请求可以从前端和管理端触发,那么您可能希望在发布数据时包括它是否为“管理”。但是,如果没有任何关于插件引起的“问题”的详细信息,就很难提供解决方案。

SO网友:dan9vu

is_admin() 始终返回true 对于每个AJAX调用。如果只想验证来自前端的AJAX调用,这可能是一个解决方案:

if (!isset($GLOBALS[\'current_screen\']) && !is_customize_preview()) {
    // AJAX calls from frontend, excludes customize preview screen.
}

SO网友:br3nt

我知道这很古老,但如果其他人偶然发现这一点,它会有所帮助。。。

我通常会在前端表单中设置某种标志,表示传入的请求是ajax。

<input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" />
最初将其设置为“false”,然后在开始处理ajax时将其切换为“true”。

$(\'#my_ajax_flag\').val(\'true\'); // example using jQuery
然后在代码的管理端,我检查该参数,然后要么包含ajax挂钩,要么执行常规的非ajax管理内容。例如:

if ( isset( $_REQUEST[\'my_ajax_flag\'] ) && $_REQUEST[\'my_ajax_flag\'] == \'true\' ) {
    add_action(\'wp_ajax_my_ajax_function\', \'my_ajax_function\');     
    add_action(\'wp_ajax_no_priv_my_ajax_function\', \'my_ajax_function\');
} else {
    // regular non-ajax stuff
}
根据您需要做什么,这个想法有多种变体,但它允许您在执行ajax请求时防止常规管理代码的干扰或触发。

另一个方便的建议是在表单中设置WordPress的“noheader”属性。

<input type="hidden" name="noheader" value="true" />
当进行最终导致重定向的后端处理时(建议避免可怕的双表单提交),在极少数情况下,您需要访问通常在“headers ready sent”之后出现的wp挂钩。

SO网友:Chris Sprague

我想使用仪表板菜单按钮启用/禁用前端和管理员的日志记录。我只是在菜单按钮中添加了一个类,然后用jQuery查询管理页面的状态

https://codex.wordpress.org/Class_Reference/WP_Admin_Bar/add_menu

添加一个类为admin状态的菜单项

$wp_admin_bar -> add_menu(
  array(
        \'title\'     => \'<span class="ab-icon"></span><span class="ab-label">\' . __( \'Console Logging\' , \'console-logging\' ) . \'</span>\',
        \'id\'        => \'your-custom-id\',
        \'parent\'    => false,
        \'href\'      => \'\',
        \'meta\'      => array(\'class\' => \'is-admin-\'.is_admin())//GET ACTUAL ADMIN OR NOT in php before page load
));
在javascript中使用jQuery获取菜单项并使用它:

 //\'is-admin-1\' when is_admin() is true
 //\'is-admin-0\' when is_admin() is false

var is_admin = $(\'#wp-admin-bar-your-custom-id\').hasClass(\'is-admin-1\');

if(is_admin){
    //You are actually on an admin page
}else{
    //You are on a front end page
}

SO网友:squarecandy

@如果你想测试,尤其是include ajax调用:

if ( defined( \'DOING_AJAX\' ) && DOING_AJAX ) :

如果你想具体测试,那么@wpclevel的答案是最好的exclude 任何管理/仪表板屏幕:

if ( ! isset( $GLOBALS[\'current_screen\'] ) && ! is_customize_preview() ) :

有很多重叠的用例,其中任何一个都可以工作,但有时您需要这些解决方案中的一个或另一个。

相关推荐

当调用Get_Current_User_id()时,跨域AJAX请求总是返回0;

我目前使用localhost,当我想测试对web服务器的ajax请求时,函数get\\u current\\u user\\u id()总是返回0。然而,当我从我的网站发出ajax请求时,它是有效的。在浏览器中打开文件还会返回当前wp\\U用户id。我向其发出请求的文件:<?php require_once $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-load.php\'; echo get_current_user_id(); 我的身体里有co