Ich versuche, eine zufällige, eindeutige Nummer zu generieren, wenn ein Kunde die Produkte auf meiner Website kauft.
Zum Beispiel, wenn ein Kunde fünf gleiche Produkte bestellt. Es muss 5 zufällige eindeutige Zahlen basierend auf dem im Produktmetafeld festgelegten Feld „maximum_entries“ generieren und diese Zahlen dann in der Tabelle „wp_tickets“ als „verwendet“ markieren.
Ich muss dafür sorgen, dass es sich um einen atomaren Vorgang handelt, damit Kunden nicht die gleiche Nummer haben können, wenn sie gleichzeitig bestellen.
Bisher habe ich eine Funktion erstellt, die über den Hook woocommerce_order_status_processing aufgerufen werden kann, der jedes Produkt im Warenkorb durchläuft und die Produktmenge abruft. Ich habe dann die Range-Funktion verwendet, um dies in ein Array von Zahlen umzuwandeln, bevor ich array_rand aufrufe.
Ich verwende dann $ticketallocated in meiner $wpdb-Aktualisierungsfunktion.
Das Problem, das ich habe, ist, dass, wenn die generierte Nummer in der Tabelle bereits als „verwendet“ markiert ist, sie nicht nach oben zurückspringt und es erneut versucht. Ich muss irgendwie eine if/else-Anweisung einrichten, sodass, wenn die generierte Zufallszahl 5 ist und in der Datenbank bereits eine 5 als „verwendet“ vorhanden ist, eine andere Zahl versucht wird.
Code: Select all
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
"
);
}
}