400 คำขอไม่ถูกต้องบน admin-ajax.php ใช้เบ็ดการกระทำ wp_enqueue_scripts เท่านั้น


16

ฉันทำงานอาแจ็กซ์เมื่อเร็ว ๆ นี้ บทเรียนที่คุณพบบนอินเทอร์เน็ตนั้นคล้ายกันมากและง่ายต่อการใช้งาน แต่ฉันมักจะได้รับคำขอที่ไม่ดี 400ในajax-admin.phpไฟล์ของฉัน

หลังจากการค้นหาที่ยาวนานและเข้มข้นตอนนี้ฉันค้นพบแล้วว่าเป็นเพราะช่วงเวลาแห่งการรวมกลุ่ม

ถ้าฉันใช้initaction hook เพื่อเริ่มต้นสคริปต์และwp_localize_scriptทุกอย่างทำงานได้ดี ดังนั้นรหัสจะต้องถูกต้อง

ฉัน-หน้าทดสอบ 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_scriptsaction hook ฉันจะได้รับคำขอที่ไม่ดีเสมอ

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

ปัญหานี้คือ:

ฉันต้องการมีฟังก์ชั่นในไฟล์ php พิเศษและโหลดเฉพาะเมื่อจำเป็นในหน้าใดหน้าหนึ่งโดยเฉพาะ is_page()เพราะเราต้องนี้ยกตัวอย่างเช่น แต่is_page()ทำงานได้เร็วที่สุดเมื่อฉันขอใช้ฟังก์ชันโดยมีการรวมไว้ใน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ไฟล์ไม่ได้เรียกผมว่าเพราะมาก่อนinitparse_query

มีวิธีปฏิบัติที่ดีที่สุดในการจัดระเบียบสิ่งนี้หรือไม่ หรือฉันจะแก้ไขadmin-ajax.phpคำขอที่ไม่ดีเมื่อใช้wp_enqeue_scriptsตะขอการกระทำได้อย่างไร

คำตอบ:


13

ผมคิดว่าสิ่งเดียวที่ขาดหายไปที่นี่คือที่ที่คุณต้องการที่จะย้ายออกไปข้างนอกadd_action('wp_ajax_nopriv_ajaxlogin','ajax_login');ajax_login_init

รหัสนั้นลงทะเบียนตัวจัดการอาแจ็กซ์ของคุณ แต่เมื่อคุณเรียกใช้มันwp_enqueue_scriptsมันสายเกินไปแล้วและwp_ajax_nopriv_hooks ก็จะเริ่มทำงานแล้ว

คุณลองทำอะไรแบบนี้:

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 ดังที่ได้กล่าวไว้ในความคิดเห็นการโทร ajax ไม่ได้ตระหนักถึงหน้าปัจจุบันที่คุณอยู่ wp-admin/admin-ajax.phpมีเหตุผลไฟล์นั่งที่เป็น ไม่มีWP_Queryและจึงis_page()ไม่ทำงานในระหว่างการร้องขอ ajax

ตั้งแต่ที่ใช้งานไม่ได้sw18_page_specific_functions()จะไม่ทำอะไรเลยในบริบท ajax ซึ่งหมายความว่าไฟล์ฟังก์ชั่นของคุณไม่ได้โหลดและตัวจัดการ 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()อดีตไม่สามารถทำงานได้เพราะมันอยู่ในบริบทของอาแจ็กซ์
swissspidy

ฉันได้แจกแจงไฟล์ที่ฟังก์ชั่นเป็นข้อความอธิบายด้านบน is_page () ใช้ใน functions.php และทำหน้าที่รวมไฟล์ด้วยฟังก์ชัน ajax เมื่อจำเป็นเท่านั้น
Sin

@Sin อีกครั้งis_page()ไม่ทำงานในบริบท Ajax ฉันได้อัพเดตคำตอบแล้ว
swissspidy

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.