Ошибка редактируемых пользовательских полей биллинга в Woocommerce 3 - PullRequest
0 голосов

У меня есть ошибка, расположенная в этом коде (которая добавляет в страницы редактирования порядок редактирования настраиваемых полей биллинга):

add_filter( 'woocommerce_admin_billing_fields' , 'order_admin_custom_fields' );
function order_admin_custom_fields( $fields ) {
    global $theorder;

    $fields['billing_address_3'] = array(
        'label' => __( 'Home', 'woocommerce' ),
        'value'=> get_post_meta( $theorder->get_id(), 'Home', true ),
        'show'  => true,
        'wrapper_class' => 'form-field-wide',
        'style' => '',
    );

    $fields['billing_address_4'] = array(
        'label' => __( 'Entrance', 'woocommerce' ),
        'value'=> get_post_meta( $theorder->get_id(), 'Entrance', true ),
        'show'  => true,
        'wrapper_class' => 'form-field-wide',
        'style' => '',
    );

    $fields['billing_address_5'] = array(
        'label' => __( 'Floor', 'woocommerce' ),
        'value'=> get_post_meta( $theorder->get_id(), 'Floor', true ),
        'show'  => true,
        'wrapper_class' => 'form-field-wide',
        'style' => '',
    );

    return $fields;
}

Виновная линия: 'value'=> get_post_meta( $theorder->get_id(), 'Home', true ),

Сообщить об ошибке:

example.com [Wed Jul 04 02:36:28 2018] [error] [pid 148187] sapi_apache2.c(362): [client 37.146.123.6:33708] PHP Fatal error:  Uncaught Error: Call to a member function get_id() on null in /home/c/cb36070/example.com/public_html/wp-content/themes/theme-name/functions.php:607\nStack trace:\n#0 /home/c/cb36070/example.com/public_html/wp-includes/class-wp-hook.php(286): order_admin_custom_fields(Array)\n#1 /home/c/cb36070/example.com/public_html/wp-includes/plugin.php(203): WP_Hook->apply_filters(Array, Array)\n#2 /home/c/cb36070/example.com/public_html/wp-content/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-order-data.php(87): apply_filters('woocommerce_adm...', Array)\n#3 /home/c/cb36070/example.com/public_html/wp-content/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-order-data.php(526): WC_Meta_Box_Order_Data::init_address_fields()\n#4 /home/c/cb36070/example.com/public_html/wp-includes/class-wp-hook.php(286): WC_Meta_Box_Order_Data::save(951, Object(WP_Post))\n#5 /home/c/cb36070/example.com/public_html/wp-includes/class-wp-hook.php(310): WP_Hook->apply_filters(NULL, Array)\n#6 /home/c/cb360 in /home/c/cb36070/example.com/public_html/wp-content/themes/theme-name/functions.php on line 607

Но мне нужно получить сохраненные значения для этих пользовательских полей выставления счетов.

Как я могу решить эту проблему и получить значения настраиваемых полей для выставления счетов?

Добавленные (сохраненные) метаданные создаются с помощью этого кода:

add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta' );
function custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['billing_address_3'] ) ) {
        update_post_meta( $order_id, 'Home', sanitize_text_field( $_POST['billing_address_3'] ) );
    }

    if ( ! empty( $_POST['billing_address_4'] ) ) {
        update_post_meta( $order_id, 'Entrance', sanitize_text_field( $_POST['billing_address_4'] ) );
    }

    if ( ! empty( $_POST['billing_address_5'] ) ) {
        update_post_meta( $order_id, 'Floor', sanitize_text_field( $_POST['billing_address_5'] ) );
    }
}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 июля 2018

Проблема в том, что $theorder не определен, и вы не можете использовать метод get_id() для него.

Но основная проблема в вашем коде связана с полями выставления счетов за оформление заказа. Они должны быть установлены, отображены и сохранены следующим образом: (особенно обращая внимание на meta_keys, который будет использоваться при сохранении данных) :

// Frontend: Display the custom billing fields (in checkout and my account)
add_filter( 'woocommerce_billing_fields' ,'add_custom_billing_fields', 20, 1 );
function add_custom_billing_fields( $fields ) {

    $fields['billing_address_3'] = array(
        'label' => __( 'Home', 'woocommerce' ),
        'placeholder'   => _x('Fill in your Home', 'placeholder', 'woocommerce'),
        'required'  => true,
        'class'     => array('form-row-wide'),
        'clear'     => true
    );

    $fields['billing_address_4'] = array(
        'label' => __( 'Entrance', 'woocommerce' ),
        'placeholder'   => _x('Fill in your Entrance', 'placeholder', 'woocommerce'),
        'required'  => true,
        'class'     => array('form-row-wide'),
        'clear'     => true
    );

    $fields['billing_address_5'] = array(
        'label' => __( 'Floor', 'woocommerce' ),
        'placeholder'   => _x('Fill in your Floor', 'placeholder', 'woocommerce'),
        'required'  => true,
        'class'     => array('form-row-wide'),
        'clear'     => true
    );

    return $fields;
}

// Save the custom billing fields (once order is placed)
add_action( 'woocommerce_checkout_create_order', 'save_custom_billingt_fields', 20, 2 );
function save_custom_billingt_fields( $order, $data ) {
    if ( isset( $_POST['billing_address_3'] ) && ! empty( $_POST['billing_address_3'] ) ) {
        $order->update_meta_data('_billing_address_3', sanitize_text_field( $_POST['billing_address_3'] ) );
        update_user_meta( $order->get_customer_id(), 'billing_address_3', sanitize_text_field( $_POST['billing_address_3'] ) );
    }
    if ( isset( $_POST['billing_address_4'] ) && ! empty( $_POST['billing_address_4'] ) ) {
        $order->update_meta_data('_billing_address_4', sanitize_text_field( $_POST['billing_address_4'] ) );
        update_user_meta( $order->get_customer_id(), 'billing_address_4', sanitize_text_field( $_POST['billing_address_4'] ) );
    }
    if ( isset( $_POST['billing_address_5'] ) && ! empty( $_POST['billing_address_5'] ) ) {
        $order->update_meta_data('_billing_address_5', sanitize_text_field( $_POST['billing_address_5'] ) );
        update_user_meta( $order->get_customer_id(), 'billing_address_5', sanitize_text_field( $_POST['billing_address_5'] ) );
    }
}

Вы увидите, что эти настраиваемые поля также находятся в разделе Моя учетная запись> адреса> Изменить адрес для выставления счета. И все что связано с автосинхронизацией. Нет необходимости в дополнительной проверке или сохранении кода ...

Теперь на страницах заказа администратора, для ловушки администратора woocommerce_admin_billing_fields, ключ 'value' не существует в массиве полей и он виновен .

Поскольку вы правильно установили и сохранили свои пользовательские поля извлечения, вам не нужен ключ массива 'value', так как данные будут автоматически заполняться , если они существуют. Итак, ваш код будет:

// Backend: Display editable custom billing fields
add_filter( 'woocommerce_admin_billing_fields' , 'order_admin_custom_fields' );
function order_admin_custom_fields( $fields ) {
    global $the_order;

    $fields['address_3'] = array(
        'label' => __( 'Home', 'woocommerce' ),
        'show'  => true,
        'wrapper_class' => 'form-field-wide',
        'style' => '',
    );

    $fields['address_4'] = array(
        'label' => __( 'Entrance', 'woocommerce' ),
        'show'  => true,
        'wrapper_class' => 'form-field-wide',
        'style' => '',
    );

    $fields['address_5'] = array(
        'label' => __( 'Floor', 'woocommerce' ),
        'show'  => true,
        'wrapper_class' => 'form-field-wide',
        'style' => '',
    );

    return $fields;
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Ошибка теперь окончательно исчезла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...