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