Chamada AJAX para admin-ajax.php pelo assinante retorna home page

Estou fazendo uma chamada para admin-ajax.php para alterar o status da publicação (CPT advert) (rascunho / publicação) no front-end em uma configuração personalizada. Isso funciona bem para o usuário administrador. No entanto, ao fazer a mesma ação com o assinante e console.log, a resposta obto todo o conteúdo da página inicial retornada (nem mesmo erro).

Aqui está o meu código para chamar ajaxurl var:

// AJAXURL VAR add_action('wp_head', 'aii_ajaxurl'); add_action('admin_head', 'aii_ajaxurl'); function aii_ajaxurl() { echo ' var ajaxurl = "' . admin_url('admin-ajax.php') . '"; var nonce = "' . wp_create_nonce( 'aii_nonce' ) . '"; '; } 

Aqui está o meu código para processar a chamada ajax:

 // AJAX MYACCOUNT CHANGE STATUS add_action('wp_ajax_aii_ajax_status_advert', 'aii_ajax_status_advert'); add_action('wp_ajax_nopriv_aii_ajax_status_advert', 'aii_ajax_status_advert'); function aii_ajax_status_advert() { $result = ''; global $current_user; wp_get_current_user(); $permission = check_ajax_referer( 'aii_nonce', 'nonce', false ); if( $permission != false ) { if ( is_user_logged_in() ) { $advert_id_sanitized = sanitize_text_field($_POST['id']); if(is_numeric($advert_id_sanitized)){ $advert_id_clean = $advert_id_sanitized; $post_author_id = get_post_field( 'post_author', $advert_id_clean ); if($current_user->ID == $post_author_id){ $advert_status = sanitize_text_field($_POST['status']); if($advert_status == 'draft'){ $advert_status_clean = 'publish'; } if($advert_status == 'publish') { $advert_status_clean = 'draft'; } $result = wp_update_post( array( 'ID' => $advert_id_clean, 'post_status' => $advert_status_clean )); $result = 'success';//var_dump($_POST); } } } } else { $result = 'error'; } echo $result; die(); } 

Por fim, esta é a minha chamada JQuery AJAX:

  jQuery('.aii-table-col.change-status a').on('click', function(e) { e.preventDefault(); changeNumber = jQuery(this).attr('href'); changeNumber = changeNumber.slice(1); changeNonce = jQuery(this).data('nonce'); changeStatus = jQuery(this).data('status'); changeThis = jQuery(this); jQuery.ajax({ type: 'post', url: ajaxurl, data: { action: 'aii_ajax_status_advert', nonce: changeNonce, id: changeNumber, status: changeStatus }, success: function( result ) { console.log(result); if( result == 'success' ) { if(changeStatus=='draft'){ console.log('live now'); changeThis.find('i').removeClass('fa-play-circle-o'); changeThis.find('i').addClass('fa-pause-circle-o'); changeThis.data('status','publish'); changeThis.parent().parent().find('.status').empty().text('LIVE'); jQuery('.aii-toast').empty().append(' Advert is now live').fadeIn(250); setTimeout(function() { jQuery(".aii-toast").fadeOut(500) }, 3000); } if(changeStatus=='publish'){ console.log('pause now'); changeThis.find('i').removeClass('fa-pause-circle-o'); changeThis.find('i').addClass('fa-play-circle-o'); changeThis.data('status','draft'); changeThis.parent().parent().find('.status').empty().text('PAUSED'); jQuery('.aii-toast').empty().append(' Advert is now paused').fadeIn(250); setTimeout(function() { jQuery(".aii-toast").fadeOut(500) }, 3000); } } } }) }); 

Eu adicionei a ação wp_ajax_nopriv, mesmo que este assinante tenha de ser logado para poder redigir a publicação (CPT anúncio), de acordo com isso: https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_nopriv_(action) é nem mesmo necessário. Gente, o que eu estou perdendo? Por que isso está funcionando bem para admin, mas o assinante está estranhamente retornando (quando console.log os dados todo o conteúdo da HOME PAGE).

Solutions Collecting From Web of "Chamada AJAX para admin-ajax.php pelo assinante retorna home page"

Eu também enfrentei o mesmo problema,

Depois de verificar meus códigos functions.php , encontrei o seguinte código.

 add_action('init', 'blockusers_init'); function blockusers_init() { if (is_admin() && !current_user_can('administrator')) { wp_redirect(home_url()); exit; } } 

Este código redireciona a chamada do ajax para a página inicial.

Para resolver isso, adicione a condição DOING_AJAX ,

 add_action('init', 'blockusers_init'); function blockusers_init() { if (is_admin() && !current_user_can('administrator') && !defined('DOING_AJAX')) { wp_redirect(home_url()); exit; } } 

Espero que isso ajude você.