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' )
.