Enregistrez la valeur du champ personnalisé de paiement et affichez-la dans les commandes de l'administrateur WooCommerce

Jan 07 2021

J'ai quelques champs supplémentaires dans ma commande pour poser des questions au client sur certaines choses concernant sa commande. La plupart d'entre eux sont des champs de saisie de texte, mais il existe un menu Sélectionner leur demandant comment ils ont entendu parler du site de mes clients. Je n'ai pas pu comprendre comment afficher la valeur dans la zone méta de la commande pour l'option sélectionnée. Voici comment je génère cette liste déroulante dans mon fichier functions.php à partir de mon thème.

woocommerce_form_field( 'aba_hear', array(
    'type'     => 'select',
    'required' => 'true',
    'class'    => array('hear-class form-row-wide'),
    'label'    => __('How did You Hear About Us?'),
    'options'  => array( // options for <select> or <input type="radio" />
        ''          => 'Please select', // empty values means that field is not selected
        'Instagram' => 'Instagram',
        'Facebook'  => 'Facebook',
        'Yelp'  => 'Yelp',
        'Other' => 'Other',
    )

), $checkout->get_value( 'aba_hear' ) );

Maintenant, je vais ajouter une fonction pour mettre à jour les méta-valeurs de la commande:

add_action( 'woocommerce_checkout_update_order_meta', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['aba_hear'] ) ) { update_post_meta( $order_id, 'How did You Hear About Us&#63;', sanitize_text_field( $_POST['aba_hear'] ) );
    }
}

Et enfin afficher la valeur sur la page de commande:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . get_post_meta( $order->id, 'Is this a Gift&#63;', true ) . '</p>';
}

Enfin, voici comment le code du menu de sélection apparaît à la caisse:

<p class="form-row hear-class form-row-wide validate-required" id="aba_hear_field" data-priority="">
    <label for="aba_hear" class="">How did You Hear About Us&#063;&nbsp;<abbr class="required" title="required">*</abbr></label>
    <span class="woocommerce-input-wrapper">
        <select name="aba_hear" id="aba_hear" class="select " data-allow_clear="true" data-placeholder="Please select">
            <option value=""  selected='selected'>Please select</option>
            <option value="Instagram" >Instagram</option>
            <option value="Facebook" >Facebook</option>
            <option value="Yelp" >Yelp</option>
            <option value="Other" >Other</option>
        </select>
    </span>
</p>

Maintenant, cela fonctionne très bien pour les champs de saisie de texte mais pas pour sélectionner les menus. Comment puis-je changer cela pour le faire fonctionner afin que je puisse afficher les données résultantes?

Réponses

1 LoicTheAztec Jan 07 2021 at 15:07

Il y a des erreurs dans certaines de vos fonctions ... Vous devez utiliser la même touche de champ de vérification que la touche méta dans les fonctions suivantes:

Dans la 2ème fonction, vous utilisez un autre hook et enregistrez également le champ personnalisé en tant que métadonnées utilisateur:

add_action( 'woocommerce_checkout_create_order', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order ) { if ( isset($_POST['aba_hear']) && ! empty($_POST['aba_hear']) ) { $order->update_meta_data( '_aba_hear', sanitize_text_field( $_POST['aba_hear'] ) ); // Update user data if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(), 'aba_hear', true );
        }
    }
}

Dans la 3ème fonction, utilisez ceci:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta( $order ){
    $value = $order->get_meta( '_aba_hear' );

    if ( ! empty($value) ) { echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . $value . '</p>';
    }
}

Cela devrait mieux fonctionner maintenant.


Remarques:

Pourquoi enregistrer ce champ de paiement également en tant que métadonnées utilisateur personnalisées?

Parce que dans votre première fonction, vous avez $checkout->get_value( 'aba_hear' )qui affichera la valeur sélectionnée à partir de la dernière commande du client dans ce champ de paiement personnalisé. La valeur est lue à partir de la méta utilisateur 'aba_hear'.