web-dev-qa-db-fra.com

Ajouter des méta supplémentaires pour les commandes dans Woocommerce

Je crée un plugin personnalisé pour mon site Web.

Dans une partie de ce plugin, j'ai besoin de stocker des méta supplémentaires dans wp_postmeta Pour chaque commande.

J'ai ajouté ceci dans la classe de mon plugin:

`add_action ('woocommerce_before_checkout_process', array( &$this, 'add_item_meta', 10, 2) );`

Et ceci est la fonction add_item_meta():

    function add_item_meta( $item_id, $values ) {
            wc_add_order_item_meta($item_id, '_has_event', 'yes' );
        }

Cette fonction n'est pas complète, mais rien ne se passe avec ces codes; Je pense que je dois utiliser un autre crochet, mais je ne trouve pas le bon.

Quelqu'un sait-il quelque chose à ce sujet?

J'ai également un autre problème avec $item_id: Il s'agit de la variable globale woocommerce mais je ne la vois pas dans mon plugin!

Je veux dire que je n'ai pas accès à cette variable depuis mon plugin ou quelque chose comme ça!

18
Mo Saeedi

La façon 2018:

Construit sur Guido WP réponse que vous pouvez utiliser à la place woocommerce_checkout_create_order crochet d'action dans un plus léger et efficace code de version (en utilisant méthodes WC 3+ CRUD ):

add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
function before_checkout_create_order( $order, $data ) {
    $order->update_meta_data( '_custom_meta_key', 'value' );
}

Le code va dans le fichier function.php de votre thème enfant actif (ou thème actif).

Testé et fonctionne dans WooCommerce 3+ (uniquement).


QUELQUES EXPLICATIONS:

Le crochet d'action woocommerce_checkout_create_order n'est qu'une étape avant d'enregistrer les données de la commande. Voir ci-dessous dans un extrait de la méthode WC_Checkoutcreate_order() (avec les deux crochets):

/**
 * Action hook to adjust order before save.
 * @since 3.0.0
 */
do_action( 'woocommerce_checkout_create_order', $order, $data );

// Save the order.
$order_id = $order->save();

do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );

return $order_id;

Pourquoi utiliser à la place woocommerce_checkout_create_order:

  • Parce que vous n'avez pas besoin d'utiliser $order = wc_get_order( $order_id ); comme vous l'avez déjà obtenu $order comme argument dans la fonction hookée .
  • Vous n'avez pas besoin d'utiliser $order->save(); car cela sera fait juste après de toute façon (voir le code source)
  • woocommerce_checkout_create_order A également été publié dans la version 3 de WooCommerce et c'est également la bonne.

Cela fonctionne donc avec une seule ligne de code à l'intérieur de la fonction.

26
LoicTheAztec

En s'appuyant sur la réponse de Mo Saeedi, je pense que cet extrait est plus conforme à la nouvelle approche CRUD introduite par WooCommerce 3.0:

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {
    $order = wc_get_order( $order_id );
    $order->update_meta_data( 'my_custom_meta_key', 'my data' );
    $order->save();
} , 10, 2);

Voir aussi ces discussions sur les forums WordPress:

17

la réponse est: je devrais utiliser woocommerce_checkout_update_order_meta pour add_action et aussi je devrais simplement utiliser update_post_meta() pour ajouter des méta supplémentaires à ma commande

    function add_item_meta( $order_id ) {
            //global $woocommerce;
            update_post_meta( $order_id, '_has_event', 'yes' );
        } 
4
Mo Saeedi

La manière 2016:

add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {  
    update_post_meta( $order_id, 'my_custom_meta_key', 'my data' );  
} , 10, 2);
  • $order_id est l'ID de la commande, qui est stocké en tant que type de publication personnalisé
  • $posted est toutes les données de $_POST
3
Sorin C