400 permintaan buruk pada admin-ajax.php hanya menggunakan kait tindakan wp_enqueue_scripts

15

Saya telah mengerjakan ajax belakangan ini. Tutorial yang Anda temukan di internet semuanya sangat mirip dan cukup mudah diterapkan. Tapi saya selalu mendapatkan 400 permintaan buruk pada ajax-admin.phpfile saya .

Setelah pencarian yang panjang dan intensif, sekarang saya tahu itu karena waktu integrasi.

Jika saya menggunakan initkait tindakan untuk menginisialisasi skrip dan wp_localize_script, semuanya berfungsi dengan baik. Jadi kodenya sendiri harus benar.

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

Tetapi jika saya menggunakan mis wp_enqeue_scriptshook tindakan saya selalu mendapatkan permintaan yang buruk.

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

Masalahnya adalah:

Saya ingin memiliki fungsi dalam file php tambahan dan memuatnya hanya jika diperlukan pada halaman tertentu. Untuk ini saya perlu, misalnya is_page(). Tetapi is_page()bekerja paling awal ketika saya menghubungkan fungsi dengan menyertakan ke dalam parse_querykait tindakan:

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

Jadi fungsi ketagihan untuk initmenghubungkan di my-page-test-functions.phpfile tidak memicu, saya kira, karena initdatang sebelum parse_query.

Apakah ada praktik terbaik untuk mengatur ini, sehingga berhasil? Atau bagaimana saya bisa memperbaiki admin-ajax.phppermintaan buruk saat menggunakan wp_enqeue_scriptshook tindakan?

Dosa
sumber

Jawaban:

13

Saya pikir satu-satunya hal yang hilang di sini adalah Anda harus pindah ke add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');luar ajax_login_init.

Kode itu mendaftarkan handler Ajax Anda, tetapi ketika Anda hanya menjalankannya wp_enqueue_scripts, sudah terlambat dan wp_ajax_nopriv_kait sudah berjalan.

Jadi, sudahkah Anda mencoba sesuatu seperti ini:

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

Edit:

Sekarang lebih jelas bahwa Anda hanya ingin memuat JavaScript pada halaman tertentu. Ini berarti Anda harus meletakkanis_page() bagian dalamajax_login_init() . Saya telah memperbarui kode yang sesuai.

Sekarang, mengapa solusi Anda tidak berhasil?

The is_page()cek berarti bahwa file fungsi Anda hanya dimuat pada halaman tertentu.ajax_login_init()dipanggil dan skrip Anda enqueued. Sejauh ini baik.

Sekarang skrip Anda melakukan panggilan ajax. Seperti disebutkan dalam komentar, panggilan ajax tidak mengetahui halaman saat ini. Ada alasan mengapa file itu berada wp-admin/admin-ajax.php. Tidak ada WP_Querydan karenanyais_page() tidak berfungsi selama permintaan ajax.

Karena itu tidak berhasil, sw18_page_specific_functions()tidak akan melakukan apa pun dalam konteks ajax. Ini berarti file fungsi Anda tidak dimuat dan penangan ajax Anda tidak ada.

Itu sebabnya Anda harus selalu menyertakan fungsi itu file dan memindahkan is_page()cek itu ke dalam ajax_login_init().

Jadi alih-alih sw18_page_specific_functions() { … }jalankan saja include_once dirname(__FILE__).'/includes/my-page-test-functions.php';secara langsung. Tanpa add_action( 'parse_query' )panggilan apa pun .

swissspidy
sumber
Saran yang bagus Saya telah mengubah itu (masih kesalahan yang sama), tetapi masalahnya masih bahwa file yang berisi fungsi akan memuat terlambat. Tapi saya butuh cara untuk membedakan halaman mana yang digunakan. - Saat ini saya coba ini dengan is_page () seperti yang dijelaskan di atas.
Dosa
Apakah Anda mencoba lari is_page()dari dalam ajax_login()atau dari dalam ajax_login_init(). Yang pertama tidak bisa bekerja karena itu dalam konteks Ajax.
swissspidy
Saya telah menyebutkan file-file yang fungsinya, seperti teks deskriptif di atas. Is_page () digunakan di functions.php dan berfungsi untuk memasukkan file dengan fungsi ajax hanya bila diperlukan.
Dosa
@Sin Sekali lagi, is_page()tidak berfungsi dalam konteks Ajax. Saya telah memperbarui jawaban saya sesuai dengan itu.
swissspidy
0

Ingatlah untuk memiliki nama fungsi 'tindakan' yang ditambahkan ke wp_ajax_tag.

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

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
Mohd Abdul Mujib
sumber
-3

hanya menulis mati; pada akhirnya seperti di bawah ini ...masukkan deskripsi gambar di sini

ZEe XhAn
sumber
8
Hai Zee Xhan. Selamat datang di situs ini. Jawaban Anda perlu beberapa revisi. Pertama, jika jawaban Anda adalah kode, jangan memposting tangkapan layar. Alih-alih, poskan kode sebagai potongan dan format kode sebagai kode (gunakan tombol {}). Itu kemungkinan alasan jawaban Anda diturunkan dan tidak diterima. Juga, sedikit penjelasan akan lebih membantu - seperti "mengapa" tulis saja die (), dan kemana tepatnya ini terkait dengan kode di OP (posting asli)?
butlerblog