Admin-ajax.php olup olmadığımı nasıl kontrol edebilirim?


27

Şu anda eklentim için, in_admin()kullanıcının sitenin ön tarafında mı yoksa yönetici alanında mı olduğunu belirlemek için kullanıyorum . Ancak, eklentiler admin-ajax.phpajax isteklerini işlemek için kullandığında sorun oluşur .

Kancaları ve eklentileri yalnızca admin-ajax.phpdosya işlerken veya sitenin ön tarafında kaydederken kullanmam gereken bir yol var . Bunu yapmanın en iyi yolu nedir?

Yanıtlar:


61

Sabitini kontrol et DOING_AJAX. Tanımı, içerideki ilk çalışma kodudur wp-admin/admin-ajax.php. Jetpack gibi bazı çok garip eklentiler beklenmedik yerlerde bu sabiti tanımlamaktadır , bu yüzden bir kontrol is_admin()de ekleyebilirsiniz.

Örnek:

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

Bunu uzun zaman önce kontrol etmenin daha basit bir yolunu istedim ve bu nihayet 4.7.0'da uygulandı.

Yani WP 4.7 ve üstü için kullanabilirsiniz:

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

4
if ( defined( 'DOING_AJAX' ) )kendi başına yeterli. Sabit sadece ayarlanmıştır, admin-ajax.phpböylece bir değeri kontrol etmeniz gerekmez.
— John Reid

5
@JohnReid Bu küresel bir sabittir, herkes de dahil olmak üzere herhangi bir değere ayarlayabilirsiniz FALSE.
— fuxia

İyi bir nokta. WP çekirdeğinde bu değeri ayarlayan hiçbir yer yok, ancak sanırım bazı sahte eklentinin bunu ayarlamayacağı anlamına gelmiyor false. Sizin için A +1 efendim!
— John Reid

1
Bu kodeks yolu, ancak pratikte insanların bu bayrağı kendi temalarına göre ayarladığını gördüm, bu yüzden bu çözüm, sanki ajax gibi davranmanız gerekip gerekmediğini bilmek istiyorsanız iyidir, ajax isteğidir.
— Mark Kaplun

5

İyi haber, işlev şimdi orada.

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

Sadece özetlemek için admin-ajax.php, böyle bir şey tanımlar.

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

Güncelleme için teşekkürler! Bunu 4.7 sürüm notunda kaçırdım.
— Tom Auger,

Hey @ TomAuger, harika. Bu fonksiyon ajax'ın bir Michael Jordan'ıdır. 23
— prosti

1

Fuxias çözümü false, yönetici panelinden yapılan ajax isteği için de geri döner . Ancak true, talep ettiğiniz veriler bir yönetici görünümü için sağlandığı için bu isteklerin geri dönmesi gerekir . Bu sorunu çözmek için aşağıdaki işlevi kullanabilirsiniz:

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 sürekli kontrol ediyorsanız admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.