Вопрос или проблема
Форма находится в окне создания поста. Ajax отправляет значения, но значения не обновляются. Где может быть проблема?
Ajax
<script>
function dynamic_Select(field, aid, value)
{
console.log(field, aid,value);
jQuery.ajax({
type: "POST",
url: ajaxurl,
data:{
field: field,
aid: aid,
value: value,
},
error: function(){alert('Ошибка!')},
success: function(){alert(value)}
});
}
</script>
functions.php
add_action('wp_ajax_dynselect', 'update_dynamic_select');
add_filter("attachment_fields_to_save", " update_dynamic_select", null , 2);
function update_dynamic_select($field, $aid, $value) {
update_post_meta($aid, $field, $value);
}
HTML:
<select aid="104" name="_image_matmenys" onchange="dynamic_Select(this.getAttribute('name'), this.getAttribute('aid') ,this.value)">
<option value="10x10">10x10</option>
<option value="20x20" selected="selected">20x20</option>
<option value="30x30">30x30</option>
</select>
Замените функцию в вашем файле functions.php –
function update_dynamic_select() {
update_post_meta($_POST['aid'], $_POST['field'], $_POST['value']);
echo $_POST['value'];
die();
}
Замените опции в вашей HTML-части –
<?php
$val = get_post_meta( 104, '_image_matmenys', true );
$s1 = ($val == "10x10") ? 'selected="selected"' : '';
$s2 = ($val == "20x20") ? 'selected="selected"' : '';
$s3 = ($val == "30x30") ? 'selected="selected"' : '';
?>
<option value="10x10" <?php echo $s1;?>>10x10</option>
<option value="20x20" <?php echo $s2;?>>20x20</option>
<option value="30x30" <?php echo $s3;?>>30x30</option>
ИЗМЕНЕНИЕ:
Также добавьте еще один хук –
add_action( 'wp_ajax_nopriv_dynselect', 'update_dynamic_select' );
и убедитесь, что переменная ajaxurl
имеет значение admin_url('admin-ajax.php')
, т.е. var ajaxurl="<?php echo admin_url("admin-ajax.php");?>"
Ответ или решение
Конечно, я помогу вам разобраться с проблемой, связанной с изменением пользовательского поля "attachment" в (onChange) событий. Давайте разберем ваш код и предложим исправления.
Проблема
Вы упомянули, что значения при Ajax-запросе не обновляются. Это может происходить по целому ряду причин, включая неправильную настройку Ajax-запроса, неправильное использование хуков WordPress или некорректное обновление метаполей.
Решения и исправления
- Ajax Функция:
В вашем коде обратная функция AJAX для обработки данных немного некорректна. Вам необходимо убедиться, что вы правильно передаете данные и обрабатываете их на сервере. Ваш код должен выглядеть следующим образом:
add_action('wp_ajax_dynselect', 'update_dynamic_select');
add_action('wp_ajax_nopriv_dynselect', 'update_dynamic_select'); // Добавьте этот хук для неавторизованных пользователей
function update_dynamic_select() {
// Проверяем наличие необходимых параметров
if(isset($_POST['aid']) && isset($_POST['field']) && isset($_POST['value'])) {
update_post_meta($_POST['aid'], $_POST['field'], sanitize_text_field($_POST['value']));
echo esc_html($_POST['value']); // Возвращаем обновленное значение
}
wp_die(); // Останавливаем дальнейшее выполнение
}
Этот код включает в себя проверку параметров и очистку входящих данных.
- HTML Код:
Проверьте, правильно ли вы генерируете HTML-опции для вашего селектора. Убедитесь, что выбранные значения опций соответствуют метаданных. Ваш HTML-код с динамически установленными значениями должен выглядеть следующим образом:
<?php
$val = get_post_meta(104, '_image_matmenys', true);
$options = [
'10x10' => ($val == '10x10') ? 'selected="selected"' : '',
'20x20' => ($val == '20x20') ? 'selected="selected"' : '',
'30x30' => ($val == '30x30') ? 'selected="selected"' : '',
];
?>
<select aid="104" name="_image_matmenys" onchange="dynamic_Select(this.getAttribute('name'), this.getAttribute('aid') ,this.value)">
<option value="10x10" <?php echo $options['10x10']; ?>>10x10</option>
<option value="20x20" <?php echo $options['20x20']; ?>>20x20</option>
<option value="30x30" <?php echo $options['30x30']; ?>>30x30</option>
</select>
- JavaScript:
Убедитесь, что у вас правильно заданajaxurl
. В вашем JavaScript-коде добавьте строку, чтобы инициализироватьajaxurl
:
var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
function dynamic_Select(field, aid, value) {
console.log(field, aid, value);
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: {
action: 'dynselect', // Не забудьте указать действие
field: field,
aid: aid,
value: value,
},
error: function() {
alert('Ошибка!');
},
success: function(response) {
console.log('Response:', response); // Вывод ответа в консоль для отладки
alert('Успешно обновлено: ' + response);
}
});
}
Заключение
Обязательно проверьте консоль браузера на предмет ошибок, так как они могут предоставить дополнительную информацию о том, что может быть неправильно. Если указанные выше шаги не решают вашу проблему, убедитесь, что у вас правильно настроены разрешения для выполнения Ajax-запросов и нет никаких ограничений со стороны серверного окружения.
Если у вас есть дополнительные вопросы или проблемы, пожалуйста, дайте знать!