จะตรวจสอบได้อย่างไรว่าฉันอยู่ใน admin-ajax.php


27

ตอนนี้สำหรับปลั๊กอินของฉันฉันใช้in_admin()เพื่อตรวจสอบว่าผู้ใช้อยู่ในส่วนหน้าของเว็บไซต์หรือในพื้นที่ผู้ดูแลระบบ อย่างไรก็ตามปัญหาเกิดขึ้นเมื่อปลั๊กอินใช้admin-ajax.phpเพื่อประมวลผลคำขอ ajax

ฉันต้องการวิธีการลงทะเบียน hooks และ plugins เฉพาะเมื่อประมวลผลadmin-ajax.phpไฟล์หรือในส่วนหน้าของเว็บไซต์ วิธีที่ดีที่สุดในการทำเช่นนั้นคืออะไร?

คำตอบ:


61

DOING_AJAXตรวจสอบอย่างต่อเนื่อง wp-admin/admin-ajax.phpความหมายของมันคือรหัสแรกที่ทำงานใน ปลั๊กอินแปลก ๆ บางอย่างเช่น Jetpack กำลังกำหนดค่าคงที่ในสถานที่ที่ไม่คาดคิดดังนั้นคุณอาจรวมการตรวจสอบด้วยis_admin()เช่นกัน

ตัวอย่าง:

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}

ฉันขอวิธีที่ง่ายกว่าในการตรวจสอบเรื่องนี้เมื่อนานมาแล้วและในที่สุดก็ใช้งานใน 4.7.0

ดังนั้นสำหรับ WP 4.7 และสูงกว่าคุณสามารถใช้:

if ( wp_doing_ajax() )
{
    // do something
}

4
if ( defined( 'DOING_AJAX' ) )ก็เพียงพอด้วยตัวเอง ค่าคงที่ถูกตั้งค่าไว้เท่านั้นadmin-ajax.phpดังนั้นคุณไม่จำเป็นต้องตรวจสอบค่า
John Reid

5
@JohnReid มันเป็นค่าคงที่ทั่วโลกทุกคนสามารถตั้งค่าให้ค่าใด ๆ FALSEรวมทั้ง
fuxia

จุดดี. ไม่มีที่ใดในแกน WP ที่ตั้งค่านี้ แต่ฉันคิดว่ามันไม่ได้หมายความว่าปลั๊กอินหัวไม้บางอันอาจไม่ได้ตั้งค่าไว้falseแทน +1 สำหรับคุณครับ!
John Reid

1
มันเป็นวิธี codex แต่ในทางปฏิบัติฉันเห็นคนตั้งค่าสถานะนั้นในธีมของพวกเขาดังนั้นวิธีนี้ดีถ้าคุณต้องการทราบว่าคุณควรทำตัวเหมือนเป็นอาแจ็กซ์ แต่อาจจะไม่ดีที่สุดถ้าคุณจำเป็นต้องรู้ว่าจริงหรือไม่ มันเป็นคำขออาแจ็กซ์
Mark Kaplun

5

ข่าวดีฟังก์ชั่นที่มีตอนนี้

File: /wp-includes/load.php
1037: /**
1038:  * Determines whether the current request is a WordPress Ajax request.
1039:  *
1040:  * @since 4.7.0
1041:  *
1042:  * @return bool True if it's a WordPress Ajax request, false otherwise.
1043:  */
1044: function wp_doing_ajax() {
1045:   /**
1046:    * Filters whether the current request is a WordPress Ajax request.
1047:    *
1048:    * @since 4.7.0
1049:    *
1050:    * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
1051:    */
1052:   return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }

เพียงเพื่อสรุปการadmin-ajax.phpนิยามบางอย่างเช่นนี้

File: /wp-admin/admin-ajax.php
11: /**
12:  * Executing Ajax process.
13:  *
14:  * @since 2.1.0
15:  */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18:     define( 'WP_ADMIN', true );
19: }

ขอบคุณสำหรับการอัพเดท! ฉันพลาดไปหนึ่งอันในบันทึกย่อประจำรุ่น 4.7
Tom Auger

เฮ้ @TomAuger เจ๋ง ฟังก์ชั่นนี้คือ Michael Jordan ของ ajax ขอขอบคุณที่ 23
prosti

1

โซลูชัน Fuxias จะส่งคืนfalseคำขอ ajax จากแผงผู้ดูแลระบบด้วย แต่คำขอเหล่านี้ควรส่งคืนtrueเนื่องจากข้อมูลที่คุณร้องขอนั้นมีให้สำหรับมุมมองผู้ดูแลระบบ เพื่อแก้ไขปัญหานี้คุณสามารถใช้ฟังก์ชั่นต่อไปนี้:

function saveIsAdmin() {
    //Ajax request are always identified as administrative interface page
    //so let's check if we are calling the data for the frontend or backend
    if (wp_doing_ajax()) {
        $adminUrl = get_admin_url();
        //If the referer is an admin url we are requesting the data for the backend
        return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
    }

    //No ajax request just use the normal function
    return is_admin();
}

0

DOING_AJAX ตรวจสอบอย่างต่อเนื่องถ้าคุณอยู่ใน admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.