Вопрос или проблема
Я создаю плагин для шорткодов и хочу избежать загрузки ненужного кода, если шорткод не вызывается на странице.
У меня возникают проблемы с функциями ajax. Кажется, мне нужно загружать все очень рано в коде плагина, следовательно, загружать ненужный код для всего сайта.
Я говорю о привычных вызовах для добавления ajax
add_action( 'wp_ajax_the_ajax_hook', 'testFunction' ); add_action( 'wp_ajax_nopriv_the_ajax_hook', 'testFunction' );
и также функция для бэкенда нуждается в загрузке.
function testFunction(){ //выполнение какого-то серверного процесса с $POST echo 'это тестовая функция'; die(); }
Если я не загружаю add_action в моем “верхнем” коде плагина, я не получаю загруженный ajax.js.
Если я не загружаю testFunction в моем “верхнем” коде плагина, я получаю ошибку call_user_func_array() ожидает, что параметр 1 будет действительным обратным вызовом, функция ‘testFunction’ не найдена или недопустимое имя функции.
У меня нет проблем с загрузкой скриптов “по запросу”, когда вызывается шорткод, то есть:
wp_enqueue_script( 'my-ajax-handle', FAU_PLUGIN_URL . 'js/ajax.js', array( 'jquery' ) ); wp_localize_script( 'my-ajax-handle', 'the_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
Надеюсь, кто-то тоже сталкивался с этой проблемой… Заранее спасибо
Я не знаю, является ли это ‘лучшим’ местом, но get_header
достаточно рано, чтобы все еще добавлять скрипты:
function at_set_header () {
global $post, $has_the_shortcode;
if ( is_object( $post ) && has_shortcode( $post->post_content, 'shortcode_name') ) {
$has_the_shortcode = true;
wp_enqueue_script( 'my-ajax-handle', FAU_PLUGIN_URL . 'js/ajax.js', array( 'jquery' ) );
wp_localize_script( 'my-ajax-handle', 'the_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}
}
add_action( 'get_header', 'at_set_header');
Глобальная переменная $has_the_shortcode
может быть полезна, чтобы решить вопросы с другими ресурсами на более поздних этапах.
Ответ или решение
Вопрос о том, где лучше всего загружать действие wp_ajax_the_ajax_hook
в плагине, имеет важное значение для оптимизации работы вашего шорткода и предотвращения загрузки избыточного кода на других страницах сайта. Очевидно, вы стремитесь загружать код только тогда, когда это действительно нужно, что, безусловно, является хорошей практикой в разработке плагинов для WordPress.
Правильное место для загрузки wp_ajax_the_ajax_hook
Первым шагом является правильное определение места, где следует добавлять необходимые действия и скрипты. Добавление действий wp_ajax
и wp_ajax_nopriv
непосредственно в глобальный контекст плагина приведет к тому, что они будут загружаться везде, что не является оптимальным решением. Вместо этого, лучше загружать эти действия в условной конструкции, проверяющей наличие шорткода на странице.
Оптимизированная структура кода
Вы можете использовать хук get_header
, который позволяет добавлять код на раннем этапе загрузки страницы, но только для тех страниц, которые действительно содержат указанный вами шорткод. Вот пример кода, который иллюстрирует данный подход:
function enqueue_my_ajax_script() {
global $post;
if ( is_object( $post ) && has_shortcode( $post->post_content, 'my_shortcode_name' ) ) {
// Регистрация ajax обработчиков
add_action( 'wp_ajax_the_ajax_hook', 'testFunction' );
add_action( 'wp_ajax_nopriv_the_ajax_hook', 'testFunction' );
// Подключение JavaScript
wp_enqueue_script( 'my-ajax-handle', FAU_PLUGIN_URL . 'js/ajax.js', array( 'jquery' ) );
wp_localize_script( 'my-ajax-handle', 'the_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}
}
add_action( 'get_header', 'enqueue_my_ajax_script' );
function testFunction(){
// Обработка серверной логики
echo 'this is a test function';
wp_die(); // Лучше использовать wp_die() вместо die()
}
Объяснение кода
-
Использование
get_header
: Хукget_header
срабатывает на ранней стадии загрузки страницы, что позволяет подключать скрипты перед тем, как выполняется вывод HTML-кода. -
Проверка на наличие шорткода: Проверяется, содержится ли шорткод в контенте текущей записи. Это гарантирует, что необходимые действия и скрипты будут загружаться только тогда, когда это действительно нужно.
-
Ошибка
wp_die()
: В функции обработчика AJAX рекомендуется использоватьwp_die()
вместоdie()
, что позволяет корректно завершать выполнение и возвращать правильный ответ в AJAX-запросах.
Заключение
Данная структура способствует оптимизации работы вашего плагина, избегая загрузки лишнего кода, что улучшает производительность сайта в целом. Понимание контекста, в котором будет использоваться ваш плагин, а также тщательное управление загрузкой скриптов и функций, помогут вам создать эффективный инструмент, который дополнит функционал вашего сайта.
Если у вас есть дополнительные вопросы по данной теме или вы хотите обсудить другие аспекты разработки плагинов в WordPress, не стесняйтесь обращаться.