Чому б не зареєструвати штрихкоди, якщо is_admin приладова панель?


10

Я помітив, що деякі плагіни, такі як Contact-form-7 , Nextgen-gallery , можливо інші, мають цікаву антифункцію не реєструвати свої шорткоди, коли is_admin()це правда.

Проблемним є те, що якщо ви хочете генерувати деякий динамічний контент (який може мати короткий код) з ajax, і використовувати "правильний" wp спосіб цього, admin-ajax.php, неможливо, щоб WP_ADMIN не був правдивим. Дивіться перші рядки admin-ajax.php:

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

Тепер, здається, є розширення PHP, які дозволять вам встановити визначену константу (хакі), або може бути спосіб зіпсуватись із недокументованою системою WP_Screen і $GLOBALS['current_screen']зробити is_admin()функцію повернення помилковою ?? Здається, найбільш корисним рішенням є публікація на сторінці або в корені сайту.

Чи загально для плагінів реєструвати свої шорт-коди, коли is_admin()це неправда? Якщо так, я не зміг знайти жодної документації чи причини для нього, крім того, що це може бути передчасна оптимізація.

Відповіді:


6

Я спостерігав те саме питання з контактною формою-7 деякий час назад.

Але зверніть увагу , що реєстрація шорткоди основи is_adminє doing_it_wrong ( див gmazzap`s відповіді )

Є дві причини, які здаються законними на перший погляд (і чому вони неправильні):

  1. (Навряд чи) Автор плагіна намагався оптимізувати скрипт, щоб реєструвати шорт-коди лише тоді, коли вони потрібні. У цьому випадку автор не вважав, що короткий код може використовуватися в запитах Ajax.

    Неправильно через те, що : ця оптимізація не забезпечує збільшення продуктивності. Він просто додає значення глобальному масиву "зареєстрованих шорткодів".

  2. (Це більш вірогідний) Автор плагіна навмисно відключив підтримку короткого коду в запитах Ajax. З Контактною формою-7 це можливо, тому що форми можна встановити на "Надіслати через Ajax". Однак ця функція вимагає, щоб форма завантажувала додаткові файли javascript, які не завантажуються, коли короткий код розбирається через Ajax і додається JavaScript через enqueue_scripts().

    Автор вирішив відключити підтримку Ajax, щоб запобігти появі повідомлень про помилки на кшталт "Не використовувати це: Форма відображається, але натискання кнопки" Надіслати "не працює.

    Таким чином, користувач буде бачити гарантовано працюючу форму або її немає.

    Неправильно тому, що : перевірка на предмет - is_adminце погана практика. Кондитон повинен перевірити, чи визначена константа DOING_AJAXі справжня.

Хоча більшість плагінів не використовують такий стан, але мало хто має таке обмеження, можливо , через проблеми в минулому.

Коли короткий код просто робить деякий вихід на сторінку, немає ніяких причин додавати будь-які умови адміністратора. Однак, коли короткий код також запускає файли js або css, то має сенс обмежити використання не-адміністратора / non-ajax запитів.


2
Нереєстрація короткого коду має майже нульовий вплив на продуктивність. Реєстрація просто додає змінну до масиву. Що , можливо , повільно, щоб виконати шорткод, щоб не зареєструвати його. Тож якщо це оптимізація перформації, це невдача. Якщо автор плагіну хоче вимкнути короткий код для ajax, перевірка на те, чи не is_adminробиться це_it_wrong, у WP є набагато кращі способи перевірити наявність запитів на ajax. Нарешті, якщо плагін запускає js / css, якщо він робить це добре (використовуючи 'wp_enqueue_scripts'дію), це не вплине на сторінки адміністратора, оскільки цей гак не запускається на сторінках адміністратора.
gmazzap

@gmazzap Дякую за відгук, я повністю згоден! Я оновив свою відповідь і додав вашу інформацію, щоб зрозуміти, що ця умова є поганою практикою.
Філіпп

Я не думаю, що №2 є ймовірним, оскільки enqueue_scripts не повинен впливати на the_contentдзвінки та дзвінки адміністратора-ajax.
NoBugs

3

Насправді, немає підстав не реєструвати шорт-коди в адміністраторі.

Якщо автор плагінів хоче відключити форму плагіна Ajax, вони повинні це зробити

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

замість перевірки на те, чи є адміністратор.

Зауважте, що в майбутньому, можливо, Shortcake буде вбудований в ядро, оскільки це "плагін для функцій".

Якщо це станеться, короткий код, не визначений адміністратором, не буде працювати з ним. Це дає ще одне підтвердження того, що немає причин не реєструвати шорт-коди в адміністраторі: навіть основні розробники працюють над речами, для яких потрібні короткі коди, доступні адміністратору.

Це означає, що ви маєте можливості:

  1. зв’яжіться з автором плагінів і подивіться, чи можуть вони виправити таку поведінку
  2. спробуйте знайти рішення самостійно

Щодо №2, насправді існують бібліотеки, які можуть змусити is_adminбути правдою. Вони є хакерськими, і я ніколи не використовував би їх у виробництві.

Приклад - Patchwork .

За його допомогою ви можете перекрити будь-яку спеціальну функцію PHP.

У плагіні MU ви можете виконати (повністю НЕОБХІДНО):

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

Це зробить is_admin()повернення помилковим на запити ajax.

Однак, як було сказано, це досить хакітно і вплине на поведінку інших плагінів (та основних) з непередбачуваними ефектами.

Ще одна річ, яку ви можете зробити, це зареєструвати обробник штрихкодів плагінів на запити адміністратора.

Наприклад, якщо код плагіна:

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

тоді ви можете написати ще один плагін, який робить:

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

Таким чином, короткий код буде доданий в обох випадках.

Це може чи не може працювати самостійно, залежно від іншого коду плагіна, але загальної відповіді на це немає.


Ви також можете add_shortcode('shortcode', array('their-class', 'their-function') )або подібне.
NoBugs

@nobugs звичайно :)
gmazzap

Або краще "вирішення", просто опублікуйте корінь сайту або сторінку, що за іронією долі, що робить NextGen.
NoBugs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.