WordPress-使用原子操作生成随机唯一编号并更新数据库

时间:2019-01-16 09:48:52

标签: php sql arrays wordpress foreach

我创建了一个名为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
            "
);     

}             

}

1 个答案:

答案 0 :(得分:0)

我设法通过创建两个函数使其工作。一个负责从used = 0表中获取所有可用号码的人,其中lottery_id = $postIDwp_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" 
            } 
}