Bagaimana cara memeriksa apakah saya di admin-ajax.php?

27

Sekarang untuk plugin saya, saya menggunakan in_admin()untuk menentukan apakah pengguna berada di frontend situs atau di area admin. Namun, masalah terjadi ketika plugin digunakan admin-ajax.phpuntuk memproses permintaan ajax.

Saya perlu cara untuk mendaftarkan pengait dan plugin hanya saat memproses admin-ajax.phpfile atau di frontend situs. Apa cara terbaik untuk melakukan itu?

Extrakun
sumber

Jawaban:

61

Periksa konstanta DOING_AJAX. Definisinya adalah kode kerja pertama di wp-admin/admin-ajax.php. Beberapa plugin yang sangat aneh, seperti Jetpack, mendefinisikan konstanta itu di tempat-tempat yang tidak terduga , jadi Anda bisa menyertakan cek is_admin()juga.

Contoh:

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

Saya telah meminta cara yang lebih sederhana untuk memeriksa ini sejak lama, dan ini akhirnya diimplementasikan pada 4.7.0.

Jadi untuk WP 4.7 dan lebih tinggi, Anda dapat menggunakan:

if ( wp_doing_ajax() )
{
    // do something
}
fuxia
sumber
4
if ( defined( 'DOING_AJAX' ) )sudah cukup dengan sendirinya. Konstanta hanya diatur admin-ajax.phpsehingga Anda tidak perlu memeriksa nilai.
John Reid
5
@JohnReid Ini adalah konstanta global, siapa pun dapat mengaturnya dengan nilai apa pun, termasuk FALSE.
fuxia
Poin bagus. Tidak ada tempat di inti WP yang menetapkan nilai ini, tetapi saya kira itu tidak berarti bahwa beberapa plugin jahat mungkin tidak mengaturnya sebagai falsegantinya. A +1 untuk Anda, tuan!
John Reid
1
Ini adalah cara kodeks, tetapi dalam praktiknya saya melihat orang-orang mengatur bendera itu di tema mereka, jadi solusi ini bagus jika Anda ingin tahu apakah Anda harus berperilaku seperti itu ajax, tetapi mungkin bukan yang terbaik jika Anda benar-benar perlu tahu apakah itu adalah permintaan ajax.
Mark Kaplun
5

Berita bagus, fungsinya ada di sana sekarang.

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

Sekadar rekap, admin-ajax.phpdefinisi seperti ini.

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: }
prosti
sumber
Terima kasih atas pembaruannya! Saya melewatkan yang dalam catatan rilis 4,7.
Tom Auger
Hey @TomAuger, keren. Fungsi ini adalah Michael Jordan dari ajax. Terima kasih 23
prosti
1

Solusi Fuxias kembali falsejuga untuk permintaan ajax yang dibuat dari panel admin. Tetapi permintaan ini harus dikembalikan true, karena data yang Anda minta disediakan untuk tampilan admin. Untuk mengatasi masalah ini, Anda dapat menggunakan fungsi berikut:

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

DOING_AJAX cek konstan jika Anda masuk admin-ajax.php

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