Làm cách nào để kiểm tra xem tôi có trong admin-ajax.php không?


27

Ngay bây giờ cho plugin của tôi, tôi đang sử dụng in_admin()để xác định xem người dùng có ở trong lối vào của trang web hoặc trong khu vực quản trị hay không. Tuy nhiên, sự cố xảy ra khi các plugin sử dụng admin-ajax.phpđể xử lý các yêu cầu ajax.

Tôi cần một cách để đăng ký hook và plugin chỉ khi xử lý admin-ajax.phptệp hoặc ở lối vào của trang web. Cách tốt nhất để làm điều đó là gì?

Câu trả lời:


61

Kiểm tra hằng số DOING_AJAX. Định nghĩa của nó là mã làm việc đầu tiên trong wp-admin/admin-ajax.php. Một số plugin rất kỳ lạ, như Jetpack, đang xác định hằng số đó ở những nơi không mong muốn , vì vậy bạn cũng có thể bao gồm kiểm tra is_admin().

Thí dụ:

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

Tôi đã yêu cầu một cách đơn giản hơn để kiểm tra điều này từ lâu và điều này cuối cùng đã được thực hiện trong 4.7.0.

Vì vậy, đối với WP 4.7 trở lên, bạn có thể sử dụng:

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

4
if ( defined( 'DOING_AJAX' ) )là đủ của chính nó. Hằng số chỉ được đặt trong admin-ajax.phpnên bạn không cần kiểm tra giá trị.
John Reid

5
@JohnReid Đó là hằng số toàn cầu, bất kỳ ai cũng có thể đặt nó thành bất kỳ giá trị nào, bao gồm FALSE.
fuxia

Điểm tốt. Không có nơi nào trong lõi WP đặt giá trị này nhưng tôi cho rằng điều đó không có nghĩa là một số plugin lừa đảo có thể không đặt nó falsethay thế. +1 cho bạn, thưa ông!
John Reid

1
Đó là cách mã hóa, nhưng trong thực tế tôi đã thấy mọi người đặt cờ đó trong chủ đề của họ, vì vậy giải pháp này là tốt nếu bạn muốn biết liệu bạn có nên cư xử như vậy không, nhưng có thể không tốt nhất nếu bạn thực sự cần biết nếu đó là yêu cầu ajax.
Đánh dấu Kaplun

5

Tin tốt, chức năng là có ngay bây giờ.

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: }

Chỉ cần tóm tắt lại, admin-ajax.phpđịnh nghĩa một cái gì đó như thế này.

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: }

Cảm ơn các cập nhật! Tôi đã bỏ lỡ một trong những ghi chú phát hành 4.7.
Tom Auger

Này @TomAuger, tuyệt. Chức năng này là một Michael Jordan của ajax. Cảm ơn 23
prosti

1

Giải pháp Fuxias falsecũng trả về cho yêu cầu ajax được thực hiện từ bảng quản trị. Nhưng những yêu cầu này sẽ trả về true, vì dữ liệu bạn đang yêu cầu được cung cấp cho chế độ xem của quản trị viên. Để giải quyết vấn đề này, bạn có thể sử dụng chức năng sau:

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 kiểm tra liên tục nếu bạn đang ở trong admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
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.