İs_admin gösterge tablosu varsa neden kısa kodlar kaydetmiyorsunuz?


10

Contact-form-7 , Nextgen-gallery , muhtemelen diğerleri gibi bazı eklentilerin is_admin(), doğru olduğunda kısa kodlarını kaydetmemenin ilginç bir anti-özelliği olduğunu fark ettim .

Sorun şu ki, ajax'tan bazı dinamik içerik (kısa kodlu olabilir) oluşturmak ve bunu yapmak için "doğru" wp yolunu kullanmak istiyorsanız, admin-ajax.php, WP_ADMIN'in doğru olması imkansızdır. Admin-ajax.php dosyasının ilk satırlarına bakın:

define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
    define( 'WP_ADMIN', true );
}

Şimdi, tanımlanmış bir sabit (hacky) un-set izin verecek PHP uzantıları var gibi görünüyor, ya da belgesiz WP_Screen sistemi ile karışıklık ve fonksiyon dönüş yanlış $GLOBALS['current_screen']yapmak için bir yol olabilir is_admin()?? En kullanışlı çözüm, sayfaya veya site köküne yayınlamak gibi görünüyor.

Eklentilerin is_admin()yanlış olduğu zaman kısa kodlarını kaydetmeleri yaygın mıdır ? Eğer öyleyse, erken bir optimizasyon olabileceğinden başka bir belge veya neden bulamadım.

Yanıtlar:


6

Aynı konuyu bir süre önce iletişim formu-7 ile de gözlemledim.

Ancak is_admin, kısa kodları temel alarak kayıt olmanın yanlış olduğunu unutmayın ( bkz. Gmazzap'ın cevabı )

İlk bakışta meşru görünen iki neden var (ve neden yanlışlar):

  1. (Olası değil) Eklenti yazarı , komut dosyasını yalnızca gerektiğinde kısa kodlar kaydedecek şekilde optimize etmeye çalıştı . Bu durumda yazar, kısa kodun Ajax isteklerinde kullanılabileceğini düşünmemiştir.

    Yanlış çünkü : Bu optimizasyon herhangi bir performans kazancı sağlamaz. Sadece global "kayıtlı kısa kodlar" dizisine bir değer ekler.

  2. (Bu daha olasıdır) Eklenti yazarı , Ajax isteklerindeki kısa kod desteğini kasıtlı olarak devre dışı bıraktı. Contact-Form-7 ile durum böyledir çünkü formlar "Ajax ile Gönder" olarak ayarlanabilir. Ancak, bu özellik, formun kısa kod Ajax üzerinden ayrıştırılması ve javascript eklenmesi yoluyla yüklenmeyen ek javascript dosyalarını yüklemesini gerektirir enqueue_scripts().

    Yazar, "Bunu kullanma: Form görüntülenir, ancak Gönder düğmesini tıklatmak çalışmaz. Zaman kaybını tamamlayın!" Gibi hata raporlarını önlemek için Ajax desteğini devre dışı bırakmaya karar verdi.

    Böylece kullanıcı ya garantili çalışan bir form görür ya da hiç bir form görmez.

    Yanlış çünkü : Kontrol etmek is_adminburada kötü bir uygulamadır. Durum sabitin DOING_AJAXtanımlanmış ve doğru olup olmadığını kontrol etmelidir .

Çoğu eklenti bu tür bir koşul kullanmasa da, bu kısıtlamaya sahip olan birkaç kişi geçmişte yaşanan sorunlar nedeniyle muhtemelen buna sahiptir.

Bir kısa kod basitçe sayfada bazı çıktılar alırken, herhangi bir yönetici koşulu eklemek için bir neden yoktur. Ancak, kısa kod js veya css dosyalarını da kuyruğa aldığında, kullanımı yönetici olmayan / ajax olmayan isteklerle sınırlamak mantıklıdır.


2
Kısa kodun kaydedilmemesinin performansta sıfıra yakın etkisi vardır. Kayıt işlemi bir diziye sadece bir değişken ekler. Ne muhtemelen yavaş kaydettirmek için değil, shortcode yapmaktır. Yani bir performans optimizasyonu ise, başarısız olanıdır. Eklenti yazarı ajax için kısa kodu devre dışı bırakmak istiyorsa is_admin, W_'de ajax isteklerini kontrol etmenin çok daha iyi yolları var. Son olarak, eklenti js / css'yi enqueque yaparsa, eğer iyi yaparsa ( 'wp_enqueue_scripts'eylemi kullanarak ) yönetici sayfalarını etkilemez, çünkü bu kanca yönetici sayfalarında tetiklenmez.
gmazzap

@gmazzap Geri bildiriminiz için teşekkür ederiz, tamamen katılıyorum! Cevabımı güncelledim ve durumun kötü bir uygulama olduğunu daha açık hale getirmek için girişinizi ekledim.
Philipp

Enqueue_scripts the_contentçağrıları ve admin-ajax çağrılarını etkilememesi gerektiği için # 2'nin muhtemel olduğunu düşünmüyorum .
NoBugs

3

Aslında, kısa kodları admin'e kaydettirmek için bir neden yoktur.

Eklenti yazarı Ajax eklenti formunu devre dışı bırakmak istiyorsa

if (defined('DOING_AJAX') && DOING_AJAX)

kontrol etmek yerine admin.

Gelecekte, "Özellik Eklentisi" olduğu için Shortcake'in çekirdeğe gömülebileceğini unutmayın.

Bu olursa, admin'de tanımlanmayan kısa kod onunla çalışmaz. Bu size kısa kodları yönetici olarak kaydetmemek için bir neden olmadığını başka bir doğrulama sağlar: çekirdek geliştiriciler bile yönetici üzerinde kısa kodlar gerektiren şeyler üzerinde çalışıyorlar .

Bununla birlikte, olasılıklarınız var:

  1. eklentiler yazarına başvurun ve bu davranışı düzeltebileceklerini görün
  2. kendiniz bir çözüm bulmaya çalışın

# 2 ile ilgili is_adminolarak, gerçek olmaya zorlayabilecek kütüphaneler var . Onlar çılgınca ve asla bunları üretimde kullanmam.

Patchwork buna bir örnek .

Bunu kullanarak herhangi bir PHP özel işlevini geçersiz kılabilirsiniz.

Bir MU eklentisinde şunları yapabilirsiniz (tamamen SINIRSIZ):

add_action('muplugins_loaded', function() {
  if ( defined('DOING_AJAX') && DOING_AJAX ) {
     require 'path/to/Patchwork.php';
     Patchwork\replace("is_admin", function() {
        return FALSE;
     });
  }
});

Bu is_admin(), ajax isteklerinde dönüşü yanlış yapar.

Bununla birlikte, söylendiği gibi, bu oldukça hacklidir ve diğer eklenti (ve çekirdek) davranışı öngörülemeyen etkilerle etkileyecektir.

Yapabileceğiniz başka bir şey, eklenti kısa kod işleyicisini yönetici isteklerine kaydetmektir.

Örneğin, eklenti kodu:

if (! is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

Sonra sen yapar başka bir eklenti yazabilirsiniz:

if (is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

Bu şekilde, her iki durumda da kısa kod eklenir.

Bu, diğer eklenti koduna bağlı olarak tek başına çalışabilir veya çalışmayabilir, ancak bunun genel bir cevabı yoktur.


Ayrıca add_shortcode('shortcode', array('their-class', 'their-function') )veya benzeri olabilir.
NoBugs

@nobugs of course :)
gmazzap

Ya da daha iyi bir "geçici çözüm", sadece sitenin köküne veya sayfaya NextGen'in yaptığı gibi ironik bir şekilde gönderin.
NoBugs
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.