WordPress wp_ajax_nopriv 不工作

Posted

技术标签:

【中文标题】WordPress wp_ajax_nopriv 不工作【英文标题】:WordPress wp_ajax_nopriv not working 【发布时间】: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 【参考方案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。

【讨论】:

以上是关于WordPress wp_ajax_nopriv 不工作的主要内容,如果未能解决你的问题,请参考以下文章

wordpress 评价|wordpress 好用吗?完整评价与介绍

wordpress怎样安装主题

什么是WordPress?

wordpress是啥

如何安装Wordpress

如何进行wordpress的二次开发