【发布时间】: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
标签: ajax wordpress gravity-forms-plugin