Как повторить переменную в woocommerce_checkout_create_order_line_item?

Ниже моя функция. Но я не вижу своего эха ни на одной странице.

function add_qr_number_to_order_item( $item, $cart_item_key, $values, $order ) {

    if ( is_user_logged_in() ) {

        $user = wp_get_current_user();
        $user_id = $user->ID;
        $qr_code = generate_qr_number($user_id);
        $item->add_meta_data( 'qr_code', $qr_code );

        echo "QR: " . $qr_code; 

    } else {
        wp_redirect( wp_login_url() );
    }
}
add_action( 'woocommerce_checkout_create_order_line_item', 'add_qr_number_to_order_item', 10, 4 );

🤔 А знаете ли вы, что...
PHP предоставляет множество инструментов для отладки кода, таких как Xdebug.


1
278
1

Ответ:

Решено

Обновление 1

1) Этот хук не предназначен для отображения чего-либо или перенаправления пользователя, он предназначен для сохранения (или изменения) метаданных позиции заказа
Поэтому вам лучше использовать вместо этого в вашем случае хук woocommerce_checkout_create_order, чтобы добавить QR-код на основе идентификатора пользователя, как метаданные заказа…

2) Чтобы получить идентификатор пользователя, используйте $order->get_user_id()(если идентификатор пользователя 0, пользователь нет вошел в систему, а в противном случае он вошел в систему).

Предполагая, что ваша пользовательская функция generate_qr_number() работает, правильный код должен быть:

add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_qr_code', 10, 2 );
function save_order_item_qr_code( $item, $cart_item_key, $values, $order ) {
    $user_id = (int) $order->get_user_id();

    if ( $user_id > 0 ){
        $qr_code = generate_qr_number($user_id);
        $order->update_meta_data( 'qr_code', $qr_code );
    }
}

Чтобы проверить, сохранен ли QR-код, вы можете использовать следующее, чтобы отобразить его на страницах редактирования заказа администратора:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_qr_code_to_order_admin', 10, 1 );
function display_qr_code_to_order_admin( $order ){
    if ( $qr_code = $order->get_meta('qr_code') ){
        echo '<div class = "qr-code">
        <table cellpadding = "0" cellspacing = "0" border = "0" style = "margin-top:6px;">
        <tr><th align = "left">'.__('QR Code').':&nbsp;</th><td>&nbsp;' . $qr_code . '</td></tr>
        </table></div>';
    }
}

Код находится в файле functions.php вашей активной дочерней темы (или активной темы). Он должен работать.


Обновление 2

Чтобы сохранить его для каждой позиции заказа, вы должны использовать (при условии, что функция generate_qr_number() работает):

add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_qr_code', 10, 4 );
function save_order_item_qr_code( $item, $cart_item_key, $values, $order ) {
    $user_id = (int) $order->get_user_id();

    if ( $user_id > 0 ){
        $qr_code = generate_qr_number($user_id);
        $item->update_meta_data( 'Qr code', $qr_code );
    }
}