Создала свой тип записи, вывела несколько постов на страницу. Создала кастомное поле для этих постов. При выборе значение (0 или 1), должно обновлять мета поле в админ-панели. Срабатывает обновление сразу для несколько постов, а нужно чтоб для конкретного поста в котором сделали выборку с помощью .change PHP: <?php $ajax_url = '/wp-admin/admin-ajax.php'; $post_id = get_the_ID(); /* id текущего поста */ $my_meta = get_post_meta($post_id, 'pole_booked_product', true) ? get_post_meta($post_id, 'pole_booked_product', true) : 0; /* текущее значение мета-поля */ ?> Код (Javascript): (function($){ $('.my_select').on('change', function(){ var $el = $(this), data = { action: 'ajaxUpdateMeta', post_id: '<?php echo $post_id; ?>', meta_val: $el.val(), /* новое значение мета-поля */ //nonce: '<?php echo $nonce; ?>' }; $.post( '<?php echo $ajax_url; ?>', data, function(data){ $('.hidd').text(data); } ); }); })(jQuery); PHP: <select class="my_select"> <?php for ($i = 0; $i < 2; $i++) { ?> <option value="<?php echo $i; ?>" <?php selected($my_meta, $i); ?>><?php echo $i; ?></option> <?php } ?> </select> PHP: function ajaxUpdateMeta() { $metaVal = $_POST['meta_val']; $post_id = $_POST['post_id']; //$nonce = $_POST['nonce']; $action = 'post_id_' . $post_id; update_post_meta($post_id, 'pole_booked_product', $metaVal); //echo get_post_meta($post_id, 'pole_booked_product', true); wp_die(); } add_action('wp_ajax_nopriv_ajaxUpdateMeta', 'ajaxUpdateMeta'); add_action('wp_ajax_ajaxUpdateMeta', 'ajaxUpdateMeta');
вот это в html гляньте, что то странное: PHP: <option value="<?php echo $i; ?>" <?php selected($my_meta, $i); ?>><?php echo $i; ?></option> может в value писать именно meta. А не какие то придуманные вами цифры от 0 до 2.
А по существу, если вы все же уверены в том что делаете. Всегда проверяйте данные перед отправкой. Код (Javascript): console.log(data); И не мешайте php с js. По хорошему ваш js код должен вообще в отдельном файле лежать. Поэтому вставте ваш $post_id в какой нибудь атрибут, у того же селекта. например: PHP: <select post_id="<?=$post_id?> " class="my_select"> И уже в js ко всему это нормально обратитесь Код (Javascript): $( document ).ready( function() { $(".my_select").on('change', function() { data = { action: 'ajaxUpdateMeta', post_id: $(this).attr('post_id'), meta_val: $(this).val() }; console.log(data ); $.post( "/wp-admin/admin-ajax.php", data , function( ) { }); }); });
Написала так, но не работает( PHP: <?php $ajax_url = '/wp-admin/admin-ajax.php'; $post_id = get_the_ID(); $nonce = wp_create_nonce('post_id_' . $post_id); $my_meta = get_post_meta($post_id, 'pole_booked_product', true) ? get_post_meta($post_id, 'pole_booked_product', true) : 0; ?> <select id="<?php echo $post_id; ?>" class="my_select"> <?php for ($i = 0; $i < 2; $i++) { ?> <option value="<?php echo $i;?>" <?php selected($my_meta, $i); ?>><?php echo $i; ?></option> <?php } ?> </select> <div><span class="my_meta"><?php echo $my_meta; ?></span></div> Код (Javascript): <script> jQuery(document).ready(function(event){ jQuery.ajax({ url: "/wp-admin/admin-ajax.php", method: 'post', data: { action: 'ajax_views_response', post_id: "<?php echo $id; ?>", }, success: function (response) { var num = response / 10; jQuery("#<?php echo $id; ?>").html(num); } }); }); </script> PHP: function ajaxUpdateMeta() { $post_id = $_POST['post_id']; $action = 'post_id_' . $post_id; $metaVal = $_POST['metaVal']; update_post_meta($post_id, 'pole_booked_product', $metaVal); echo get_post_meta($post_id, 'pole_booked_product', true); wp_die(); } add_action('wp_ajax_nopriv_ajaxUpdateMeta', 'ajaxUpdateMeta'); add_action('wp_ajax_ajaxUpdateMeta', 'ajaxUpdateMeta');
вот этот скрипт, выше не тот отправила скрипт Код (Javascript): jQuery( document ).ready( function() { jQuery(".my_select").on('change', function() { data = { action: 'ajaxUpdateMeta', post_id: jQuery(this).attr('post_id'), meta_val: jQuery(this).val() }; jQuery.post('<?php echo $ajax_url; ?>', data, function(data){ jQuery('.my_meta').text(data); } ); }); });
Я немного переделала код, нужно чтоб по клику на div в записи менялось значение meta поля, подскажите, пожалуйста, что не так в коде? PHP: <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <div class="block-border"> <p class="product_class"><?php echo get_post_meta($post->ID, 'pole_1', true); ?></p> <p class="product_title"><?php echo get_post_meta($post->ID, 'pole_2', true); ?></p> <p class="product_weight"><?php echo get_post_meta($post->ID, 'pole_3', true); ?></p> <p class='hidd'><?php echo get_post_meta($post->ID, 'pole_booked_product', true); ?></p> <?php if ( ! empty( trim( get_post_meta( $post->ID, 'pole_booked_product', true ) ) ) ) {?> <script> jQuery("#post-<?php the_ID(); ?>").find('.block-border').addClass('booked'); </script> <?php } ?> <?php $ajax_url = '/wp-admin/admin-ajax.php'; $post_id = get_the_ID(); ?> </div> </div> Код (Javascript): jQuery(document).ready(function() { jQuery(".block-border").on('click', function() { data = { action: 'ajaxUpdateMeta', post_id: jQuery(this).attr('post_id'), meta_val: jQuery(this).val(1) }; jQuery.post('<?php echo $ajax_url; ?>', data, function(data){ jQuery('.hidd').text(data); } ); }); }); PHP: function ajaxUpdateMeta() { $post_id = $_POST['post_id']; $action = 'post_id_' . $post_id; $metaVal = $_POST['metaVal']; update_post_meta($post_id, 'pole_booked_product', $metaVal); echo get_post_meta($post_id, 'pole_booked_product', true); wp_die(); } add_action('wp_ajax_nopriv_ajaxUpdateMeta', 'ajaxUpdateMeta'); add_action('wp_ajax_ajaxUpdateMeta', 'ajaxUpdateMeta');
Все не так к сожалению. Я тебе советую убрать ajax в стронку вставить в update_post_meta то что ты думаешь передаешь. И посмотреть через var_dump результат.
Вот как все выглядит http://snails.2w-shop.com/preorder-snails. Это все записи, при клике на один из блоков (то есть на запись), я передаю в форму значения кастомных полей. + ко всему нужно чтоб в кастомное поле <p class='hidd'><?php echo get_post_meta($post->ID, 'pole_booked_product', true); ?></p> добавлялось любое значение, главное чтоб заполнить это поле в админ-панеле
На фтп если доступ дадите, могу за золотишко посмотреть. А так я уже писал, смотрите что передаете и что возвращаете. Для js это команда console.log(). Для php это print_r или var_dump. Чтобы найти ошибку нужно пошагово проверять все действия .
Сейчас работает, но update_post_meta срабатывает только для первого выбранного элемента, как сделать чтоб срабатывало для всех выбранных? Код (Javascript): jQuery(document).ready(function() { jQuery(".submit").on("click", function (event) { event.preventDefault(); if (jQuery(".block-border").hasClass("active")) { var name = jQuery('.form-name').val(); var last_name = jQuery('.form-last_name').val(); var form_phone = jQuery('.form-phone').val(); var form_country = jQuery('.form-country').val(); var form_city = jQuery('.form-city').val(); var form_street = jQuery('.form-street').val(); var form_message = jQuery('.form-message').val(); var form_num = jQuery('.form-num').val(); var form_weight1 = jQuery('.form-weight1').val(); var form_weight2 = jQuery('.form-weight2').val(); var form_num2 = jQuery('.form-num2').val(); var form_weight3 = jQuery('.form-weight3').val(); var form_weight4 = jQuery('.form-weight4').val(); jQuery.ajax({ context: document.body, url: "/wp-admin/admin-ajax.php", method: 'post', data: { action: 'ajax_order', name: name, last_name: last_name, phone: form_phone, country: form_country, city: form_city, street: form_street, message: form_message, form_num: form_num, form_weight1: form_weight1, form_weight2: form_weight2, form_num2: form_num2, form_weight3: form_weight3, form_weight4: form_weight4, post_id: jQuery('.block-border.active').find('.hidd').attr('id') }, function(date) { //jQuery('.block-border').hasClass("active").find('.hidd').text(date); }, success: function (response) { jQuery("#sendform").html('<p class="thank" style="text-align: center;margin-bottom: 0px;">Заказ забронирован!<p>'); } }); }; }); }); PHP: function total_form(){ $name = $_REQUEST['name']; $last_name = $_REQUEST['last_name']; $phone = $_REQUEST['phone']; $country = $_REQUEST['country']; $city = $_REQUEST['city']; $street = $_REQUEST['street']; $message = $_REQUEST['message']; $form_num = $_REQUEST['form_num']; $form_weight1 = $_REQUEST['form_weight1']; $form_weight2 = $_REQUEST['form_weight2']; $form_num2 = $_REQUEST['form_num2']; $form_weight3 = $_REQUEST['form_weight3']; $form_weight4 = $_REQUEST['form_weight4']; $post_id = $_POST['post_id']; $action = 'post_id_' . $post_id; update_post_meta($post_id, 'pole_booked_product', 1); $response = ''; $thm = 'Заказ звонка'; $thm = "=?utf-8?b?". base64_encode($thm) ."?="; $msg = "Имя: ".$name."<br/> Фамилия: ".$last_name ."<br/> Телефон: ".$phone ."<br/> Страна: ".$country ."<br/> Город: ".$city ."<br/> Улица: ".$street ."<br/> Сообщение: ".$message ."<br/> № HELIX ASPERSA MULLER: ".$form_num ."<br/> 1 класс HELIX ASPERSA MULLER: ".$form_weight1 ."<br/> 2 класс HELIX ASPERSA MULLER: ".$form_weight2 ."<br/> № HELIX ASPERSA MAXIMA: ".$form_num2 ."<br/> 1 класс HELIX ASPERSA MAXIMA: ".$form_weight3 ."<br/> 2 класс HELIX ASPERSA MAXIMA: ".$form_weight4 ."<br/> "; $mail_to = 'juliaradionova1991@gmail.com'; $headers = "Content-Type: text/html; charset=utf-8\n"; //$headers .= 'From: test@gmail.com' . "\r\n"; // Отправляем почтовое сообщение if(mail($mail_to, $thm, $msg, $headers)){ $response = 'Сообщение отправлено'; }else $response = 'Ошибка при отправке'; // Сообщение о результате отправки почты if ( defined( 'DOING_AJAX' ) && DOING_AJAX ){ echo $response; wp_die(); } } add_action('wp_ajax_nopriv_ajax_order', 'total_form' ); add_action('wp_ajax_ajax_order', 'total_form' ); --- Добавлено --- Для всех выбранных id
Много у вас переделывать надо. Верните через print_r($_POST['post_id']) что у вас там вообще. И почитайте про вот такую команду : Код (Javascript): $("form").serialize() вам это ну оочень сильно облегчит жизнь в будущем.
Что именно "много"? --- Добавлено --- Код (Javascript): jQuery(document).ready(function() { jQuery(".submit").on("click", function (event) { event.preventDefault(); if (jQuery(".block-border").hasClass("active")) { var name = jQuery('.form-name').val(); var last_name = jQuery('.form-last_name').val(); var form_phone = jQuery('.form-phone').val(); var form_country = jQuery('.form-country').val(); var form_city = jQuery('.form-city').val(); var form_street = jQuery('.form-street').val(); var form_message = jQuery('.form-message').val(); var form_num = jQuery('.form-num').val(); var form_weight1 = jQuery('.form-weight1').val(); var form_weight2 = jQuery('.form-weight2').val(); var form_num2 = jQuery('.form-num2').val(); var form_weight3 = jQuery('.form-weight3').val(); var form_weight4 = jQuery('.form-weight4').val(); var ids = jQuery.map(jQuery('.block-border.active'), function(a) { return jQuery(a).find('.hidd').attr('id') }).join(', '); jQuery.ajax({ context: document.body, url: "/wp-admin/admin-ajax.php", method: 'post', data: { action: 'ajax_order', name: name, last_name: last_name, phone: form_phone, country: form_country, city: form_city, street: form_street, message: form_message, form_num: form_num, form_weight1: form_weight1, form_weight2: form_weight2, form_num2: form_num2, form_weight3: form_weight3, form_weight4: form_weight4, post_id: ids }, function(date) { //jQuery('.block-border').hasClass("active").find('.hidd').text(date); }, success: function (response) { jQuery("#sendform").html('<p class="thank" style="text-align: center;margin-bottom: 0px;">Заказ забронирован!<p>'); } }); }; }); }); в post_id: ids я передаю массив все выбранных id записей, но я не знаю как их обработать на стороне сервера. Как обновить поле update_post_meta($post_id, 'pole_booked_product', 1); для всех полученных Id
@Julia1991 сейчас 10 минут, я вам пример покажу, запустите его и посмотрите. Если уже и с этим не разберетесь то извиняйте.
@Julia1991 HTML: <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>test</title> </head> <body> <form method="post"> <input type="text" name="name"> <input type="text" name="last_name"> <input type="phone" name="form_phone"> <input type="text" name="form_country"> <input type="text" name="form_city"> <input type="text" name="form_street"> <input type="text" name="form_message"> <input type="text" name="form_num"> <input type="text" name="form_weight1"> <input type="text" name="form_weight2"> <input type="text" name="form_num2"> <input type="text" name="form_weight3"> <input type="text" name="form_weight4 "> <button type="submit">Отправить</button> </form> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script> jQuery("form").submit(function(event) { event.preventDefault(); let id = [1,2,5,8,9]; id.forEach(function( index ) { jQuery("<input type='hidden' name='post_id[]' value='"+index+"' />").appendTo("form"); }); console.log(jQuery(this).serialize()); }) </script> </body> </html> и примите эти данные на сервере, чтобы их увидеть просто напишите print_r($_POST) --- Добавлено --- я специально в консоль вывел, чтобы вы видели что передаете на сервер Код (Javascript): jQuery("form").submit(function(event) { event.preventDefault(); let id = [1,2,5,8,9]; id.forEach(function( index ) { jQuery("<input type='hidden' name='post_id[]' value='"+index+"' />").appendTo("form"); }); console.log(jQuery(this).serialize()); }) Код (Javascript): console.log(jQuery(this).serialize()); --- Добавлено ---в вашем примере с id это скорее всего как то так: Код (Javascript): jQuery.map(jQuery('.block-border.active'), function(a) { let id = jQuery(a).find('.hidd').attr('id'); jQuery("<input type='hidden' name='post_id[]' value='"+id+"' />").appendTo("form"); }).join(', ');
А как вот это обработать на сервере? Код (Javascript): jQuery.map(jQuery('.block-border.active'), function(a) { let id = jQuery(a).find('.hidd').attr('id'); jQuery("<input type='hidden' name='post_id[]' value='"+id+"' />").appendTo("form"); }).join(', '); Как обновить значение meta поля для полученных id?
ну если вы на сервере введете команду print_r($_POST) неужели вы не поймете что с этим делать? что будет тут? PHP: $_POST['post_id']; // что тут после нашего примера???? --- Добавлено --- уберите js создайте отдельно фаил index.html без php и js HTML: <form method="post" action="test.php"> <input type="text" name="my_id[]"> <input type="text" name="my_id[]"> <input type="phone" name="my_id[]"> <input type="text" name="my_id[]"> <input type="text" name="my_id[]"> <button type="submit" name="my_submit">Отправить</button> </form> создайте файл test.php: PHP: <?php print_r($_POST); и посмотрите что там --- Добавлено --- вот скрин, я все на этом