За последние 24 часа нас посетили 22549 программистов и 1009 роботов. Сейчас ищут 692 программиста ...

Изменение мета поля

Тема в разделе "Wordpress", создана пользователем Julia1991, 7 окт 2019.

  1. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Создала свой тип записи, вывела несколько постов на страницу. Создала кастомное поле для этих постов. При выборе значение (0 или 1), должно обновлять мета поле в админ-панели.
    Срабатывает обновление сразу для несколько постов, а нужно чтоб для конкретного поста в котором сделали выборку с помощью
    .change
    PHP:
    1. <?php
    2. $ajax_url = '/wp-admin/admin-ajax.php';
    3. $post_id = get_the_ID(); /* id текущего поста */
    4. $my_meta = get_post_meta($post_id, 'pole_booked_product', true) ? get_post_meta($post_id, 'pole_booked_product', true) : 0; /* текущее значение мета-поля */
    5. ?>
    Код (Javascript):
    1. (function($){
    2.         $('.my_select').on('change', function(){
    3.             var $el = $(this),
    4.                 data = {
    5.                     action: 'ajaxUpdateMeta',
    6.                     post_id: '<?php echo $post_id; ?>',
    7.                     meta_val: $el.val(), /* новое значение мета-поля */
    8.                     //nonce: '<?php echo $nonce; ?>'
    9.                 };
    10.             $.post(
    11.                 '<?php echo $ajax_url; ?>',
    12.                 data,
    13.                 function(data){
    14.                     $('.hidd').text(data);
    15.                 }
    16.             );
    17.         });
    18.     })(jQuery);
    PHP:
    1. <select class="my_select">
    2.     <?php
    3.     for ($i = 0; $i < 2; $i++) {
    4.         ?>
    5.         <option value="<?php echo $i; ?>" <?php selected($my_meta, $i); ?>><?php echo $i; ?></option>
    6.     <?php
    7.     }
    8.     ?>
    9. </select>
    PHP:
    1. function ajaxUpdateMeta() {
    2.     $metaVal = $_POST['meta_val'];
    3.     $post_id = $_POST['post_id'];
    4.     //$nonce = $_POST['nonce'];
    5.     $action = 'post_id_' . $post_id;
    6.  
    7.         update_post_meta($post_id, 'pole_booked_product', $metaVal);
    8.  
    9.     //echo get_post_meta($post_id, 'pole_booked_product', true);
    10.     wp_die();
    11. }
    12. add_action('wp_ajax_nopriv_ajaxUpdateMeta', 'ajaxUpdateMeta');
    13. add_action('wp_ajax_ajaxUpdateMeta', 'ajaxUpdateMeta');
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    вот это в html гляньте, что то странное:
    PHP:
    1. <option value="<?php echo $i; ?>" <?php selected($my_meta, $i); ?>><?php echo $i; ?></option>
    может в value писать именно meta. А не какие то придуманные вами цифры от 0 до 2.
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А по существу, если вы все же уверены в том что делаете. Всегда проверяйте данные перед отправкой.
    Код (Javascript):
    1. console.log(data);
    И не мешайте php с js. По хорошему ваш js код должен вообще в отдельном файле лежать. Поэтому вставте ваш $post_id в какой нибудь атрибут, у того же селекта. например:
    PHP:
    1. <select post_id="<?=$post_id?> " class="my_select">
    И уже в js ко всему это нормально обратитесь
    Код (Javascript):
    1. $( document ).ready( function() {
    2.     $(".my_select").on('change', function() {
    3.              data = {        
    4.                  action: 'ajaxUpdateMeta',
    5.                  post_id: $(this).attr('post_id'),
    6.                  meta_val: $(this).val()
    7.               };
    8.         console.log(data );
    9.         $.post( "/wp-admin/admin-ajax.php", data , function( ) {
    10.         });
    11.     });
    12. });
     
  4. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0



    Написала так, но не работает(
    PHP:
    1. <?php
    2. $ajax_url = '/wp-admin/admin-ajax.php';
    3. $post_id = get_the_ID();
    4. $nonce = wp_create_nonce('post_id_' . $post_id);
    5. $my_meta = get_post_meta($post_id, 'pole_booked_product', true) ? get_post_meta($post_id, 'pole_booked_product', true) : 0;
    6. ?>
    7.  
    8. <select id="<?php echo $post_id; ?>" class="my_select">
    9.     <?php for ($i = 0; $i < 2; $i++) {
    10.         ?>
    11.         <option
    12. value="<?php echo $i;?>"
    13. <?php selected($my_meta, $i); ?>><?php echo $i; ?></option>
    14.     <?php
    15.     }
    16.     ?>
    17. </select>
    18. <div><span class="my_meta"><?php echo $my_meta; ?></span></div>
    Код (Javascript):
    1. <script>
    2.     jQuery(document).ready(function(event){
    3.         jQuery.ajax({
    4.             url: "/wp-admin/admin-ajax.php",
    5.             method: 'post',
    6.             data: {
    7.                 action: 'ajax_views_response',
    8.                 post_id: "<?php echo $id; ?>",
    9.  
    10.             },
    11.             success: function (response) {
    12.                 var num = response / 10;
    13.  
    14.                 jQuery("#<?php echo $id; ?>").html(num);
    15.             }
    16.         });
    17.     });
    18. </script>
    PHP:
    1. function ajaxUpdateMeta() {
    2.     $post_id = $_POST['post_id'];
    3.     $action = 'post_id_' . $post_id;
    4.     $metaVal = $_POST['metaVal'];
    5.  
    6.     update_post_meta($post_id, 'pole_booked_product', $metaVal);
    7.  
    8.     echo get_post_meta($post_id, 'pole_booked_product', true);
    9.     wp_die();
    10. }
    11. add_action('wp_ajax_nopriv_ajaxUpdateMeta', 'ajaxUpdateMeta');
    12. add_action('wp_ajax_ajaxUpdateMeta', 'ajaxUpdateMeta');
     
    #4 Julia1991, 7 окт 2019
    Последнее редактирование: 7 окт 2019
  5. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    вот этот скрипт, выше не тот отправила скрипт
    Код (Javascript):
    1.     jQuery( document ).ready( function() {
    2.     jQuery(".my_select").on('change', function() {
    3.              data = {      
    4.                  action: 'ajaxUpdateMeta',
    5.                  post_id: jQuery(this).attr('post_id'),
    6.                  meta_val: jQuery(this).val()
    7.               };
    8.      
    9.  
    10. jQuery.post('<?php echo $ajax_url; ?>',
    11.                 data,
    12.                 function(data){
    13.                     jQuery('.my_meta').text(data);
    14.                 }
    15.             );
    16.     });
    17. });
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А проверки где, что передаете, что получаете. console.log()
     
  7. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Я немного переделала код, нужно чтоб по клику на div в записи менялось значение meta поля, подскажите, пожалуйста, что не так в коде?
    PHP:
    1. <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    2.     <div class="block-border">  
    3.         <p class="product_class"><?php echo get_post_meta($post->ID, 'pole_1', true); ?></p>
    4.         <p class="product_title"><?php echo get_post_meta($post->ID, 'pole_2', true); ?></p>
    5.         <p class="product_weight"><?php echo get_post_meta($post->ID, 'pole_3', true); ?></p>
    6.         <p class='hidd'><?php echo get_post_meta($post->ID, 'pole_booked_product', true); ?></p>
    7.         <?php if ( ! empty( trim( get_post_meta( $post->ID, 'pole_booked_product', true ) ) ) ) {?>
    8.            <script>
    9.                jQuery("#post-<?php the_ID(); ?>").find('.block-border').addClass('booked');
    10.            </script>
    11.        <?php }
    12.        ?>
    13.  
    14.        <?php
    15.        $ajax_url = '/wp-admin/admin-ajax.php';
    16.        $post_id = get_the_ID();
    17.        ?>
    18.    </div>
    19. </div>
    Код (Javascript):
    1.  
    2.     jQuery(document).ready(function() {
    3.     jQuery(".block-border").on('click', function() {
    4.              data = {      
    5.                  action: 'ajaxUpdateMeta',
    6.                  post_id: jQuery(this).attr('post_id'),
    7.                  meta_val: jQuery(this).val(1)
    8.               };
    9.  
    10. jQuery.post('<?php echo $ajax_url; ?>',
    11.                 data,
    12.                 function(data){
    13.                     jQuery('.hidd').text(data);
    14.                 }
    15.             );
    16.     });
    17. });
    PHP:
    1. function ajaxUpdateMeta() {
    2.     $post_id = $_POST['post_id'];
    3.     $action = 'post_id_' . $post_id;
    4.     $metaVal = $_POST['metaVal'];
    5.  
    6.     update_post_meta($post_id, 'pole_booked_product', $metaVal);
    7.  
    8.     echo get_post_meta($post_id, 'pole_booked_product', true);
    9.     wp_die();
    10. }
    11. add_action('wp_ajax_nopriv_ajaxUpdateMeta', 'ajaxUpdateMeta');
    12. add_action('wp_ajax_ajaxUpdateMeta', 'ajaxUpdateMeta');
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Все не так к сожалению. Я тебе советую убрать ajax в стронку вставить в update_post_meta то что ты думаешь передаешь. И посмотреть через var_dump результат.
     
  9. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Вот как все выглядит http://snails.2w-shop.com/preorder-snails. Это все записи, при клике на один из блоков (то есть на запись), я передаю в форму значения кастомных полей. + ко всему нужно чтоб в кастомное поле <p class='hidd'><?php echo get_post_meta($post->ID, 'pole_booked_product', true); ?></p> добавлялось любое значение, главное чтоб заполнить это поле в админ-панеле
     
  10. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    На фтп если доступ дадите, могу за золотишко посмотреть. А так я уже писал, смотрите что передаете и что возвращаете. Для js это команда console.log(). Для php это print_r или var_dump. Чтобы найти ошибку нужно пошагово проверять все действия .
     
  11. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Сейчас работает, но update_post_meta срабатывает только для первого выбранного элемента, как сделать чтоб срабатывало для всех выбранных?
    Код (Javascript):
    1. jQuery(document).ready(function() {
    2.     jQuery(".submit").on("click", function (event) {
    3.         event.preventDefault();
    4.   if (jQuery(".block-border").hasClass("active")) {
    5.         var name = jQuery('.form-name').val();
    6.         var last_name = jQuery('.form-last_name').val();
    7.         var form_phone = jQuery('.form-phone').val();
    8.         var form_country = jQuery('.form-country').val();
    9.         var form_city = jQuery('.form-city').val();
    10.         var form_street = jQuery('.form-street').val();
    11.         var form_message = jQuery('.form-message').val();
    12.         var form_num = jQuery('.form-num').val();  
    13.         var form_weight1 = jQuery('.form-weight1').val();
    14.         var form_weight2 = jQuery('.form-weight2').val();
    15.         var form_num2 = jQuery('.form-num2').val();
    16.         var form_weight3 = jQuery('.form-weight3').val();
    17.         var form_weight4 = jQuery('.form-weight4').val();
    18.  
    19.         jQuery.ajax({
    20.             context: document.body,
    21.             url: "/wp-admin/admin-ajax.php",
    22.             method: 'post',
    23.  
    24.             data: {
    25.                 action: 'ajax_order',
    26.                 name: name,
    27.                 last_name: last_name,
    28.                 phone: form_phone,
    29.                 country: form_country,
    30.                 city: form_city,
    31.                 street: form_street,
    32.                 message: form_message,
    33.                 form_num: form_num,
    34.                 form_weight1: form_weight1,
    35.                 form_weight2: form_weight2,
    36.                 form_num2: form_num2,
    37.                 form_weight3: form_weight3,
    38.                 form_weight4: form_weight4,
    39.                 post_id: jQuery('.block-border.active').find('.hidd').attr('id')
    40.             },
    41.             function(date) {
    42.           //jQuery('.block-border').hasClass("active").find('.hidd').text(date);
    43.         },
    44.             success: function (response) {
    45.                 jQuery("#sendform").html('<p class="thank" style="text-align: center;margin-bottom: 0px;">Заказ забронирован!<p>');
    46.             }
    47.         });
    48. };
    49.     });
    50.     });
    PHP:
    1. function total_form(){
    2. $name = $_REQUEST['name'];
    3. $last_name = $_REQUEST['last_name'];
    4. $phone = $_REQUEST['phone'];
    5. $country = $_REQUEST['country'];
    6. $city = $_REQUEST['city'];
    7. $street = $_REQUEST['street'];
    8. $message = $_REQUEST['message'];
    9.  
    10. $form_num = $_REQUEST['form_num'];
    11. $form_weight1 = $_REQUEST['form_weight1'];
    12. $form_weight2 = $_REQUEST['form_weight2'];
    13. $form_num2 = $_REQUEST['form_num2'];
    14. $form_weight3 = $_REQUEST['form_weight3'];
    15. $form_weight4 = $_REQUEST['form_weight4'];
    16. $post_id = $_POST['post_id'];
    17. $action = 'post_id_' . $post_id;
    18.  
    19. update_post_meta($post_id, 'pole_booked_product', 1);
    20.  
    21.     $response = '';
    22.     $thm  = 'Заказ звонка';
    23.     $thm  = "=?utf-8?b?". base64_encode($thm) ."?=";
    24.     $msg = "Имя: ".$name."<br/>
    25.        Фамилия: ".$last_name ."<br/>
    26.        Телефон: ".$phone ."<br/>
    27.        Страна: ".$country ."<br/>
    28.        Город: ".$city ."<br/>
    29.        Улица: ".$street ."<br/>
    30.        Сообщение: ".$message ."<br/>
    31.  
    32.        № HELIX ASPERSA MULLER: ".$form_num ."<br/>
    33.        1 класс HELIX ASPERSA MULLER: ".$form_weight1 ."<br/>
    34.        2 класс HELIX ASPERSA MULLER: ".$form_weight2 ."<br/>
    35.        № HELIX ASPERSA MAXIMA: ".$form_num2 ."<br/>
    36.        1 класс HELIX ASPERSA MAXIMA: ".$form_weight3 ."<br/>
    37.        2 класс HELIX ASPERSA MAXIMA: ".$form_weight4 ."<br/>
    38.        ";
    39.     $mail_to = 'juliaradionova1991@gmail.com';
    40.     $headers = "Content-Type: text/html; charset=utf-8\n";
    41.     //$headers .= 'From: test@gmail.com' . "\r\n";
    42. // Отправляем почтовое сообщение
    43.  
    44.     if(mail($mail_to, $thm, $msg, $headers)){
    45.         $response = 'Сообщение отправлено';
    46.     }else
    47.         $response = 'Ошибка при отправке';
    48.  
    49. // Сообщение о результате отправки почты
    50.  
    51.     if ( defined( 'DOING_AJAX' ) && DOING_AJAX ){
    52.         echo $response;
    53.         wp_die();
    54.     }
    55. }
    56.  
    57. add_action('wp_ajax_nopriv_ajax_order', 'total_form' );
    58. add_action('wp_ajax_ajax_order', 'total_form' );
    --- Добавлено ---
    Для всех выбранных id
     
  12. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Много у вас переделывать надо. Верните через print_r($_POST['post_id']) что у вас там вообще.
    И почитайте про вот такую команду :
    Код (Javascript):
    1. $("form").serialize()
    вам это ну оочень сильно облегчит жизнь в будущем.
     
  13. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Что именно "много"?
    --- Добавлено ---
    Код (Javascript):
    1. jQuery(document).ready(function() {
    2.  
    3.     jQuery(".submit").on("click", function (event) {
    4.         event.preventDefault();
    5.   if (jQuery(".block-border").hasClass("active")) {
    6.         var name = jQuery('.form-name').val();
    7.         var last_name = jQuery('.form-last_name').val();
    8.         var form_phone = jQuery('.form-phone').val();
    9.         var form_country = jQuery('.form-country').val();
    10.         var form_city = jQuery('.form-city').val();
    11.         var form_street = jQuery('.form-street').val();
    12.         var form_message = jQuery('.form-message').val();
    13.         var form_num = jQuery('.form-num').val();  
    14.         var form_weight1 = jQuery('.form-weight1').val();
    15.         var form_weight2 = jQuery('.form-weight2').val();
    16.         var form_num2 = jQuery('.form-num2').val();
    17.         var form_weight3 = jQuery('.form-weight3').val();
    18.         var form_weight4 = jQuery('.form-weight4').val();
    19.  
    20.         var ids = jQuery.map(jQuery('.block-border.active'), function(a) {
    21.     return jQuery(a).find('.hidd').attr('id')
    22. }).join(', ');
    23.  
    24.  
    25.         jQuery.ajax({
    26.             context: document.body,
    27.             url: "/wp-admin/admin-ajax.php",
    28.             method: 'post',
    29.  
    30.             data: {
    31.                 action: 'ajax_order',
    32.                 name: name,
    33.                 last_name: last_name,
    34.                 phone: form_phone,
    35.                 country: form_country,
    36.                 city: form_city,
    37.                 street: form_street,
    38.                 message: form_message,
    39.                 form_num: form_num,
    40.                 form_weight1: form_weight1,
    41.                 form_weight2: form_weight2,
    42.                 form_num2: form_num2,
    43.                 form_weight3: form_weight3,
    44.                 form_weight4: form_weight4,
    45.                 post_id: ids
    46.             },
    47.             function(date) {
    48.           //jQuery('.block-border').hasClass("active").find('.hidd').text(date);
    49.         },
    50.             success: function (response) {
    51.                 jQuery("#sendform").html('<p class="thank" style="text-align: center;margin-bottom: 0px;">Заказ забронирован!<p>');
    52.             }
    53.         });
    54. };
    55.     });
    56.     });
    в post_id: ids я передаю массив все выбранных id записей, но я не знаю как их обработать на стороне сервера. Как обновить поле update_post_meta($post_id, 'pole_booked_product', 1); для всех полученных Id
     
  14. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Julia1991 сейчас 10 минут, я вам пример покажу, запустите его и посмотрите. Если уже и с этим не разберетесь то извиняйте.
     
  15. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Julia1991
    HTML:
    1. <!doctype html>
    2. <html lang="en">
    3.     <meta charset="utf-8">
    4.     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    5.     <title>test</title>
    6. </head>
    7.     <form method="post">
    8.       <input type="text" name="name">
    9.       <input type="text" name="last_name">
    10.       <input type="phone" name="form_phone">
    11.       <input type="text" name="form_country">
    12.       <input type="text" name="form_city">
    13.       <input type="text" name="form_street">
    14.       <input type="text" name="form_message">
    15.       <input type="text" name="form_num">
    16.       <input type="text" name="form_weight1">
    17.       <input type="text" name="form_weight2">
    18.       <input type="text" name="form_num2">
    19.       <input type="text" name="form_weight3">
    20.       <input type="text" name="form_weight4 ">
    21.       <button type="submit">Отправить</button>
    22.     </form>
    23. <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    24. jQuery("form").submit(function(event) {
    25.  
    26.   event.preventDefault();
    27.  
    28.   let id = [1,2,5,8,9];
    29.  
    30.   id.forEach(function( index ) {
    31.     jQuery("<input type='hidden' name='post_id[]' value='"+index+"' />").appendTo("form");
    32.   });
    33.  
    34.   console.log(jQuery(this).serialize());
    35. })
    36. </body>
    37. </html>
    и примите эти данные на сервере, чтобы их увидеть просто напишите print_r($_POST)
    --- Добавлено ---
    я специально в консоль вывел, чтобы вы видели что передаете на сервер
    Код (Javascript):
    1. jQuery("form").submit(function(event) {
    2.   event.preventDefault();
    3.   let id = [1,2,5,8,9];
    4.   id.forEach(function( index ) {
    5.     jQuery("<input type='hidden' name='post_id[]' value='"+index+"' />").appendTo("form");
    6.   });
    7.   console.log(jQuery(this).serialize());
    8. })
    Код (Javascript):
    1. console.log(jQuery(this).serialize());
    --- Добавлено ---в вашем примере с id это скорее всего как то так:
    Код (Javascript):
    1. jQuery.map(jQuery('.block-border.active'), function(a) {
    2.    let id = jQuery(a).find('.hidd').attr('id');
    3.    jQuery("<input type='hidden' name='post_id[]' value='"+id+"' />").appendTo("form");
    4. }).join(', ');
     
  16. Julia1991

    Julia1991 Новичок

    С нами с:
    31 авг 2018
    Сообщения:
    23
    Симпатии:
    0

    А как вот это обработать на сервере?
    Код (Javascript):
    1. jQuery.map(jQuery('.block-border.active'), function(a) {
    2.    let id = jQuery(a).find('.hidd').attr('id');
    3.    jQuery("<input type='hidden' name='post_id[]' value='"+id+"' />").appendTo("form");
    4. }).join(', ');
    Как обновить значение meta поля для полученных id?
     
  17. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    ну если вы на сервере введете команду print_r($_POST) неужели вы не поймете что с этим делать?
    что будет тут?
    PHP:
    1. $_POST['post_id']; // что тут после нашего примера????
    --- Добавлено ---
    уберите js создайте отдельно фаил
    index.html без php и js
    HTML:
    1. <form method="post" action="test.php">
    2.       <input type="text" name="my_id[]">
    3.       <input type="text" name="my_id[]">
    4.       <input type="phone" name="my_id[]">
    5.       <input type="text" name="my_id[]">
    6.       <input type="text" name="my_id[]">
    7.       <button type="submit" name="my_submit">Отправить</button>
    8.     </form>
    создайте файл test.php:
    PHP:
    1. <?php
    2. print_r($_POST);
    и посмотрите что там
    --- Добавлено ---
    вот скрин, я все на этом
    rewrewrнный.jpg