Порядок срабатывания событий, ajax

126
19 декабря 2020, 08:50

Пытаюсь подключить шорткод только на отдельной странице, чтобы лишний код не выполнялся на всех страницах, но ajax не работает.
Можете объяснить порядок срабатывания хуков, почему в хуке wp_enqueue_scripts не срабатывает wp_ajax_?

function my_wp_enqueue_scripts() {
    $allowed_pages = [
        'about',
        'contact',
    ];
    if ( is_page( $allowed_pages ) ) {
        add_shortcode( 'cool_shortcode', 'cool_shortcode_callback' );
        wp_enqueue_script( 'cool-script', get_stylesheet_directory_uri() . '/js/cool.js', [ 'jquery' ], '1.0', true );
        function cool_shortcode_callback( $atts ) {
            return 'cool';
        }
        function create_payment_form(){
            echo 'ok';
        }
        add_action('wp_ajax_create_payment_form', 'create_payment_form');
        add_action('wp_ajax_nopriv_create_payment_form', 'create_payment_form');
    }
}
add_action( 'wp_enqueue_scripts', 'my_wp_enqueue_scripts' );
Answer 1

Порядок загрузки WordPress несколько отличается при ajax и обычном показе страницы.

Что происходит при вызове ajax? Управление получает файл admin-ajax.php. Он производит инициализацию ядра и плагинов, подключая файлы wp-load.php -> wp-config.php -> wp-settings.php.

В то же время при обычной загрузке страницы, кроме этого, из wp-blog-header.php вызывается wp() (главный запрос WordPress) и template-loader.php (старт темы для вывода страницы).

Событие wp_enqueue_scripts создаётся во время события wp_head, которое создаётся функцией wp_head(). Это происходит, как легко догадаться из пояснений выше, только при обычной загрузке страницы.

Возвращаясь к вопросу, можно ответить так: при работе ajax файл functions.php темы читается, хук my_wp_enqueue_scripts добавляется в таблицу хуков, но никогда не выполняется. Потому что ajax не выводит заголовок страницы и не вызывает wp_head().

Более того, функции типа is_page() не будут работать в ajax, потому что не выполнен главный запрос WordPress (не вызван wp(), см. выше).

Answer 2

functions.php

<?php
$action = 'my_script';
add_action ('wp_enqueue_scripts', function () use ($action) {
    wp_register_script ($action, get_stylesheet_directory_uri () . '/script.js');
    wp_localize_script (
        $action,
        'foo',
        [
            'ajax_url' => admin_url ('admin-ajax.php'),
            'ajax_nonce' => wp_create_nonce ("{$action}_nonce"),
            'bar' => 'baz'
        ]
    );
    wp_enqueue_script ($action);
});
add_action ("wp_ajax_{$action}", function () use ($action) {
    if (wp_verify_nonce ($_POST ['_nonce'], "{$action}_nonce"))
        echo 'ok';
    wp_die ();
});

script.js

const data = new FormData ()
data.append ('_nonce', foo.ajax_nonce)
data.append ('action' , 'my_script')
fetch (foo.ajax_url, {method: 'POST', body: data}).then (r => r.text ()).then (alert)

index.php

<html>
    <head>
        <?php wp_head (); ?>
    </head>
</html>
READ ALSO
Сделать выбор в php

Сделать выбор в php

Необходимо сделать, чтобы из строки

98
nginx полная изоляция приложения

nginx полная изоляция приложения

Нужно тестировать сайт который умеет работать только на 80 порту, но при этом на одном компьютере нужно запустить несколько версий приложенияЕсть...

124
Узнать когда загружен файл

Узнать когда загружен файл

Есть директория file в ней множество разных файлов, как удалить все файлы, которые созданы(загружены) 8 дней назад? Больше всего интересует как...

136
можно ли на php спарсить reviews от google

можно ли на php спарсить reviews от google

Задача, вытащить reviews компаний, на подобии этой: google reviews Есть ли библиотеки позволяющие спарсить на php? Я понимаю что здесь для подгрузки контента...

124