Вопрос или проблема
Я хотел бы иметь кнопку для сброса всех пользовательских полей для цен, кнопка должна работать со страницы редактирования автора (агентства), потому что я хотел бы очистить цены всех квартир (постов) одного и того же автора (агентства) “одним махом”. У меня уже есть эта кнопка. Это кнопка на странице редактирования автора:
<button type="button" ID="target2" data-author-id="<?php echo get_current_user_id(); ?>">Сбросить цены 2
</button>
это код, который я добавил в functions.php
add_action('admin_enqueue_scripts', 'reset_price_fields');
function reset_price_fields( $hook ) {
if ( 'user-edit.php' != $hook ) {
return;
}
wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/cancella_prezzi_2.js/', array('jquery'), '1.0' );
$title_nonce = wp_create_nonce( 'title_example' );
wp_localize_script(
'ajax-script',
'my_ajax_obj',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => $title_nonce,
)
);
}
и вот это:
add_action('wp_ajax_reset_price_fields', 'reset_price_fields2');
function reset_price_fields2() {
check_ajax_referer( 'title_example' );
// Проверка необходимого параметра
if (!isset($_POST['author_id'])) {
wp_send_json_error(['message' => 'Не указан идентификатор автора.']);
exit;
}
$author_id = intval($_POST['author_id']);
$args = [
'post_type' => 'post', // Замените на ваш пользовательский тип поста
'author' => $author_id,
'posts_per_page' => -1 // Получить все посты
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
// Получить текущие пользовательские поля
$custom_fields = get_post_meta($post_id);
// Подготовить массив пользовательских полей для сброса
$fields_to_reset = ['1_per_hol', '2_periodo']; // Замените на ключи ваших пользовательских полей
foreach ($fields_to_reset as $field) {
if (array_key_exists($field, $custom_fields)) {
// Удалить конкретное пользовательское поле
delete_post_meta($post_id, $field);
}
}
}
wp_send_json_success(['message' => 'Цены были успешно сброшены.']);
} else {
wp_send_json_error(['message' => 'Посты для этого автора не найдены.']);
}
wp_reset_postdata();
exit;
}
это код моего js файла, размещенного в папке js моей темы (назван: cancella_prezzi_2):
jQuery(document).ready(function($) {
$('#target2').on('click', function() {
if (confirm("Вы действительно хотите удалить цены?")) {
$.ajax({
url: my_ajax_obj.ajax_url, // URL AJAX WordPress
type: 'POST',
dataType : 'json',
data: {
action: 'reset_price_fields', // Пользовательское действие для обработки в PHP
author_id: $(this).data('author-id') // Передать идентификатор автора
},
success: function(response) {
alert(response.message); // Показать сообщение об успехе
},
error: function() {
alert('Ошибка сброса цен.'); // Показать сообщение об ошибке
}
});
}
});
});
add_action( 'admin_enqueue_scripts', 'reset_price_fields' );
Но ничего не происходит, когда я нажимаю на кнопку…:(
Ответ или решение
Для реализации функции сброса всех пользовательских метаполей цен с помощью кнопки на странице редактирования автора необходимо учитывать несколько аспектов, как в JavaScript, так и в PHP коде. Давайте внимательно рассмотрим ваш текущий код и выявим возможные проблемы.
1. Проверка реализации JavaScript
Первым шагом является проверка, действительно ли ваш JavaScript код правильно привязан к кнопке и выполняется ли он. Убедитесь, что файл cancella_prezzi_2.js
находится в правильной директории вашего шаблона и правильно подключён.
- Оптимизация подключения скрипта:
wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/cancella_prezzi_2.js', array('jquery'), '1.0', true );
Обратите внимание на параметр
true
в конце, который указывает WordPress подключить скрипт в футере. Это может помочь с загрузкой зависимостей jQuery.
2. Исправьте ошибку в передаче параметра
В вашем JS коде необходимо убедиться, что передаётся корректный ID автора. Вы уже это сделали:
author_id: $(this).data('author-id')
Однако важно, чтобы в HTML кнопке data-author-id
было значение, которое реально соответствует ID пользователя.
3. Исправьте PHP код обработчика AJAX
Ваш PHP обработчик должен гарантировать, что он правильно выполняет сброс цен. Убедитесь, что вы используете правильные ключи для проверки метаданных.
4. Убедитесь, что все условия корректны
Общий код выглядит следующим образом. Я немного подправлю его:
В functions.php
:
add_action('admin_enqueue_scripts', 'reset_price_fields');
function reset_price_fields( $hook ) {
if ( 'user-edit.php' != $hook ) {
return;
}
wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/cancella_prezzi_2.js', array('jquery'), '1.0', true );
$title_nonce = wp_create_nonce( 'title_example' );
wp_localize_script(
'ajax-script',
'my_ajax_obj',
array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => $title_nonce,
)
);
}
add_action('wp_ajax_reset_price_fields', 'reset_price_fields2');
function reset_price_fields2() {
check_ajax_referer( 'title_example' );
if (!isset($_POST['author_id'])) {
wp_send_json_error(['message' => 'No author ID provided.']);
exit;
}
$author_id = intval($_POST['author_id']);
$args = [
'post_type' => 'post',
'author' => $author_id,
'posts_per_page' => -1
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_id = get_the_ID();
// Убедитесь, что ключи правильные
$fields_to_reset = ['1_per_hol', '2_periodo'];
foreach ($fields_to_reset as $field) {
delete_post_meta($post_id, $field);
}
}
wp_send_json_success(['message' => 'Prices have been reset successfully.']);
} else {
wp_send_json_error(['message' => 'No posts found for this author.']);
}
wp_reset_postdata();
exit;
}
5. Проверка успешности выполнения
После нажатия на кнопку, если ничего не происходит, попробуйте использовать инструменты разработчика в вашем браузере (обычно F12):
- Перейдите на вкладку "Сеть" и посмотрите, выполняются ли AJAX-запросы.
- Проверяйте, есть ли ошибки JavaScript в консоли.
6. Убедитесь, что есть посты для сброса
Если для данного автора нет записей, будет выведено сообщение об этом. Убедитесь, что действительно есть посты, у которых вы пытаетесь сбросить ценовые метаполя.
Заключение
Если, следуя вышеперечисленным шагам, вы всё равно не видите результатов, возможно, дело в настройках вашего сервера или конфликтах с другими плагинами. Убедитесь, что все ваши плагины и ядро WordPress обновлены.
Таким образом, следуя всем указанным рекомендациям и регулярно проверяя код на наличие ошибок, вы сможете эффективно настроить работу кнопки для сброса пользовательских метаполей.