Как мне отобразить хендлы всех скриптов, подключенных на фронтенде, на странице опций плагина?

Вопрос или проблема

Я использую следующую функцию в своем плагине, чтобы отобразить все дескрипторы скриптов на странице настроек моего плагина, но она отображает только дескрипторы административных скриптов:

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. Мы можем сохранить хендлы скриптов в базе данных с помощью транситов и затем извлечь их на странице настроек плагина.

Шаги для реализации решения

  1. Сохраните хендлы скриптов на фронтенде: Мы будем использовать 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');
  1. Отображение хендлов на странице настроек плагина: Теперь вы можете извлечь хендлы скриптов с помощью 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 />';
        }
    }
}
  1. Вызов вашей функции на странице настроек: Теперь в нужном месте вашего файла настроек вы можете вызвать функцию:
echo my_detected_scripts();

Итог

С довольно простым решением с использованием AJAX и транзитов, вы сможете отображать хендлы всех загруженных на фронтенде скриптов на странице настроек вашего плагина. Это решение позволяет избежать сложностей, связанных с ограничениями контекста WordPress, и обеспечивает более гибкий подход к управлению скриптами.

Помните, что всегда рекомендуется следить за производительностью и не загружать слишком много данных в транзитах, чтобы избежать перегрузки системы. Пользуйтесь кэшированием с умом и добавляйте безопасность через нонсы, чтобы предотвратить несанкционированные запросы.

Оцените материал
Добавить комментарий

Капча загружается...