Пытаюсь подключить шорткод только на отдельной странице, чтобы лишний код не выполнялся на всех страницах, но 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' );
Порядок загрузки 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(), см. выше).
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>
Продвижение своими сайтами как стратегия роста и независимости