【问题标题】:Add serialised data to wp database from form of radio buttons via AJAX通过 AJAX 从单选按钮的形式将序列化数据添加到 wp 数据库
【发布时间】:2018-11-18 23:19:42
【问题描述】:

我有一个 wordpress 帖子,它显示了一个由几首列出的歌曲组成的表单,每首歌曲都有 2 个单选按钮(“播放”和“不播放”)。

我想将这些单选按钮的数据作为 2 组序列化数据存储在我的数据库中,即如果选中“播放”单选按钮

1:do_play = 歌曲名称 1 2:do_play = 歌曲名称 2 3:do_play = 歌曲名称 3 4: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";}

对于从“Don't Play”中选择的歌曲,相同,但在不同的 DB 行中:

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”,并在其中建立一个序列化数据数组。在这一点上,任何建议都会有很大帮助,因为我有点卡住了

【问题讨论】:

    标签: php arrays ajax wordpress serialization


    【解决方案1】:

    好的,您没有包含包含updateSetlistInfo() 方法的完整类。但是你提供的看起来没问题。

    我要调试的第一件事是$dataArray。 它确实拥有 2 个 (do_play / dont_play) 键吗?

    添加这个(就在 foreach 调用之前):

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

    你能查一下吗?


    更新 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);
    

    我希望你明白现在发生了什么。作为开发人员,您必须大量使用调试日志。当您想要检查一切是否按预期运行时,它始终是您首先要做的事情。

    我希望我已经为您指明了正确的方向,并且您可以在没有我帮助的情况下进一步调试您的应用程序。因为现在它有点超出了 stackoverflow 的范围,所以我无法帮助您逐步调试您的应用程序。


    WP 调试
    在您的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 );
    }
    

    然后安装一个debug log viewer 插件。

    【讨论】:

    • 嗨@Bjorn - 你能解释一下调试 $dataArray 中内容的最佳方法吗?
    • 好的,完美,我已经安装了调试日志查看器,更改了 wp-config.php 并在我的 updateSetlistinfo() 函数中的 foreach 语句之前添加了 tht 行 - 目前在我提交时调试查看器中没有显示错误
    • 直接在您的functions.php中添加error_log('debug log working');并确认它正在工作。
    • 好的,所以您尝试了 ajax 调用,但看不到 $dataArray 日志条目。这意味着代码没有被调用。现在你可以沿着链条尝试调试,直到你看到日志,然后你就会知道代码执行在哪里停止。我会先在updateSetlistInfo() 开始标记之后放置一个error_log(),以检查它是否真的被ajax 动作钩子调用。
    • 还有一件事,你是不是从某个地方复制了这段代码,你有任何 wp_ajax 知识吗?我想了解你的技能水平。我假设您使用 wright 操作挂钩来设置 ajax 调用。你在哪里调用 ajax,前端还是后端?
    猜你喜欢
    • 2013-02-23
    • 2012-04-12
    • 1970-01-01
    • 2015-11-30
    • 2019-06-30
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多