AJAX вызов во фронтенде WordPress
В моем плагине я использую два AJAX-вызова в панели администратора, которые работают хорошо. Но для обеспечения той же функциональности во фронтенде я создал копии этих двух функций с другими именами. Вот мой код:
В основном файле плагина:
function my_action_callback(){
global $wpdb;
if (@$_POST['id']) {
$daty = $wpdb->get_results("select eemail_id,eemail_content,eemail_subject from " . WP_eemail_TABLE . " where 1=1 and eemail_status='YES' and eemail_id=" . $_POST['id']);
//выбрать eemail_id,eemail_content,eemail_subject из WP_eemail_TABLE где 1=1 и eemail_status='YES' и eemail_id=".$_POST['id']
if (!empty($daty)) {
foreach ($dat as $datt) {
echo $datt->eemail_content . "_" . $datt->eemail_subject;
die();
}
}
}
}
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
И в моем settings.js:
function showEntryfront(id)
{
jQuery(document).ready(function($) {
var data = {
action: 'my_action',
id: id
};
jQuery.post(ajaxurl, data, function(response) {
//alert('Получено с сервера: ' + response);
var n=response.split("_");
jQuery('textarea#mail_contents').text(n[0]);
$('#mail_subject').val(n[1]);
// jQuery('textbox#mail_subject').text(n[1]);
});
});
}
А страница плагина, которая вызывает showEntryfront():
<select name="eemail_subject_drop" id="eemail_subject_drop" onchange="showEntryfront(this.value)">
<option value="">Выберите тему письма</option>
<?php echo $eemail_subject_drop_val; ?>
</select>
<input type="hidden" name="send" value="" id="send" /> </td>
<tr height="60px;"> <td>
<textarea name="mail_contents" id="mail_contents" rows="4" cols="40" ></textarea>
</td></tr>
Вторая функция делает то же самое, только таблица базы данных другая.
В консоли Firebug по-прежнему показывается:
ReferenceError: ajaxurl is not defined
jQuery.post(ajaxurl, data, function(response) {
И textarea не заполняется данными из таблицы WP_eemail_Table. Обратите внимание, что эта функциональность работала в панели администратора WordPress. Я знаю, что AJAX-вызов в админке автоматически загружается через admin-ajax.php, но как реализовать то же самое во фронтенде? Есть ли ошибки в моем коде?
Для локализации скрипта необходимо использовать функцию wp_localize_script
. В административной части сайта переменная ajaxurl
уже доступна. Однако на стороне фронтенда вам нужно локализовать скрипт, чтобы определить ajaxurl
.
Пример:
wp_enqueue_script( 'custom-ajax-request', '/path/to/settings.js', array( 'jquery' ) );
wp_localize_script( 'custom-ajax-request', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

В WordPress действительно есть встроенное решение для использования Ajax на фронтенде!
В WordPress есть малоизвестная, но очень полезная JavaScript-библиотека, доступная через объект window.wp
, например:
// В JS:
var action = 'my_action';
var data = {id: 123};
var promise = window.wp.ajax.post( action, data );
promise.always(function(response) {
console.log('Ajax завершен:', response);
});
// объект promise также имеет другие методы:
// `done()` / `fail()` / `progress()` / `state()` / `abort()`
Преимущество в том, что этот объект поддерживается и используется ядром WordPress. Поэтому можно быть уверенным, что это актуальный, рабочий и наиболее надежный способ обработки Ajax. Также обратите внимание, что не нужно работать с jQuery...
Если у вас нет объекта window.wp
во фронтенде, убедитесь, что вы добавили wp-util
в зависимости ваших JS-скриптов, например:
wp_register_script( 'your-handle', 'https://your-domain.com/path/to/file.js', [ 'wp-util' ] );
