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.