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_script
将admin_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 不工作的主要内容,如果未能解决你的问题,请参考以下文章