Пытаюсь подключить шорткод только на отдельной странице, чтобы лишний код не выполнялся на всех страницах, но 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>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно тестировать сайт который умеет работать только на 80 порту, но при этом на одном компьютере нужно запустить несколько версий приложенияЕсть...
Есть директория file в ней множество разных файлов, как удалить все файлы, которые созданы(загружены) 8 дней назад? Больше всего интересует как...
Задача, вытащить reviews компаний, на подобии этой: google reviews Есть ли библиотеки позволяющие спарсить на php? Я понимаю что здесь для подгрузки контента...