400 yêu cầu xấu trên admin-ajax.php chỉ sử dụng hook hành động wp_enqueue_scripts


15

Gần đây tôi đã làm việc trên ajax. Các hướng dẫn bạn tìm thấy trên mạng đều rất giống nhau và khá dễ thực hiện. Nhưng tôi luôn nhận được một yêu cầu xấu 400 trong ajax-admin.phphồ sơ của mình .

Sau một thời gian dài tìm kiếm và chuyên sâu, tôi đã phát hiện ra rằng đó là do thời gian tích hợp.

Nếu tôi sử dụng inithook hành động để khởi tạo script và wp_localize_scriptmọi thứ sẽ hoạt động tốt. Vì vậy, mã phải chính xác.

my-page-test-tests.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();
}

Nhưng nếu tôi sử dụng ví dụ wp_enqeue_scriptshook hành động, tôi luôn nhận được yêu cầu xấu.

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

Vấn đề với điều này là:

Tôi muốn có các chức năng trong một tệp php bổ sung và chỉ tải chúng nếu chúng cần thiết trên một trang cụ thể. Đối với điều này tôi cần, ví dụ is_page(). Nhưng is_page()hoạt động sớm nhất khi tôi móc hàm với hàm bao gồm vào parse_querymóc hành động:

Hàm.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');

Vì vậy, các chức năng được nối để inithook trong my-page-test-functions.phptập tin không được kích hoạt, tôi cho rằng, bởi vì initđến trước parse_query.

Có một thực tiễn tốt nhất để tổ chức này, vì vậy nó hoạt động? Hoặc làm thế nào tôi có thể sửa admin-ajax.phpyêu cầu xấu khi sử dụng wp_enqeue_scriptshook hành động?

Câu trả lời:


13

Tôi nghĩ điều duy nhất còn thiếu ở đây là bạn cần phải di chuyển ra add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');ngoài ajax_login_init.

Mã đó đăng ký trình xử lý Ajax của bạn, nhưng khi bạn chỉ chạy nó wp_enqueue_scripts, đã quá muộn và các wp_ajax_nopriv_hook đã chạy.

Vì vậy, bạn đã thử một cái gì đó như thế này:

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

Biên tập:

Bây giờ rõ ràng hơn là bạn chỉ muốn tải JavaScript trên trang cụ thể đó. Điều này có nghĩa là bạn cần phải đặt is_page()bên trong của bạn ajax_login_init(). Tôi đã cập nhật mã cho phù hợp.

Bây giờ, tại sao giải pháp của bạn không hoạt động?

Các is_page()kiểm tra có nghĩa là tập tin chức năng của bạn chỉ được nạp trên trang đó cụ thể. ajax_login_init()được gọi và kịch bản của bạn mê hoặc. Càng xa càng tốt.

Bây giờ kịch bản của bạn thực hiện cuộc gọi ajax. Như đã đề cập trong các bình luận, các cuộc gọi ajax không biết về trang hiện tại bạn đang truy cập. Có một lý do các tập tin nằm ở wp-admin/admin-ajax.php. Không có WP_Queryvà do đó is_page()không hoạt động trong một yêu cầu ajax.

Vì điều đó không hiệu quả, sw18_page_specific_functions()sẽ không làm bất cứ điều gì trong bối cảnh ajax. Điều này có nghĩa là tệp chức năng của bạn không được tải và trình xử lý ajax của bạn không tồn tại.

Đó là lý do tại sao bạn cần luôn luôn bao gồm tệp chức năng đó và di chuyển is_page()kiểm tra bên trong ajax_login_init().

Vì vậy, thay vì sw18_page_specific_functions() { … }chỉ chạy include_once dirname(__FILE__).'/includes/my-page-test-functions.php';trực tiếp. Không có bất kỳ add_action( 'parse_query' )cuộc gọi nào .


Gợi ý tốt. Tôi đã thay đổi điều đó (vẫn cùng một lỗi), nhưng vấn đề vẫn là tập tin chứa các chức năng sẽ tải quá muộn. Nhưng tôi cần một cách để phân biệt trang nào được sử dụng. - hiện tại tôi thử cái này với is_page () như mô tả ở trên.
Tội lỗi

Bạn đang cố gắng chạy is_page()từ bên trong ajax_login()hay từ bên trong ajax_login_init(). Cái trước không thể hoạt động được vì nó nằm trong bối cảnh Ajax.
swissspidy

Tôi đã liệt kê các tập tin trong đó các chức năng, như văn bản mô tả ở trên. Is_page () được sử dụng trong hàm.php và phục vụ để bao gồm tệp với các hàm ajax chỉ khi cần.
Tội lỗi

@Sin Một lần nữa, is_page()không hoạt động trong bối cảnh Ajax. Tôi đã cập nhật câu trả lời của tôi cho phù hợp.
swissspidy

0

Hãy nhớ có tên chức năng 'hành động' được gắn vào wp_ajax_thẻ.

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

cứ viết chết đi; ở cuối như bên dưới ...nhập mô tả hình ảnh ở đây


8
Chào Zee Xhan. Chào mừng đến với trang web. Câu trả lời của bạn cần một số sửa đổi. Đầu tiên, nếu câu trả lời của bạn là mã, đừng đăng ảnh chụp màn hình. Thay vào đó, hãy đăng mã dưới dạng đoạn mã và định dạng mã dưới dạng mã (sử dụng nút {}). Đó có thể là lý do câu trả lời của bạn bị hạ cấp và không được chấp nhận. Ngoài ra, một chút giải thích sẽ hữu ích - như "tại sao" chỉ cần viết die (), và chính xác thì điều này đi đâu liên quan đến mã trong OP (bài gốc)?
butlerblog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.