Вопрос или проблема
Я использую следующую функцию в своем плагине, чтобы отобразить все дескрипторы скриптов на странице настроек моего плагина, но она отображает только дескрипторы административных скриптов:
function my_detected_scripts() {
global $wp_scripts;
foreach( $wp_scripts->queue as $handle ) :
echo $handle . ' <br /> ';
endforeach;
}
Затем:
echo my_detected_scripts()
Как я могу получить дескрипторы всех скриптов, подключенных только на фронт-энде?
Заранее спасибо!
Я думаю, что невозможно получить скрипты фронт-энда из скрипта, вызванного на заднем плане, потому что скрипты фронт-энда регистрируются только в скриптах, вызываемых на фронт-энде. Я думаю, единственный способ — сохранить временную опцию, включающую скрипты фронт-энда при загрузке страницы фронт-энда, и получить временную опцию через ajax на заднем плане. Возможно, это не лучший способ, но я не вижу других решений. Затем, конечно, вы можете добавить все условия с nonce… чтобы сохранить временную опцию только при определенных условиях…
Ответ или решение
Как отобразить хендлы всех enqueued-скриптов на странице настроек плагина
Если вы хотите отобразить все хендлы скриптов, подключённых на фронтенде, с помощью функции в вашем плагине, вам действительно нужно учитывать, что скрипты, загружаемые на фронтенде, не доступны во время выполнения кода на бэкенде. Давайте подробно разберёмся, как это можно реализовать, чтобы вам было удобно и эффективно.
Почему ваш код не работает
Ваш текущий код использует глобальную переменную $wp_scripts
, которая содержит информацию только о скриптах, загружаемых в административной панели WordPress. Поэтому, когда вы вызываете функцию my_detected_scripts()
, вы получаете доступ только к хендлам скриптов, которые были добавлены в очередь на бэкенде.
Решение через AJAX и транситы
Для получения всех хендлов скриптов, загруженных на фронтенде, вам необходимо воспользоваться AJAX. Мы можем сохранить хендлы скриптов в базе данных с помощью транситов и затем извлечь их на странице настроек плагина.
Шаги для реализации решения
- Сохраните хендлы скриптов на фронтенде: Мы будем использовать
wp_enqueue_scripts
, чтобы хранить хендлы скриптов, загружаемых на фронтенде, в транзите при загрузке страницы.
function my_enqueue_scripts() {
// Ваши скрипты.
wp_enqueue_script('my-script-handle', 'path/to/script.js');
// Сохранение хендлов скриптов в транзите.
$script_handles = array_keys( wp_scripts()->registered );
set_transient('my_frontend_scripts', $script_handles, 12 * HOUR_IN_SECONDS);
}
add_action('wp_enqueue_scripts', 'my_enqueue_scripts');
- Отображение хендлов на странице настроек плагина: Теперь вы можете извлечь хендлы скриптов с помощью
get_transient
и отобразить их на странице настроек вашего плагина.
function my_detected_scripts() {
$script_handles = get_transient('my_frontend_scripts');
if (false === $script_handles) {
echo 'Нет доступных скриптов.';
} else {
foreach ($script_handles as $handle) {
echo esc_html($handle) . '<br />';
}
}
}
- Вызов вашей функции на странице настроек: Теперь в нужном месте вашего файла настроек вы можете вызвать функцию:
echo my_detected_scripts();
Итог
С довольно простым решением с использованием AJAX и транзитов, вы сможете отображать хендлы всех загруженных на фронтенде скриптов на странице настроек вашего плагина. Это решение позволяет избежать сложностей, связанных с ограничениями контекста WordPress, и обеспечивает более гибкий подход к управлению скриптами.
Помните, что всегда рекомендуется следить за производительностью и не загружать слишком много данных в транзитах, чтобы избежать перегрузки системы. Пользуйтесь кэшированием с умом и добавляйте безопасность через нонсы, чтобы предотвратить несанкционированные запросы.