Wordpress - генерирует случайное уникальное число с помощью атомарной операции и обновляет базу данных

Если вы хотите пойти по пути subprocess.call(), это должно выглядеть так, как в Windows:

import subprocess
subprocess.call(('cmd', '/C', 'start', '', FILE_NAME))

Вы не можете просто использовать:

subprocess.call(('start', FILE_NAME))

, потому что start не является исполняемым файлом , а является командой программы cmd.exe. Это работает:

subprocess.call(('cmd', '/C', 'start', FILE_NAME))

, но только в том случае, если в FILE_NAME нет пробелов.

Хотя метод subprocess.call правильно задает параметры, команда start имеет довольно странную синтаксис, где:

start notes.txt

делает что-то еще:

start "notes.txt"

В первой цитируемой строке следует указать заголовок окна. Чтобы заставить его работать с пробелами, мы должны сделать:

start "" "my notes.txt"

, что и делает код сверху.

1
задан Shaun 16 January 2019 в 09:48
поделиться

1 ответ

1110 Мне удалось заставить его работать, создав две функции. Один отвечает за получение всех доступных номеров из таблицы 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
            "
                    );
}
0
ответ дан Shaun 16 January 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: