这是我第一次尝试将ajax添加到WordPress插件中。我取得了一些成功,但有几个方面我被卡住了。我从这里的每个人那里学到了很多东西,所以我希望自己没有受到欢迎? ;)
这是场景。我试图在更新单个表单的问题答案列表后使用ajax来防止页面重新加载。这是WordPress插件的管理页面的一部分,但我认为我已经用WP覆盖了我的基础,因为它确实有效。
PHP:
//Update an answer
function ccd_ex_update_answer() {
global $wpdb;
$wpdb->update( $wpdb->prefix . 'ccd_ex_answers', array(
'answer' => $_POST['answer'],
'sort' => $_POST['sort'],
'correct' => $_POST['correct'],
'question_id' => $_POST['question_id']
), array(
'ID' => $_POST['id']
)
);
}
add_action( 'wp_ajax_ccd_ex_update_answer', 'ccd_ex_update_answer' );
jQuery:
//Update Answers
jQuery(document).ready(function($) {
$('.aupdatebutton').live("click", function(){
var thisupdate = $(this).data('aupdate');
$(thisupdate).submit(function(){
var answer = $(".answer").val();
var sort = $(".sort").val();
var correct = $(".correct").val();
var question_id = $(".question_id").val();
var id = $(".id").val();
$.ajax({
type: 'POST',
url: ajaxurl,
data: {
action: 'ccd_ex_update_answer',
answer: answer,
sort: sort,
correct: correct,
question_id: question_id,
id: id
},
success: function(data, textStatus, XMLHttpRequest){
jQuery("#test-div").html('').fadeIn(500);
jQuery("#test-div").append("Answer Updated!").fadeOut(3000);
},
error: function(MLHttpRequest, textStatus, errorThrown){
alert(errorThrown);
}
});
return false;
});
});
});
问题1。 就像现在一样,ajax调用可以更新与.answer相关联的字段,但是当我尝试更新任何其他字段时形式,它不会发生。我在这方面缺少什么?
问题2。 我想添加更新答案列表的功能,以便使用ajax调用反映新更新的内容。如何添加正确的回调来执行此操作? 编辑:问题1使这个帖子变得如此冗长以至于我将把这个问题带到一个新的主题。
这些答案列表目前正在循环中创建:
<?php
$aresult = $wpdb->get_results("SELECT * FROM " . $wpdb->prefix . "ccd_ex_answers WHERE question_id = " . $qrow->id . " ORDER BY sort ASC");
foreach( $aresult as $key => $arow ) {
?>
<form id="update-answer-<?php echo $arow->question_id."-".$arow->id; ?>" action="" method="post">
<input type="hidden" class="id" name="id" value="<?php echo $arow->id; ?>" />
<input type="hidden" class="question_id" name="question_id" value="<?php echo $qrow->id; ?>" />
<div style="float:left;">
<input type="text" style="width:40px;margin-right:15px;" class="sort" name="sort" value="<?php echo $arow->sort; ?>"/>
</div>
<div style="float:left;">
<input type="text" style="width:480px;" class="answer" name="answer" value="<?php echo $arow->answer; ?>"/>
</div>
<div style="float:left;">
<select class="correct" name="correct">
<option value="0"<?php selected( 0 , $arow->correct ); ?>>No</option>
<option value="1"<?php selected( 1 , $arow->correct ); ?>>Yes</option>
</select>
</div>
<div>
<input type="submit" name="aupdate" data-aupdate="#update-answer-<?php echo $arow->question_id."-".$arow->id; ?>" value="Update" class="aupdatebutton ccd-ex-show-questions toggletable<?php echo $qrow->id; ?>"/>
<input type="submit" name="adelete" value="Delete" class="ccd-ex-show-questions toggletable<?php echo $qrow->id; ?>"/>
</div>
<div style="clear:both;"></div>
</form>
<?php
}
?>
我有点像jQuery和js领域的中间菜鸟,就像我说的那样,这是我第一次尝试ajax。我很高兴有事情向我解释,如果它避免重要的知识飞过我的脑袋。
如果我遗漏了任何重要内容,我会保持密切。
谢谢!
更新
我觉得可能是因为数据库结构的原因而不更新字段的问题?更新的字段是VARCHAR,但两个不是INT和BOOLEAN ......不确定是否有所不同。当函数完全是PHP时,它没有。
UPDATE2:
更正了代码中仍然对这两个问题没有影响的拼写错误。
UPDATE2:
根据brandwaffel的建议,以下是向控制台输出调试信息的结果:
int(0)
0
UPDATE3:
在进一步调试中,我将每个单独的变量写入控制台,无论我在答案列表中更新哪个答案,变量都会反映列表第一个位置的表单/字段。我现在看到我原来认为只有答案字段更新是错误的。
真正发生的事情是列表中的第一个项目应该更新,而其他任何项目都会失败,这可能是由于jQuery变量的内容。
现在问题似乎是如何调整我的变量,以便用正确的表单字段实例填充它们?
如果它有助于可视化所有这些,这里是管理页面的屏幕截图。当前问题仅与更新答案的功能有关。
更新4 - 最终工作版本
这是jQuery的最终版本。虽然在评论中对其他代码有很好的建议,但我的问题的解决方案是在jQuery中。解决方案是正确定义填充变量的实例。
使用jQuery:
//Update Answers
jQuery(document).ready(function($) {
$('.aupdatebutton').live("click", function(){
var thisupdate = $(this).data('aupdate');
$(thisupdate).submit(function(){
// Get the proper instance of the form fields for the variables
var answer = $(this).find('.answer').val();
var sort = $(this).find('.sort').val();
var correct = $(this).find('.correct').val();
var question_id = $(this).find('.question_id').val();
var id = $(this).find('.id').val();
$.ajax({
type: 'POST',
url: ajaxurl,
data: {
action: 'ccd_ex_update_answer',
answer: answer,
sort: sort,
correct: correct,
question_id: question_id,
id: id
},
success: function(data, textStatus, XMLHttpRequest){
jQuery("#test-div").html('').fadeIn(500);
jQuery("#test-div").append("Answer Updated!").fadeOut(3000);
console.log(data);
console.log(answer);
console.log(sort);
console.log(correct);
},
error: function(MLHttpRequest, textStatus, errorThrown){
alert(errorThrown);
}
});
return false;
});
});
});
答案 0 :(得分:1)
更新:我认为您正在遇到有问题的问题。目前,你的jQuery正在抓取.id字段,它会在你的id列表中获得第一个id。您需要为jQuery建立一个上下文来查看特定的问题元素。尝试
$(this).find('.id').val();
依此类推您提交给ajax端点的所有元素。
/更新
看起来你有这个:
'correct' => $_POST['sort'],
你可能想要这个:
'correct' => $_POST['correct'],
为了进一步测试,我建议调试$ wpdb-&gt;更新调用的结果
$debug = $wpdb->update( $wpdb->prefix . 'ccd_ex_answers', array(
'answer' => $_POST['answer'],
'sort' => $_POST['sort'],
'correct' => $_POST['sort'],
'question_id' => $_POST['question_id']
), array(
'ID' => $_POST['id']
)
);
var_dump($debug);
然后在ajax成功处理程序中,只需添加:
console.log(data);
并且您将看到ajax响应的结果(应该是更新查询中更改的行的数组)。
另外,当您单击提交按钮时,您是否在JS控制台中看到任何错误?