wp_tickets
, где 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
"
);
}