我创建了一个名为wp_tickets
的表,该表包含从在我的wordpress帖子中设置的自定义字段生成的票证编号范围。表中的列为'id', 'ticket_id', 'lottery_id'
和'used'
。
当客户在我的网站上购买产品时,我试图生成一个随机的唯一编号。
例如,如果客户订购了五个相同的产品。它需要根据产品元字段'maximum_entries'
中设置的字段生成5个随机唯一编号,然后在wp_tickets
表中将这些编号标记为“已使用”。
我需要将此操作作为基本操作,以便客户在同一时间订购时不能拥有相同的号码。
到目前为止,我已经在woocommerce_order_status_processing
钩子上创建了一个要调用的函数,该函数循环遍历购物车中的每种产品并获得产品数量。然后,在调用array_rand之前,我使用了range函数将其转换为数字数组。
然后,我在$ticketallocated
更新功能中使用$wpdb
。
我遇到的问题是,如果正在生成的数字已在表中标记为“已使用”,则它不会循环回到顶部并重试。我需要以某种方式设置if / else语句,以便如果生成的随机数是5,并且数据库中的“已使用”已经有5,则它将尝试使用其他数字。
add_action('acf/save_post', 'my_acf_save_post', 20);
function my_acf_save_post( $post_id ) {
global $wpdb;
$qty = get_field('maximum_entries');
$array = range(1, $qty);
foreach ($array as $ticket) {
$wpdb->insert('wp_tickets', array(
'ticket_number' => $ticket,
'lottery_id' => $post_id,
));
}
}
add_action( 'woocommerce_order_status_processing', 'ektgn_meta_to_line_item', 20, 4 );
function ektgn_meta_to_line_item( $order_id )
{
$order = wc_get_order($order_id);
foreach( $order->get_items() as $item_id => $item_product ) {
global $wpdb;
$product_id = $item_product->get_product_id();
$qty = get_field('maximum_entries', $product_id, true);
$ticketOptions = range(1, $qty);
$ticketAllocated = array_rand($ticketOptions, 1);
$wpdb->query(
"
UPDATE wp_tickets
SET used = 1
WHERE ticket_number= ".$ticketAllocated." AND lottery_id = ".$product_id." AND used = 0
"
);
}
}
答案 0 :(得分:0)
我设法通过创建两个函数使其工作。一个负责从used = 0
表中获取所有可用号码的人,其中lottery_id = $postID
和wp_tickets
从可用票证编号中返回一个随机数。
然后,第二个函数负责使用从get_available_numbers
函数生成的票证号更新woocommerce_order_status_processing
表。
然后,当客户下订单并针对其购物车中找到的每个项目运行这些功能时,将在function get_available_numbers($postID) {
global $wpdb;
$result = $wpdb->get_results(
"
SELECT ticket_number
FROM wp_tickets
WHERE lottery_id = ".$postID." AND used = 0
ORDER BY RAND()
LIMIT 1
"
);
return $result[0]->ticket_number;
}
function add_ticket_number($postID, $order_id, $number, $user_id) {
global $wpdb;
$wpdb->query(
"
UPDATE wp_tickets
SET used = 1, order_id = ".$order_id.", user_id = ".$user_id."
WHERE ticket_number= ".$number." AND lottery_id = ".$postID." AND used = 0
"
);
}
for ( $i = 0; $i < $item_meta['_qty'][0]; $i++ ) {
$number = $this->get_available_numbers($product_id);
$this->add_ticket_number($product_id, $order_id, $number, $order->get_user_id());
}
挂钩上执行这两个功能。
到目前为止,当我对其进行测试时,它似乎可以正常工作。但是,很难说这如何与多个同时订购的客户一起执行。
used=1
更新
我实际上已经设法通过将lottery_id
列上的function add_ticket_number($postID, $order_id, $user_id) {
global $wpdb;
$wpdb->query(
"
UPDATE wp_tickets
SET used = 1, order_id = ".$order_id.", user_id = ".$user_id."
WHERE lottery_id = ".$postID." AND used = 0
ORDER BY RAND()
LIMIT 1
"
);
}
设置为1,并命令更新为随机且受一个限制,从而将其简化为一种功能。
array(2) {
[0]=> array(3) {
["id"]=> string(1) "1"
["category"]=> string(5) "Music"
["parent"]=> string(1) "1"
}
[1]=> array(3) {
["id"]=> string(1) "2"
["category"]=> string(7) "Fashion"
["parent"]=> string(1) "1"
}
}