Добавить сериализованные данные в базу данных wp из формы переключателей через AJAX - PullRequest
0 голосов
/ 09 июня 2018

У меня есть WordPress-пост, в котором отображается форма, состоящая из нескольких перечисленных песен, каждая песня имеет 2 переключателя («Play» и «Don't Play»).

Я хочу сохранить данныеэти переключатели в моей базе данных как 2 набора сериализованных данных, т.е. если установлен переключатель «Play»

1: do_play = название песни 1 2: do_play = название песни 2 3: do_play = название песни 34: do_play = название песни 4 5: do_play = название песни 5

a:5:{i:0;s:11:"Song name 1";i:1;s:11:"Song name 2";i:2;s:11:"Song name 3";i:3;s:11:"Song name 4";i:4;s:11:"Song name 5";}

И для песен, выбранных из «Не играть», то же самое, но в другой строке БД:

1: do_play = название песни 6 2: do_play = название песни 7 3: do_play = название песни 8 4: do_play = название песни 9 5: do_play = название песни 10

a:5:{i:0;s:11:"Song name 6";i:1;s:11:"Song name 7";i:2;s:11:"Song name 8";i:3;s:11:"Song name 9";i:4;s:11:"Song name 10";}

Я хочу сделать эточерез AJAX и добавьте записи в таблицу wp_postmeta.Вот пример моей формы html:

<form id="songChoices-12028" method="POST">
        <input type="hidden" id="booking_id" name="booking_id" value="12028">
        <ul class="setlist_container">


            <li class="song_entry ">Ain’t No Sunshine - 
                <em>Bill Withers</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-397">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-397">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry ">No Diggity - 
                <em>Blackstreet</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12036">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12036">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 7-8-piece drinks-reception">Pricetag - 
                <em>Jessie J</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12038">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12038">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Rehab - 
                <em>Amy Winehouse</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12039">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12039">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Rolling in the Deep - 
                <em>Adele</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12035">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12035">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Sittin’ on the Dock of the Bay - 
                <em>Otis Redding</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-398">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-398">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>

            <li class="song_entry 4-5-piece">Summer of ’69 - 
                <em>Bryan Adams</em>
                <br>

                    <input type="radio" id="doPlay" name="songChoice-12037">
                    <label for="doPlay">Do</label>
                    <input type="radio" id="dontPlay" name="songChoice-12037">
                    <label for="dontPlay">Don't</label>
                    <a href="#" id="clear-button">Clear</a>
            </li>
                        </ul>
    </form>

Затем в моем файле ajax JS у меня есть:

var response;

// AJAX for song request details
$('form[id^="songChoice-"]').on('change', function(e) {

e.preventDefault();

$.post( update_user_info.ajaxurl, {
      action : 'update_user_setlist',
      nonce : update_user_info.nonce,
      post : $(this).serialize()
  },
  function(response) {
      console.log(response);
      responseSuccess(response);
  });

return false;

});

Затем, что наиболее важно, функция, которая обрабатывает отправку данных вDB:

function updateSetlistInfo() {

    if(empty($_POST) || !isset($_POST)) {
        self::ajaxStatus('error', 'Nothing to update.');
    } else {
        $data = $_POST;

        $dataString = $data['post'];
        parse_str($dataString, $dataArray);

        $nonce = $data['nonce'];

        if(wp_verify_nonce($nonce, 'update_user_info') !== false) {

            $user_ID = get_current_user_id();
            $post_id = $dataArray['booking_id'];
            //$dataArray['user_addressLine1'] = isset($dataArray['user_addressLine1']) ? $dataArray['user_addressLine1'] : false;


            if($user_ID != NULL) {
                foreach($dataArray as $key=>$value) {

                $status = update_post_meta($post_id, $key, $value);

            }
                self::ajaxStatus('success', 'Meta fields updated.', $dataArray);

            } else {
                self::ajaxStatus('error', 'You are unauthorized to perform this action.', $dataArray);
            }
        } else {
            self::ajaxStatus('error', 'Nonce check cannot fail.');
        }
    }
}

Вышеприведенное взято из другой формы на моей странице, которая передает информацию об адресе пользователя через ajax в базу данных.Тем не менее, это просто добавляет новую строку для каждого элемента формы - я хочу иметь 2 строки, "do_play" и "dont_play" и создать массив сериализованных данных внутри них.любые предложения будут очень полезны на этом этапе, так как я немного застрял

1 Ответ

0 голосов
/ 09 июня 2018

Хорошо, вы не включили полный класс, содержащий метод updateSetlistInfo().Но то, что вы предоставили, выглядит нормально.

Первое, что я бы отладил, это $dataArray.Действительно ли он содержит 2 (do_play / dont_play) клавиши?

Добавьте это (непосредственно перед вызовом foreach):

<code>error_log('$dataArray: <pre>'.print_r($dataArray,true).'
');

Можете ли вы проверить?


Обновление 1: после отладки мы знаем, что dataArray выглядит следующим образом:

array(
  "status" => "success",
  "message" => "Meta fields updated.",
  "data" => array(
    "booking_id" => "12031"
    "songChoice" => array(
      "2" => "dont_play",
      "7" => "dont_play",
    )
  )
)

Ваш foreach сохраняет каждый (верхний уровень) ключ как post_meta_key.

Вот так:

update_post_meta($post_id, 'status', 'success');
update_post_meta($post_id, 'message', 'Meta fields updated.');
update_post_meta($post_id, 'data', ARRAY_THAT_HOLDS_BOOKINGID_SONGCHOICE);

Надеюсь, вы понимаете, что происходит сейчас.Как разработчик, вы должны использовать журнал отладки ALOT.Это всегда первое, к чему вы обращаетесь, когда хотите проверить, все ли работает должным образом.

Надеюсь, я указал вам верное направление, и вы сможете отлаживать свое приложение дальше без моей помощи,Поскольку теперь это выходит за рамки стекового потока, я не могу помочь вам пошагово отлаживать ваше приложение.


WP Debugging
В вашем wp-config.php, измените:

define( "WP_DEBUG", false );

В:

define( "WP_DEBUG", true );// just toggle this line to false to turn off
if ( WP_DEBUG ) {
    define( "WP_DEBUG_DISPLAY", false );
    define( "WP_DEBUG_LOG", true );
    @ini_set( "display_errors", 0 );
    define( "SCRIPT_DEBUG", true );
}

Затем установите плагин для просмотра журнала отладки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...