【发布时间】:2019-03-02 21:23:04
【问题描述】:
我正在尝试在 WooCommerce 感谢页面上通过 AJAX 使用 update_meta_data,但我被卡住了。
这是我目前所拥有的:
//Following function gets called from the page already
function renderForm() {
echo "<script>
jQuery(document).ready(function() {
$('body').on('click', '#button', function(){
$.ajax({
type: 'POST',
url: 'https://thepropdrop.com/wp-admin/admin-ajax.php',
data: {
action: 'create_user_meta'
},
success: function(textStatus){
console.log('Success');
},
error: function(MLHttpRequest, textStatus, errorThrown){
alert('errorThrown');
}
});
});
});
</script>";
}
add_action("wp_ajax_create_user_meta", "create_user_meta");
add_action("wp_ajax_nopriv_create_user_meta", "create_user_meta");
function create_user_meta() {
$order = wc_get_order($order_id);
$order->update_meta_data('hasAnswered', 'Yes');
$order->save();
die();
}
您能提供的任何帮助将不胜感激。
EDIT - 我的相关代码,将提供一些上下文:
这是thankyou.php上的按钮:
<span class="button gameStart">
Let's do this
</span>
<script>
jQuery(document).ready(function() {
$('.gameStart').click(function(event){
$(this).remove();
$('.gameHeader').remove();
$('.gamePage .gameContainer').css('display', 'block');
$.ajax({
type: 'GET',
url: '<?php echo admin_url("admin-ajax.php");?>',
data: {
action: 'CCAjax'
},
success: function(textStatus){
$( '.gameForm' ).prepend( textStatus );
},
error: function(MLHttpRequest, textStatus, errorThrown){
alert(errorThrown);
}
});
});
});
</script>
<div class="gameContainer">
<div class="timerWrapper">
<div id="timer">
</div>
</div>
<div class="gameForm">
<h3>Which of the following countries has the largest land mass?</h3>
<div id='answerSubmitButton'>Submit answer</div>
</div>
</div>
然后functions.php:
function CCAjax() {
get_template_part('template-parts/game');
die();
}
add_action('wp_ajax_CCAjax', 'CCAjax');
然后是game.php:
<?php
renderForm();
?>
现在这里是完整的渲染表单功能(它从数据库中提取 3 个可能的答案,并且还有一个倒数计时器,因此我没有发布所有我不想混淆的内容)
function renderForm() {
// Fetch contries object
global $wpdb;
$results = $wpdb->get_results("select * from ( select *,@curRow :=@curRow + 1 as row_number from ( select * from ( select * from wpCountriesDB order by rand() limit 3 )b order by Mass desc )a JOIN (select @curRow :=0)r)x order by RAND()");
// Create array for answers
if(!empty($results)) {
$i = 1;
foreach ($results as $r) {
echo "<div class='answerWrapper'>
<span class='questionNumber'><span>$i</span></span>
<label class='label' for='radio$i'>".$r->Country."</label>
<input type='radio' id='radio$i' name='like' value='$r->row_number' />
</div>";
$i++;
}
}
// Display timer and check answer correct
echo "<script>
var timeLeft = 3000;
var elem = document.getElementById('timer');
var timerId = setInterval(countdown, 1000);
function countdown() {
if (timeLeft < 0) {
clearTimeout(timerId);
$('#answerSubmitButton').click();
} else {
elem.innerHTML = timeLeft + 's';
timeLeft--;
}
}
jQuery(document).ready(function() {
$('body').on('click', '#answerSubmitButton', function(){
var fetchInput = document.querySelector('.answerWrapper input[name=\'like\']:checked');
var fetchSelected = fetchInput.value;
if (fetchSelected == 1) {
$.ajax({
type: 'POST',
url: 'ajaxURL',
data: {
action: adding_custom_meta
},
success: function(textStatus){
console.log('Success');
},
error: function(MLHttpRequest, textStatus, errorThrown){
alert('errorThrown');
}
});
} else {
console.log('incorrect')
}
});
});
</script>";
}
add_action("wp_ajax_create_user_meta", "create_user_meta");
add_action("wp_ajax_nopriv_create_user_meta", "create_user_meta");
function create_user_meta() {
$order = wc_get_order($order_id);
$order->update_meta_data('hasAnswered', 'Yes');
$order->save();
die();
}
我必须在一开始就传递订单 ID 吗?
【问题讨论】:
-
but I am stuck- 这是什么意思。我有一次踩到这种口香糖,然后卡住了……首先,$order = wc_get_order($order_id);increate_user_meta-$order_id未定义,因此永远找不到正确的顺序。 -
改用
$order = wc_get_order($_POST['order_id']);。当然,这假设您发送了订单 ID,而您没有发送。data: { action: 'create_user_meta'},所以你必须把它发送到。在 wordpress 的 AJAX 端点中,它不知道你在前端做什么(因为它是一个通用 url,用于所有 AJAX 调用),你必须告诉它。 -
硬编码 URL
url: 'https://thepropdrop.com/wp-admin/admin-ajax.php',而不是使用get_admin_url(null, 'admin-ajax.php')或类似的方法来动态获取 URL 也是不好的做法。这样,如果您更改了域名,您就不必查看所有代码来修复它。 -
感谢两位回复我。我只是手动将订单 ID 放入函数中: $order = wc_get_order('354');它奏效了——我需要做的就是弄清楚如何发送订单 ID
标签: php ajax wordpress woocommerce orders