wp_enqueue_scripts 작업 후크 만 사용하여 admin-ajax.php에 대한 400 개의 잘못된 요청


15

나는 최근에 아약스 작업을 해왔다. 인터넷에서 찾은 자습서는 모두 매우 유사하고 구현하기가 쉽습니다. 그러나 나는 항상 내 파일 에 대한 잘못된 요청 400 을 얻습니다 ajax-admin.php.

길고 집중적 인 검색을 한 결과 통합 시점 때문임을 알게되었습니다.

init작업 후크를 사용하여 스크립트를 초기화 wp_localize_script하면 모든 것이 정상적으로 작동합니다. 따라서 코드 자체가 정확해야합니다.

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();
}

그러나 예를 들어 wp_enqeue_scripts액션 후크를 사용하면 항상 잘못된 요청이 발생합니다.

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

이 문제는 다음과 같습니다.

여분의 PHP 파일에 함수를 갖고 특정 페이지에 필요한 경우에만로드하고 싶습니다. 이를 위해 예를 들어 필요합니다 is_page(). 그러나 is_page()include와 함께 함수를 parse_query동작 후크에 연결 하면 가장 빨리 작동합니다 .

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

그럼 기능을하는 중독 init에 후크 my-page-test-functions.php트리거하지 않기 때문에, 나는 가정, 파일 init전에 온다 parse_query.

이를 구성하는 모범 사례가 있습니까? 또는 작업 후크를 admin-ajax.php사용할 때 잘못된 요청을 어떻게 해결할 수 wp_enqeue_scripts있습니까?

답변:


13

여기서 빠진 것은 add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');외부 로 이사해야한다는 것 ajax_login_init입니다.

이 코드는 Ajax 핸들러를 등록하지만에 만 실행할 때 wp_enqueue_scripts이미 너무 늦었고 wp_ajax_nopriv_후크가 이미 실행되었습니다.

따라서 다음과 같이 시도해 보셨습니까?

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();
}

편집하다:

이제 특정 페이지에만 JavaScript를로드하려는 것이 더 분명합니다. 이것은 당신이 is_page()안에 넣어야 함을 의미합니다 ajax_login_init(). 그에 따라 코드를 업데이트했습니다.

왜 솔루션이 작동하지 않습니까?

is_page()검사는 기능 파일은 특정 페이지에로드 된 것을 의미한다. ajax_login_init()호출되고 스크립트가 대기열에 추가됩니다. 여태까지는 그런대로 잘됐다.

이제 스크립트가 아약스 호출을합니다. 의견에서 언급했듯이 ajax 호출은 현재 페이지를 인식하지 못합니다. 파일이에있는 이유가 있습니다 wp-admin/admin-ajax.php. 아무 없습니다 WP_Query따라서 is_page()아약스 요청 동안 작업을하지 않습니다.

그것은 작동하지 않기 때문에 sw18_page_specific_functions()아약스 컨텍스트에서 아무것도 하지 않습니다 . 이는 함수 파일이로드되지 않고 ajax 핸들러가 존재하지 않음을 의미합니다.

그렇기 때문에 항상 해당 함수 파일을 포함하고 해당 is_page()검사를 내부 로 이동해야 ajax_login_init()합니다.

따라서 직접 sw18_page_specific_functions() { … }실행하는 대신 include_once dirname(__FILE__).'/includes/my-page-test-functions.php';. add_action( 'parse_query' )전화 하지 않고 .


좋은 제안. 나는 그것을 변경했지만 (여전히 같은 오류), 문제는 여전히 함수를 포함하는 파일이 너무 늦게로드된다는 것입니다. 그러나 어떤 페이지가 사용되는지 구별하는 방법이 필요합니다. -현재 위에서 설명한대로 is_page ()로 시도합니다.
Sin

is_page()내부 ajax_login()또는 내부 에서 실행하려고합니다 ajax_login_init(). 전자는 Ajax 컨텍스트에 있기 때문에 작동하지 않습니다.
swissspidy 2012 년

위의 설명 텍스트와 같이 함수가있는 파일을 열거했습니다. is_page ()는 functions.php에서 사용되며 필요할 때만 ajax 함수와 함께 파일을 포함하는 역할을합니다.
Sin

@Sin 다시, is_page()Ajax 컨텍스트에서 작동하지 않습니다. 이에 따라 답변을 업데이트했습니다.
swissspidy 2012 년

0

wp_ajax_태그에 '작업'기능 이름을 추가해야합니다 .

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);

-3

그냥 다이를 쓰십시오; 아래처럼 끝에서 ...여기에 이미지 설명을 입력하십시오


8
안녕 지 샨. 사이트에 오신 것을 환영합니다. 답변에 약간의 수정이 필요합니다. 먼저 답변이 코드 인 경우 스크린 샷을 게시하지 마십시오. 대신 코드를 스 니펫으로 게시하고 코드 형식으로 지정합니다 ({} 버튼 사용). 귀하의 답변이 다운되어 승인되지 않은 이유 일 수 있습니다. 또한 "왜"가 die ()를 작성하는 것과 같은 좀 더 설명이 도움이 될 것입니다. OP (원래 게시물)의 코드와 관련하여 정확히 어디로 이동합니까?
butlerblog
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.