AJAX自定义搜索未按预期运行

时间:2013-09-26 作者:gaoshan88

我创建了一个自定义搜索,该搜索由ajax调用处理。它对管理员正常工作,但不适用于非管理员但已登录的用户。

管理员将获得返回的预期结果。非管理员的登录用户将出现ajax错误,甚至无法访问添加了的memberSearchAjax函数

add_action( \'wp_ajax_memberSearchAjax\', \'memberSearchAjax\' );

就像ajax请求试图admin-ajax.php 它以某种方式失败,但仅当登录的用户不是管理员时。

My question... why might this Ajax request only work for Admin and not for other logged in users?

一些代码。。。

我将自定义脚本排队并本地化:

function memberSearch_scripts() {
    wp_enqueue_script( \'memberSearch\', get_stylesheet_directory_uri() . \'/js/memberSearch.js\', array( \'jquery\' ) );
    wp_localize_script( \'memberSearch\', \'memberSearchObject\', array(
            \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) )
    );
}

//add_action( \'wp_enqueue_scripts\', \'memberSearch_scripts\' );
add_action( \'init\', \'memberSearch_scripts\' );
然后,一个名为memberSearchAjax的相当复杂的函数处理搜索。我对此使用add\\u操作,如下所示:

add_action( \'wp_ajax_memberSearchAjax\', \'memberSearchAjax\' );
add_action( \'wp_ajax_nopriv_memberSearchAjax\', \'memberSearchAjax\' ); <-- added this to see if it would help... doesn\'t
我的javascript ajax如下所示:

$(\'#searchMembersForm\').on(\'submit\', function (e) {
            e.preventDefault();
            $(\'.searchMembersLetter\').removeClass(\'active\');
            var spinner = \'<div class="ajax-spinner"><img src="/wp-content/themes/foobar/images/ajax-loader.gif" /></div>\';
            $(\'#memberSearchResults\').html(spinner);
            $.ajax({
                type: \'POST\',
                dataType: \'json\',
                url: memberSearchObject.ajaxurl,
                data: {
                    \'action\': \'memberSearchAjax\',
                    \'firstName\': $(\'#firstName\').val(),
                    \'security\': $(\'#security\').val(),
                    \'datasource\': 1
                },
                error:function(jqXHR, textStatus, errorThrown){
                    console.log(textStatus);
                    console.log(errorThrown);
                    console.log(jqXHR);
                    $(\'#memberSearchResults\').html(\'<p>There was an error with your request. It is: <br>\' + errorThrown.message + \'</p>\');
                },
                success: process
            });
        });
名为“process”的success函数非常复杂,因此我不包括它,但非管理员用户无论如何都无法访问它。

1 个回复
SO网友:gaoshan88

好啊事实证明,这是由于一段我认为不相关的代码造成的。为了让用户远离wp admin,我添加了:

function foobar_redirect_admin() {
    if( !current_user_can( \'edit_posts\' ) ) {
        wp_redirect( site_url() );
        exit;
    }
}

add_action( \'admin_init\', \'foobar_redirect_admin\' );
这会将非管理员用户从admin-ajax.php 以及导致ajax请求失败的wp admin后端。

结束