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!
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_Checkout
create_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.
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:
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' );
}
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