【问题标题】:WordPress wp_ajax_nopriv not workingWordPress wp_ajax_nopriv 不工作
【发布时间】:2013-09-15 22:16:25
【问题描述】:

wp_ajax 完美运行(即登录时)。 wp_ajax_nopriv 不起作用(未登录时)。

我正在使用wp_localize_scriptadmin_url('admin-ajax.php') 传递给JS,如下所示:

add_action( 'wp_enqueue_scripts', 'child_enqueue_scripts' );

/**
 * Enqueue Custom Scripts
 * 
 * @since 1.0.0
 */
function child_enqueue_scripts() { 

    wp_enqueue_script( 'crl-js', CHILD_JS_URL . '/child.js', array('jquery'), '1.0.0', true );

    // Pass some parameters to javascript
    $params = array(
        'wp_admin_ajax_url'  => admin_url("admin-ajax.php"),
    );
    wp_localize_script( 'crl-js', 'childParams', $params ); 
}

JS 在这里:

(function($){

child = {
    name: 'child',
    wpAdminAjax: childParams.wp_admin_ajax_url || '',     

    gformAutoPopulate: function() {

        $('.p_location select').change( function(){

            var location = $(this).val(),
                pSelect = $( '.p select' );

            if ( location != "none" ) {

                $.ajax({
                    type:   'POST',
                    url:    child.wpAdminAjax,
                    data:   { 
                        pLocation: location, 
                        action: 'dynamically_update_p_dropdown' 
                    },
                    success: function(data) { 

                        pSelect.empty();
                        var options = $.parseJSON(data); 
                        for( i = 0; i < options.length; i++ ) {
                            pSelect.append( options[i] );
                        }
                        pSelect.removeAttr('disabled');
                    }
                });
            }
        });
    },
    ....
 })(jQuery);

这里的AJAX代码是:

add_action( 'wp_ajax_dynamically_update_p_dropdown', 'child_gforms_dynamically_update_p_dropdown' );
add_action( 'wp_ajax_nopriv_dynamically_update_p_dropdown', 'child_gforms_dynamically_update_p_dropdown' );

/**
 * AJAX Call to dynamically update the members dropdown
 * 
 * @since 1.0.0
 * 
 */
function child_gforms_dynamically_update_p_dropdown() {

    if( isset( $_POST['pLocation'] ) ) {       

        $location = esc_html( $_POST['pLocation'] );
        $ps = child_get_ps_by_location( $location );

        $options = array();
        foreach( $ps as $p ) 
        {                          
            $options[] = sprintf( '<option value="%s">%s</option>', esc_attr( $p['id'] ), esc_html( $p['name'] ) );
        }

        echo json_encode( $options );  
        die();
     }
}

已解决!我找到了。它与上面的代码无关。这只是我限制管理员访问 wp-admin 的方式:

add_action( 'admin_init', 'child_limit_backend_to_admin_only' );
/**
 * Redirect logged in user to the home page if they are not an admin
 * 
 * @since 1.0.0
 */
function child_limit_backend_to_admin_only() {

    if ( ! is_admin() ) return;

    // If not the admin, then redirect back to the home page
    if ( ! is_user_logged_in() || ! current_user_can( 'manage_options' ) ) {
        wp_redirect( home_url() ); exit;
    }    

}

我一注释掉钩子,就成功了。谢谢大家。

【问题讨论】:

  • 我会尝试将 JS 封装在 jQuery(document).ready(function($) { /* ALL JS */ }); 中。一个working example
  • 对不起,我没有包含整个 js 文件。它被封装为 (function($){ child = { ... } })(jQuery);
  • 定义 "is not working"。控制台错误? Debug information?
  • CHILD_JS_URL 设置为 wp-content/ 中的 assets/js

标签: ajax wordpress gravity-forms-plugin


【解决方案1】:

我的使用场景略有不同。我需要将没有适当权限的用户排除在管理区域之外,但仍需要允许这些用户进行 AJAX 调用。这是我用来完成此任务的函数。

add_action( 'admin_init', 'prefix_no_admin_access', 100 );
function prefix_no_admin_access() {
    $redirect = home_url('/');

  if( !is_admin() ) return;

  if( empty($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest' ) {
     if ( !current_user_can('delete_others_pages') ) {
       wp_redirect($redirect);
       exit;
      } 
  }
}

此附加检查确保请求类型为 AJAX。

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 2022-12-04
    • 2017-09-28
    • 2015-02-05
    • 2014-12-15
    • 2012-11-12
    • 2016-06-11
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多