400 pedido incorreto em admin-ajax.php usando apenas wp_enqueue_scripts-action-hook

10

Eu tenho trabalhado em ajax ultimamente. Os tutoriais que você encontra na rede são todos muito semelhantes e fáceis de implementar. Mas eu sempre recebo um pedido incorreto de 400 no meu ajax-admin.php

Depois de uma pesquisa longa e intensa, descobri agora que é devido ao tempo de integração.

Se eu usar o 'init'-action-hook para inicializar o script e o wp_localize_script, tudo funciona bem. Então o código em si deve estar correto.

//my-page-test-functions.php
function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

Mas se eu usar, e. 'wp_enqeue_scripts'-action-hook Eu sempre recebo o pedido incorreto.

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

O problema com isso é:

Eu gostaria de ter as funções em um php extra e carregá-las somente se elas forem necessárias em uma determinada página. Para isso eu preciso, por exemplo, is_page (). Mas is_page () funciona o mais cedo possível quando eu ligar a função com o include no 'parse_query'-action-hook:

//functions.php
function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

Então, em my-page-test-functions.php, 'init' não funciona, suponho porque o init vem antes do parse_query.

Existe alguma prática recomendada para organizar isso, então funciona? Ou como posso corrigir a solicitação incorreta admin-ajax.php ao usar o gancho de ação wp_enqeue_scripts?

Difícil de descrever, mas espero que seja bastante compreensível.

    
por Sin 17.01.2018 / 11:39

2 respostas

11

Acho que a única coisa que falta aqui é que você precisa mover add_action('wp_ajax_nopriv_ajaxlogin','ajax_login'); fora ajax_login_init .

Esse código registra seu manipulador de Ajax, mas quando você o executa apenas em wp_enqueue_scripts , já é tarde demais e wp_ajax_nopriv_ hooks já estão sendo executados.

Então, você já tentou algo assim:

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

Editar:

Agora, fica mais claro que você deseja apenas carregar o JavaScript nessa página específica. Isso significa que você precisa colocar seu is_page() dentro de ajax_login_init() . Eu atualizei o código de acordo.

Agora, por que sua solução não funcionou?

A verificação is_page() significa que o arquivo de funções foi carregado apenas nessa página específica. ajax_login_init() é chamado e seus scripts são colocados em fila. Até aí tudo bem.

Agora seu script faz a chamada do ajax. Como mencionado nos comentários, as chamadas ajax não estão cientes da página atual em que você está. Há uma razão para o arquivo ficar em wp-admin/admin-ajax.php . Não há WP_Query e, portanto, is_page() não funciona durante uma solicitação de ajax.

Como isso não funciona, sw18_page_specific_functions() não fará nada em um contexto de ajax. Isso significa que seu arquivo de funções não está carregado e seu manipulador de ajax não existe.

É por isso que você precisa sempre incluir esse arquivo de funções e mover esse is_page() check dentro de ajax_login_init() .

Então, em vez de sw18_page_specific_functions() { … } , basta executar include_once dirname(__FILE__).'/includes/my-page-test-functions.php'; diretamente. Sem nenhuma chamada add_action( 'parse_query' ) .

    
por swissspidy 17.01.2018 / 11:48
-1

apenas escreva morrer; no final, como abaixo ...

    
por ZEe XhAn 12.11.2018 / 14:12