Лучшее место для загрузки действия wp_ajax_the_ajax_hook в плагине.

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

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

У меня возникают проблемы с функциями 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()
}

Объяснение кода

  1. Использование get_header: Хук get_header срабатывает на ранней стадии загрузки страницы, что позволяет подключать скрипты перед тем, как выполняется вывод HTML-кода.

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

  3. Ошибка wp_die(): В функции обработчика AJAX рекомендуется использовать wp_die() вместо die(), что позволяет корректно завершать выполнение и возвращать правильный ответ в AJAX-запросах.

Заключение

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

Если у вас есть дополнительные вопросы по данной теме или вы хотите обсудить другие аспекты разработки плагинов в WordPress, не стесняйтесь обращаться.

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

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