我有一个wordpress帖子,它显示了一个由几首列出的歌曲组成的表单,每首歌都有两个单选按钮(“播放”和“不播放”)。
我想将这些单选按钮的数据作为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";}
对于从“不播放”中选择的歌曲,相同,但在不同的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将用户地址详细信息提交到数据库。但是,这只是为每个表单项添加一个新行-我想要有两行,"do_play“和"dont_play”,并在其中构建一个序列化数据数组。在这一点上,任何建议都将是一个很大的帮助,因为我有点卡住了
发布于 2018-06-09 05:25:55
好的,您没有包含包含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插件。
https://stackoverflow.com/questions/50768387
复制相似问题