Dlaczego nie zarejestrować skrótów, jeśli pulpit nawigacyjny is_admin?


10

Zauważyłem, że niektóre wtyczki, takie jak Contact-form-7 , Nextgen-gallery , ewentualnie inne, mają ciekawą funkcję anty-rejestrowania swoich krótkich kodów, gdy is_admin()jest to prawdą.

Problem polega na tym, że jeśli chcesz wygenerować dynamiczną zawartość (która może mieć krótki kod) z ajax i użyć „poprawnego” sposobu wp, admin-ajax.php, niemożliwe jest, aby WP_ADMIN nie było prawdziwe. Zobacz pierwsze wiersze admin-ajax.php:

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

Teraz wydaje się, że istnieją rozszerzenia PHP, które pozwolą ci cofnąć zdefiniowaną stałą (hacky), lub może istnieć sposób na bałagan z nieudokumentowanym systemem WP_Screen i $GLOBALS['current_screen']sprawienie, że is_admin()funkcja zwróci false? Najbardziej użytecznym obejściem wydaje się być publikowanie na stronie lub w katalogu głównym witryny.

Czy wtyczki często rejestrują swoje krótkie kody, gdy is_admin()są fałszywe? Jeśli tak, to nie mogłem znaleźć żadnej dokumentacji ani innego powodu niż przedwczesna optymalizacja.

Odpowiedzi:


6

Jakiś czas temu zauważyłem ten sam problem z formularzem kontaktowym-7.

Ale uwaga, że w oparciu o rejestracji shortcodes is_adminjest doing_it_wrong ( patrz gmazzap`s odpowiedź )

Istnieją dwa powody, które na pierwszy rzut oka wydają się uzasadnione (i dlaczego się mylą):

  1. (Mało prawdopodobne) Autor wtyczki próbował zoptymalizować skrypt, aby rejestrować skróty tylko wtedy, gdy są potrzebne. W tym przypadku autor nie wziął pod uwagę, że shortcode może być użyty w żądaniach Ajax.

    Źle, ponieważ : Ta optymalizacja nie zapewnia żadnego wzrostu wydajności. Po prostu dodaje wartość do globalnej tablicy „zarejestrowanych skrótów”.

  2. (Jest to bardziej prawdopodobne). Autor wtyczki celowo wyłączył obsługę krótkiego kodu w żądaniach Ajax. W przypadku Contact-Form-7 jest to możliwe, ponieważ formularze można ustawić na „Prześlij przez Ajax”. Jednak ta funkcja wymaga, aby formularz załadował dodatkowe pliki javascript, które nie są ładowane, gdy krótki kod jest analizowany przez Ajax i dodawany jest javascript enqueue_scripts().

    Autor postanowił wyłączyć obsługę Ajax, aby zapobiec zgłaszaniu błędów, takich jak: „Nie używaj tego: formularz jest wyświetlany, ale kliknięcie przycisku Prześlij nie działa. Całkowite marnowanie czasu!”

    Tak więc użytkownik zobaczy albo formularz z gwarancją działania, albo nie będzie go wcale.

    Źle, ponieważ : Sprawdzanie, czy is_adminjest to zła praktyka tutaj. Warunek powinien sprawdzić, czy stała DOING_AJAXjest zdefiniowana i prawdziwa.

Chociaż większość wtyczek nie korzysta z tego rodzaju warunku, nieliczne, które mają to ograniczenie, prawdopodobnie mają to z powodu problemów w przeszłości.

Kiedy shortcode po prostu robi jakieś wyjście na stronie, nie ma powodu, aby dodawać jakiekolwiek warunki administratora. Jednak gdy krótki kod kolejkuje także pliki js lub css, wówczas sensowne jest ograniczenie użycia do żądań innych niż admin / nie-ajax.


2
Niezarejestrowanie krótkiego kodu ma prawie zerowy wpływ na wydajność. Rejestracja tylko dodaje zmienną do tablicy. Co to jest możliwie wolno jest wykonywać shortcode, nie aby go zarejestrować. Więc jeśli jest to optymalizacja wydajności, jest to porażka. Jeśli autor wtyczki chce wyłączyć shortcode dla ajax, sprawdzanie, czy robiis_admin to źle, istnieją w WP lepsze sposoby sprawdzania żądań ajax. Wreszcie, jeśli wtyczka kolejkuje plik js / css, jeśli zrobi to dobrze (za pomocą 'wp_enqueue_scripts'akcji), nie wpłynie to na strony administracyjne, ponieważ ten zaczep nie jest uruchamiany na stronach administracyjnych.
gmazzap

@gmazzap Dzięki za opinie, całkowicie się zgadzam! Zaktualizowałem swoją odpowiedź i dodałem twój wkład, aby wyjaśnić, że warunek jest złą praktyką.
Philipp

Nie sądzę, że # 2 jest prawdopodobne, ponieważ skrypty_kolejkowe nie powinny wpływać na the_contentwywołania i wywołania admin-ajax.
NoBugs

3

Właściwie nie ma powodu, aby nie rejestrować skrótów w adminie.

Jeśli autor wtyczek chce wyłączyć wtyczkę z Ajax, powinien to zrobić

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

zamiast sprawdzać to admin.

Zauważ, że w przyszłości możliwe jest, że Shortcake zostanie osadzony w rdzeniu, ponieważ jest to „wtyczka funkcji”.

Jeśli tak się stanie, krótki kod niezdefiniowany przez administratora nie będzie z nim działał. To daje ci kolejne potwierdzenie, że nie ma powodu, aby nie rejestrować skrótów w adminie: nawet programiści pracują nad rzeczami, które wymagają skrótów dostępnych w adminie.

To powiedziawszy, musisz mieć możliwości:

  1. skontaktuj się z autorem wtyczek i sprawdź, czy mogą naprawić to zachowanie
  2. spróbuj znaleźć rozwiązanie samodzielnie

Jeśli chodzi o # 2, faktycznie istnieją biblioteki, które mogą wymusić is_adminprawdziwość. Przez to, że są hackerskie i nigdy nie użyłbym ich w produkcji.

Przykładem jest Patchwork .

Za jego pomocą możesz zastąpić dowolną niestandardową funkcję PHP.

We wtyczce MU możesz (całkowicie NIETESTOWANY):

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

Spowoduje to, że is_admin()zwrot będzie fałszywy dla żądań ajax.

Jednak, jak powiedziano, jest to dość hackerskie i wpłynie na zachowanie innych wtyczek (i rdzenia) z nieprzewidywalnymi efektami.

Inną rzeczą, którą możesz zrobić, to zarejestrować moduł obsługi krótkiego kodu wtyczki na żądanie administratora.

Np. Jeśli kod wtyczki to:

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

Następnie pan może napisać inną wtyczkę, która robi:

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

W ten sposób shortcode zostanie dodany w obu przypadkach.

To może, ale nie musi działać samodzielnie, w zależności od innego kodu wtyczki, ale nie ma na to ogólnej odpowiedzi.


Możesz także add_shortcode('shortcode', array('their-class', 'their-function') )lub podobnie.
NoBugs

@nobugs oczywiście :)
gmazzap

Lub lepsze „obejście”, po prostu opublikuj w katalogu głównym witryny lub na stronie, co, jak na ironię, robi NextGen.
NoBugs,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.