Включить пользовательское поле при оформлении заказа и в Моем аккаунте в Woocommerce 3 - PullRequest
0 голосов
/ 27 июня 2018

Я создал несколько настраиваемых полей для Woocommerce на странице оформления заказа. Я смог отобразить их в административной области WP, электронной почте и счетах, но не в Front-End для панели пользователя.

Это код, который я использовал для создания поля "CODICE SNEP" в моем CHILD-THEM в файле function.php:

// Create hook - CODICE SNEP
add_filter( 'woocommerce_checkout_fields' , 'codice_snep' );
function codice_snep ( $fields ) {
     $fields['billing']['codice_snep'] = array(
    'label'     => __('Codice Snep', 'woocommerce'),
    'placeholder'   => _x('Codice Snep', 'placeholder', 'woocommerce'),
    'required'  => true,
    'clear'     => true
     );

     return $fields;
}

add_action( 'woocommerce_checkout_update_order_meta', 'codice_snep_order_meta' );
function codice_snep_order_meta( $order_id ) {
    if ( ! empty( $_POST['codice_snep'] ) ) {
        update_post_meta( $order_id, 'Codice Snep', sanitize_text_field( $_POST['codice_snep'] ) );
    }
}

// Save the custom field 'codice_snep' 
add_action( 'woocommerce_save_account_details', 'save_codice_snep_account_details', 12, 1 );
function save_codice_snep_account_details( $user_id ) {
    // For Codice Snep
    if( isset( $_POST['codice_snep'] ) )
        update_user_meta( $user_id, 'codice_snep', sanitize_text_field( $_POST['codice_snep'] ) );


}

После этого я показываю ошибку, если вы не поставите поле:

// Show error if you don't insert CODICE SNEP
add_action('woocommerce_checkout_process', 'required_codice_snep_checkout_field_process');
function required_codice_snep_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['codice_snep'] )
        wc_add_notice( __( 'Compila il campo Codice SNEP .' ), 'error' );
}

Чем я показываю код в Админке WC, электронные письма и счета:

// Show field codice snep  in the Wc pdf invoices plugin
add_action( 'wpo_wcpdf_after_order_data', 'wpo_wcpdf_codice_snep', 10, 2 );
function wpo_wcpdf_codice_snep ($template_type, $order) {
    $document = wcpdf_get_document( $template_type, $order );
    if ($template_type == 'invoice') {
        ?>
        <tr>
            <th>Codice Snep:</th>
            <td><?php $document->custom_field('Codice Snep'); ?></td>
        </tr>
        <?php
    }
}

// Show CODICE SNEP in Back End Wp
add_action( 'woocommerce_admin_order_data_after_billing_address', 'codice_snep_order_meta_admin', 10, 1 );
function codice_snep_order_meta_admin($order){
    echo '<p><strong>'.__('Codice Snep').':</strong> ' . get_post_meta( $order->id, 'Codice Snep', true ) . '</p>';
}

// Show codoce snep in the order email

add_filter('woocommerce_email_order_meta_keys', 'my_custom_codice_snep_order_meta_keys');
function my_custom_codice_snep_order_meta_keys( $keys ) {
    $keys[] = 'Codice Snep';
    return $keys;
}

Кажется, все работает, пока здесь.

Теперь проблема состоит в том, чтобы просто показать (должно быть недоступно для редактирования) это поле (codice_snep) в интерфейсе Dashboard.

Прямо сейчас я пытаюсь с этим, но я вижу только метку без значения поля.

// Show codice snep in the Dashboard of the user in front-end.
add_action( 'woocommerce_account_dashboard', 'codice_snep_order_dashboard', 12, 1 );
function codice_snep_order_dashboard ($order){
    echo '<p><strong>'.__('Codice Snep').':</strong> ' . get_post_meta( $order->id, 'Codice Snep', true ) . '</p>';
}

Вот что происходит: Поле не отображается на приборной панели

Можете ли вы помочь мне решить эту проблему, чтобы показать value, который пользователь вставил при оформлении заказа?

1 Ответ

0 голосов
/ 28 июня 2018

Код, который вы используете, немного устарел и / или некоторые хуки устарели (даже если они взяты из документации Woocommerce) .

Код ниже использует разные хуки. Это позволяет отображать это поле и связанные с ним данные (если они есть) в кассе и в разделе «Мой счет»> «Адреса»> «Поля выставления счетов» без необходимости дополнительного кода проверки.

Кроме того, при размещении заказа данные сохраняются с помощью одного хука в заказе и в метаданных пользователя одновременно. Таким образом, код более компактен и использует правильные хуки с новыми методами CRUD , представленными в Woocommerce 3.

Ваш повторный код:

// Display a custom field on checkout and on My account > edit billing address
add_filter( 'woocommerce_billing_fields' , 'adding_billing_codice_snep', 20, 1 );
function adding_billing_codice_snep ( $fields ) {
     $fields['billing_codice_snep'] = array(
        'label'       => __('Codice Snep', 'woocommerce'),
        'placeholder' => _x('Codice Snep', 'placeholder', 'woocommerce'),
        'class'       => array('form-row-wide'),
        'required'    => true,
        'clear'       => true,
     );

     return $fields;
}

// Save the custom field data to the order meta data and to user meta data
add_action( 'woocommerce_checkout_create_order', 'codice_snep_order_meta', 20, 2 );
function codice_snep_order_meta( $order, $data ) {
    if ( isset( $_POST['billing_codice_snep'] ) && ! empty( $_POST['billing_codice_snep'] ) ) {
        $order->update_meta_data('_billing_codice_snep', sanitize_text_field( $_POST['billing_codice_snep'] ) );
        update_user_meta( $order->get_customer_id(), 'billing_codice_snep', sanitize_text_field( $_POST['billing_codice_snep'] ) );
    }
}

// Order pages (frontend and admin): Display custom field "codice snep"
add_filter( 'woocommerce_order_details_after_order_table' , 'display_admin_order_meta_codice_snep', 20, 1 ); // Front
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_admin_order_meta_codice_snep', 20, 1 ); // Admin
function display_admin_order_meta_codice_snep( $order ){
    $codice_snep = $order->get_meta('_billing_codice_snep', true );
    if( ! empty( $codice_snep ) ){
        $label = __('Codice Snep');
        if( is_admin() ){ // Admin
            echo '<p><strong>' . $label . ':</strong> ' . $codice_snep . '</p>';
        }
        else { // Front end: order view and Order received (thankyou)
            echo '<table class="woocommerce-table"><tbody><tr>
                <th>' . $label . ':</th><td>' . $codice_snep . '</td>
            </tr></tbody></table>';
        }
    }
}

// Email notifications: Display custom field "codice snep"
add_filter( 'woocommerce_email_order_meta_fields' , 'display_email_codice_snep', 20, 3 );
function display_email_codice_snep ( $fields, $sent_to_admin, $order ) {
    $codice_snep = $order->get_meta('_billing_codice_snep', true );
    if( ! empty( $codice_snep ) )
        $fields['codice_snep'] = array(
            'label' => __("Codice Snep"),
            'value' => $codice_snep,
        );
    return $fields;
}

// PDF Invoices: Display custom field "codice snep"
add_action( 'wpo_wcpdf_after_order_data', 'display_pdf_invoice_codice_snep', 20, 2 );
function display_pdf_invoice_codice_snep ($template_type, $order) {
    $document = wcpdf_get_document( $template_type, $order );
    if ($template_type == 'invoice') {
        echo '<tr>
            <th>' . __("Codice Snep") . ':</th>
            <td>' . $order->get_meta('_billing_codice_snep', true ) . '</td>
        </tr>';
    }
}

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

Вид заказа:

enter image description here

Моя учетная запись> адреса> Биллинг

enter image description here

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