Woocommerce - пустое содержимое в столбце оформления заказа после вставки подключенной функции с помощью get_value - PullRequest
0 голосов
/ 15 октября 2018

Я пытался подключить эту функцию в одном из «Крюков заказов» на странице оформления заказа в Woocommerce:

add_action( 'woocommerce_checkout_before_order_review', 'add_box_conditional' );
function add_box_conditional ( $checkout ) {
    woocommerce_form_field( 'test', array(
        'type'          => 'checkbox',
        'class'         => array('test form-row-wide'),
        'label'         => __('conditional test'),
        'placeholder'   => __(''),
        ), $checkout->get_value( 'test' ));
}

Если я пытаюсь получить значение пользовательского ящика в любом порядке подключения, информация о заказе просто зависает и перестает загружаться.Я пробовал с другим типом настраиваемых полей, и то же самое происходит.

Пример

Если я перехватываю функцию за пределами содержимого заказа, она работает отлично.Пользовательский флажок будет использоваться для добавления комиссии (после проверки), так как это очень важный вариант для нашего магазина, я хочу, чтобы он был в деталях заказа, чтобы он мог быть в центре внимания.Есть ли способ заставить функцию работать на этих хуках, или я должен поместить ее куда-нибудь и переместить с помощью простой, но не очень чистой перезаписи CSS?

1 Ответ

0 голосов
/ 15 октября 2018

Вы не можете просто получить такое значение $checkout->get_value( 'test' ));.Подцепите woocommerce_checkout_create_order и получите значение от $ _POST.Затем добавьте пользовательскую плату в заказ, если флажок был установлен.

Как это:

function add_box_conditional() {

    woocommerce_form_field( 'test', array(
        'type'        => 'checkbox',
        'class'       => array( 'test form-row-wide' ),
        'label'       => __( 'conditional test' ),
        'placeholder' => __( '' ),
    ) );
}

add_action( 'woocommerce_checkout_before_order_review', 'add_box_conditional' );


function edit_order( $order, $data ) {

    if( ! isset( $_POST[ 'test' ]  ) ) {
        return;
    }

    $checkbox_value = filter_var( $_POST[ 'test' ], FILTER_SANITIZE_NUMBER_INT );

    if( $checkbox_value ){
        $fee = 20;

        $item = new \WC_Order_Item_Fee();
        $item->set_props( array(
            'name'      => __( 'Custom fee', 'textdomain' ),
            'tax_class' => 0,
            'total'     => $fee,
            'total_tax' => 0,
            'order_id'  => $order->get_id(),
        ) );
        $item->save();
        $order->add_item( $item );
        $order->calculate_totals();
    }
}

add_action( 'woocommerce_checkout_create_order', 'edit_order', 10, 2 );
...