Вопрос или проблема
Я создал пользовательское поле с использованием ACF в быстром редактировании. Поле отображается, где пользователь должен обновить порядок меню продукта. Когда вы видите страницу деталей продукта, нажав кнопку редактирования, это поле будет отображаться во вкладке «Дополнительно», порядок меню. Теперь пользователь хочет изменить порядок меню из поля быстрого редактирования. Я использую ajax для достижения этого, но я застрял на 4 часа. Я не могу найти помощь в интернете. Проверьте мой код ниже. Спасибо
JQuery код:
jQuery(document).ready(function(){
jQuery(".acf-quick-edit input[type="text"]").blur(function(){
var morder = jQuery(this).val();
var post_id = jQuery(this).parents("tr").attr("id");
var data = {
'action': 'update_menu_order',
'menu_order': morder,
'post_id':post_id
};
// с 2.8 ajaxurl всегда определён в заголовке админки и указывает на admin-ajax.php
jQuery.post(ajaxurl, data, function(response) {
alert(response);
});
});
});
PHP код
<?php
add_action( 'wp_ajax_update_menu_order', 'update_menu_order' );
add_action( 'wp_ajax_nopriv_update_menu_order', 'update_menu_order' );
function update_menu_order() {
global $wpdb; // это как получить доступ к базе данных
$menu_order = $_POST['menu_order'];
$data = $_POST['post_id'];
$post_id = substr($data, strpos($data, "-") + 1);
//print_r($_POST);
//echo get_post_field( 'menu_order', $post_id);
update_post_meta($post_id,'menu_order',$menu_order);
wp_die(); // это необходимо для немедленного завершения и возвращения правильного ответа
}
Ниже приведённый код поможет другим достичь указанной задачи.
<?php
add_action( 'wp_ajax_update_menu_order', 'update_menu_order' );
add_action( 'wp_ajax_nopriv_update_menu_order', 'update_menu_order' );
function update_menu_order() {
global $wpdb;
$table_name = $wpdb->prefix."posts";
$menu_order = $_POST['menu_order'];
$data = $_POST['post_id'];
$post_id = substr($data, strpos($data, "-") + 1);
$result = $wpdb->query($wpdb->prepare("UPDATE $table_name SET menu_order="$menu_order" WHERE ID=$post_id"));
echo $result;
wp_die(); // это необходимо для немедленного завершения и возвращения правильного ответа
}
Ответ или решение
Для того чтобы успешно отобразить поле заказа меню в функции быстрого редактирования в WordPress, необходимо использовать AJAX, чтобы отправить данные, а затем обновить метаданные поста. Давайте разберем ваш код и предложим шаги для исправления возникших проблем.
Проблема и Решение
Вы создали поле заказа меню с использованием ACF (Advanced Custom Fields) и хотите внедрить возможность редактирования его значения в быстром редактировании. Вы сделали это почти правильно, но есть некоторые детали, которые необходимо уточнить и доработать.
Шаги к Решению
1. Исправление JavaScript кода
Ваш JavaScript код, связанный с отправкой AJAX-запроса, имеет небольшую ошибку в использовании кавычек. Вот исправленная версия:
jQuery(document).ready(function() {
jQuery(".acf-quick-edit input[type='text']").blur(function() {
var morder = jQuery(this).val();
var post_id = jQuery(this).closest("tr").attr("id");
var data = {
'action': 'update_menu_order',
'menu_order': morder,
'post_id': post_id
};
jQuery.post(ajaxurl, data, function(response) {
alert('Меню обновлено: ' + response);
});
});
});
Обратите внимание на изменение input[type="text"]
на input[type='text']
, это дает более чёткое разделение кавычек.
2. Обновление PHP кода для обработки AJAX-запроса
В вашем PHP коде есть несколько моментов, которые нуждаются в доработке. Ниже вы найдете исправленный вариант:
<?php
add_action( 'wp_ajax_update_menu_order', 'update_menu_order' );
add_action( 'wp_ajax_nopriv_update_menu_order', 'update_menu_order' );
function update_menu_order() {
global $wpdb;
$table_name = $wpdb->prefix . "posts";
// Получаем данные
$menu_order = intval($_POST['menu_order']); // Убедитесь, что это целое число
$data = sanitize_text_field($_POST['post_id']); // Обработка ID поста
$post_id = substr($data, strpos($data, "-") + 1);
// Проверяем, что пост с таким ID существует
if (get_post($post_id)) {
// Обновляем поле menu_order в базе данных
$result = $wpdb->update(
$table_name,
array('menu_order' => $menu_order), // Данные для обновления
array('ID' => $post_id) // Условия для обновления
);
// Возвращаем результат в JavaScript
echo $result ? 'Успешно обновлено' : 'Ошибка обновления';
} else {
echo 'Пост не найден';
}
wp_die(); // Завершение работы
}
Описание исправлений
- Проверка поста: Перед обновлением мы проверяем, что пост с заданным ID действительно существует с помощью
get_post($post_id)
. - Подготовка данных: Используются функции
intval()
иsanitize_text_field()
, чтобы обеспечить безопасность и корректность передаваемых данных. - Метод
update()
: Вместоquery()
, для обновления строки мы используем встроенный методupdate()
, который более безопасен и удобен. - Сообщение об ошибках: Теперь ваш код возвращает четкое сообщение об успешности или неудаче выполнения операции.
Заключение
Следуя приведённым шагам, вы сможете реализовать требуемую функциональность быстрого редактирования поля меню заказа в вашем WordPress проекте. Соединяя JavaScript и PHP через AJAX, вы обеспечите пользователю удобный интерфейс для редактирования метаданных постов без обновления страницы. Убедитесь, что вы протестировали весь функционал в различных условиях для стабильности и безопасности.