Додавання admin-ajax.php до фронтену. Гарна чи погана ідея?


17

Я люблю admin-ajax.php. Але я ненавиджу локалізувати, щоб вказати на нього сценарії фронтену, і я хотів би, щоб за темами був рівноцінний, простий у пошуку файл. (Це також просто заважає мені бачити, що запити на передній план проходять через "/ wp-admin /". Без практичних причин, просто виглядає негарно IMO.)

Тому я просто скопіював admin-ajax.php в кореневий каталог на "/ajax.php", відкоригував шляхи включення та видалив постійне визначення WP_ADMIN. Здається, це працює як гангстери (зараз я можу просто направляти всі свої запити AJXFrontend на /ajax.php! І я все ще можу використовувати звичайні гачки wp_ajax у своїх плагінах!).

Але це безпечно? Що може піти не так? Оскільки це не вбудовано в ядро, я припускаю, що є вагомі причини, чому ні. Але переглядаючи код, я не бачу негайних проблем.

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


Ви можете забути про цей файл і пропустити його під час автоматичних оновлень, що може призвести до порушення роботи та залишення вразливих місць безпеки.
Гемм

Відповіді:


19

Ви можете просто використовувати RewriteRule до свого .htaccess над звичайними правилами перезапису постійної посилання:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

Тепер надсилайте ваші запити AJAX example.com/ajaxта не пропускайте основні зміни цього файлу після оновлення.


Чудова ідея! Це одна з тих речей, що, почувши це, ти думаєш, що "це так просто і очевидно!" Спасибі.
MathSmath

Я додав правило переписання відповідно до вашої пропозиції, але за example.com/ajaxURL-адресою 404. Не могли б ви детальніше пояснити, де саме в межах, .htaccessякщо я повинен додати це. Я маю його зараз між # BEGIN WordPress <IfModule mod_rewrite.c>і</IfModule> # END WordPress
Іван

Це працює. Мені не вистачало кінцевої косої риски У мене постійні посилання встановлені на /% прізвище% /
Джон

7

Перший: стандартизація. Якщо ви плануєте використовувати плагіни спільноти, швидше за все, вони не піклуються про ваш /ajax.phpфайл у корені документа. Тому вони не будуть використовувати його.

Якщо ви все збираєтеся згортати, це не проблема.

Друге: що робити, якщо ядро ​​оновлюється? Чи будете ви відстежувати та змінювати файл ajax?

Третє : незважаючи на admin-ajax.phpпроживання в сwp-admin ньому, він не завантажує жодного з елементів адміністративної області (наприклад, таблиці списків тощо). Він також не перевіряє аутентифікацію та не піддає щось чутливе до користувачів, які не ввійшли в систему. Іншими словами, це просто як передовий файл. Не про що хвилюватися.

Четверте: пов'язані з першим випуском, деякі додатки перевірять перед тим, як сліпо завантажувати функціонал, пов'язаний з ajax. Приклад наведено нижче. Ваш змінений ajax.php, ймовірно, не призведе до завантаження.

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

Нарешті: те, на що ви скаржитеся, використовуючи локалізацію для отримання URL-адреси Ajax - це добре зробити. Чому? Тому що ваші файли JS не знають жодного з елементів сервера. Ви будете вводити важку URL-адресу, яка зламається, якщо / коли сайт рухатиметься? Здається, поганий вибір.

Якщо ви дійсно не хочете локалізувати кожен сценарій, що використовує Ajax, просто зачепіть його wp_headдуже рано і виплюньте URL-адресу адміністратора ajax. Проблема вирішена (до речі, саме це робить область адміністратора).

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}

Спасибі, Кріс! Усі дійсні бали. Найголовніше, що ви мені допомогли зрозуміти, це те, що, хоча я не думав про це як про "головний хак" (оскільки я додавав, не змінюючи файл), це насправді, оскільки це залежить від інших функціональних можливостей в ядрі, які можуть змінюватися . Не надто сильно відрізняється від будь-якого іншого плагіна (який також може загинути після зміни основних функціональних можливостей), але, безумовно, філософсько інший. Дякую за думки!
MathSmath

Re: " Третє: ... Нічого не турбуватися. ", Що робити при спробі заблокувати каталог wp-admin, наприклад, використовуючи правила .htaccess для обмеження відомих безпечних діапазонів IP? Я припускаю, що для файлу ajax-admin.php потрібно зробити якийсь виняток? (Я кажу "припускаю", тому що я порожній, коли мова йде про правила .htaccess, і я не знаю, чи можливо це?).
Сепстер

Має бути можливість дозволити один файл, так.
chrisguitarguy

@chrisguitarguy це прекрасна відповідь, дякую. Я намагаюся, щоб адміністратор-ajax був завантажений на передньому кінці, оскільки я зворотно наближаю сайтurl до моєї постановочної / домашньої URL-адреси. Будь ласка, подивіться на це: посилання Чи можливо це зробити за допомогою додатка сторонніх розробників? Невже мій підхід?
paranza

5

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

Заціни:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

А потім у se83650.jsфайлі ви б посилалися на свою змінну se83650Ajax.ajaxurl.

Перевага цієї методики полягає в тому, що якщо у вас є багато плагінів, які намагаються скопіювати цю функціональність, вони не включають та не перезаписують одну і ту ж змінну. ajaxurlдосить загальне для включення, це дає вам більше вмісту, і це чудово грає з іншими розробниками.

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