Выяснение целевой URL
В WordPress, все запросы AJAX должны быть сделаны по следующему адресу:
http://www.example.com/wp-admin/admin-ajax.php
Вы не должны сделать запрос AJAX непосредственно в файл, находящийся в плагине или тематический каталог.
Кроме того, не жестко закодировать вышеупомянутую URL, вместо этого вы должны использовать следующую функцию для построения URL:
<script>
ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>
В качестве альтернативы выше, вы можете использовать wp_localize_script()
, но это не требуется, это тоже хорошо.
Примечание. Не беспокойтесь о части «admin», этот URL-адрес является правильным для всех пользователей, включая пользователей без регистрации (гостя).
Расскажите WordPress, какую функцию использовать для запроса AJAX
Вы должны позволить WordPress знать, какая функция должна обработать ваш запрос AJAX.
Для этой цели вы будете создавать пользовательскую функцию, и зарегистрировать его с помощью wp_ajax_*
и wp_ajax_nopriv_*
крюки:
add_action('wp_ajax_mycustomfunc', 'mycustomfunc'); // Logged-in users
add_action('wp_ajax_nopriv_mycustomfunc', 'mycustomfunc'); // Guest users
function mycustomfunc() {
$whatever = esc_html($_POST['whatever']);
echo 'It works: '.$whatever;
exit; // This is required to end AJAX requests properly.
}
Не забудьте указать «mycustomfunc» в запросе AJAX слишком
И, наконец, вот как вы бы сделать надлежащий запрос AJAX:
(function ($) {
$(document).ready(function() {
var my_data = {
action: 'mycustomfunc', // This is required so WordPress knows which func to use
whatever: "yes it is" // Post any variables you want here
};
jQuery.post(ajax_url, my_data, function(response) {
alert('Got this from the server: ' + response);
});
});
})(jQuery);
Объединить все это
Если вы должны были поместить все это в один файл, вот как бы это сделать:
// Register my custom function for AJAX processing
add_action('wp_ajax_mycustomfunc', 'mycustomfunc'); // Logged-in users
add_action('wp_ajax_nopriv_mycustomfunc', 'mycustomfunc'); // Guest users
function mycustomfunc() {
$whatever = esc_html($_POST['whatever']);
echo 'It works: '.$whatever;
exit; // This is required to end AJAX requests properly.
}
// Inline JavaScript
add_action('wp_footer', 'my_inline_js');
function my_inline_js() { ?>
<script>
// Set the "ajax_url" variable available globally
ajax_url = "<?php echo admin_url('admin-ajax.php'); ?>";
// Make your AJAX request on document ready:
(function ($) {
$(document).ready(function() {
var my_data = {
action: 'mycustomfunc', // This is required so WordPress knows which func to use
whatever: "yes it is" // Post any variables you want here
};
$.post(ajax_url, my_data, function(response) { // This will make an AJAX request upon page load
alert('Got this from the server: ' + response);
});
});
})(jQuery);
</script>
<?php
}
Примечание: Для ajax_url
части, вы могли бы использовать wp_localize_script()
вместо того, чтобы установить его вручную, но он менее гибок, так как требует указания существующего скрипта в очереди, которого у вас может не быть.
Примечание. Кроме того, для вывода встроенного JavaScript вручную на страницу используется правильный крючок wp_footer
. Если вы используете wp_localize_script()
, тогда вместо этого вы должны использовать крюк wp_enqueue_scripts
.
Я бы предложил предложить в вашем плагине вариант для явного указания пути кода PHP при использовании вашего плагина. – crush
@crush Я бы определенно НЕ рекомендовал это делать. Пожалуйста, см. Мой подробный ответ. – Community
@usernotfound Нет, согласен. Я не понимал, что это было для WordPress в то время. – crush