Maison  >  Questions et réponses  >  le corps du texte

Dans WooCommerce, affichez les métadonnées des détails de la commande dans les e-mails de confirmation de paiement et les pages de commande d'administration

Nous proposons un certain nombre de produits définis comme des « kits ». Ce sont des listes de produits composées d'autres produits. Les données définissant la suite sont stockées dans le tableau de métadonnées. J'ai créé un hook pour afficher les métadonnées dans la page produit et le panier. Je dois faire quelque chose de similaire dans « E-mail de commande terminée » et « Page de commande administrative », mais je ne sais pas comment le faire. Voici le hook que j'ai créé : <pre class="brush:php;toolbar:false;">add_filter( 'bis_show_kit_meta', 'bis_show_kit_meta_contents', 10, 3 ); fonction bis_show_kit_meta_contents($productID) { global $ wpdb ; $postMeta = get_post_meta($productID,'',true); if ((isset($postMeta['bis_kit_id'])) et ($postMeta['bis_kit_id'][0] > 1)) { echo 'Ceci est un kit contenant les éléments suivants :<br>'; echo $postMeta['bis_kit_type'][0].'<br>'; foreach ($ postMeta comme $ kititem) { foreach ($kititem comme $value) { $nouvellevaleur = désérialiser($valeur); si ($nouvellevaleur) { $newvalue2 = désérialiser($newvalue); if($newvalue2['type']=="kititem"){ echo '<li>' .$nouvellevaleur2['quantité']. ' -> ' $nouvellevaleur2['nom']. } } } } } }</pré> La fonction actuelle est déjà connectée au modèle correspondant dans mon thème enfant. Je ne sais pas comment appliquer une fonction similaire au fichier <code>customer-completed-email.php</code>, ni où dois-je l'accrocher dans la page de commande de modification de l'administrateur. J'ai trouvé du code dans un autre article qui ressemble à ce que je dois faire, mais je n'arrive pas à déterminer dans quel fichier se trouvent les modifications apportées à l'ordre d'administration. Le code que j'ai trouvé est : <pre class="brush:php;toolbar:false;">add_action('woocommerce_before_order_itemmeta','woocommerce_before_order_itemmeta',10,3); fonction woocommerce_before_order_itemmeta($item_id, $item, $product){ ... }</pré> Tout avis serait grandement apprécié
P粉022140576P粉022140576402 Il y a quelques jours376

répondre à tous(1)je répondrai

  • P粉736935587

    P粉7369355872023-08-16 10:40:06

    WooCommerce dispose déjà de nombreux hooks que vous pouvez utiliser dans les modèles WooCommerce au lieu d'ajouter les vôtres...

    Une bonne règle de développement consiste à utiliser d’abord les hooks existants. S'il n'y a pas de hook pratique ou disponible, vous pouvez remplacer le modèle WooCommerce via un thème enfant. Pourquoi? Parce que les modèles sont parfois mis à jour et que vous devez ensuite mettre à jour le modèle modifié, contrairement aux hooks.

    Pour la notification « Commande terminée par le client », utilisez un woocommerce_order_item_meta_endhameçon d'action comme celui-ci :

    // 将email_id设置为全局变量
    add_action('woocommerce_email_before_order_table', 'set_email_id_as_a_global', 1, 4);
    function set_email_id_as_a_global($order, $sent_to_admin, $plain_text, $email = null ){
        if ( $email ) {
            $GLOBALS['email_id_str'] = $email->id;
        }
    }
    
    // 在“客户完成订单”电子邮件通知中显示自定义订单项元数据
    add_action( 'woocommerce_order_item_meta_end', 'custom_email_order_item_meta', 10, 2 );
    function custom_email_order_item_meta( $item_id, $item ){
        // 获取email ID全局变量
        $refGlobalsVar = $GLOBALS;
        $email_id = isset($refGlobalsVar['email_id_str']) ? $refGlobalsVar['email_id_str'] : null;
    
        // 仅适用于“客户完成订单”电子邮件通知
        if ( ! empty($email_id) && 'customer_completed_order' === $email_id ) {
            bis_show_kit_meta_contents( $item->get_product_id() );
        }
    }
    

    Cela vous permettra d'afficher des métadonnées personnalisées uniquement dans la notification « Commande terminée par le client ».

    Alternativement, vous pouvez remplacer le hook par un woocommerce_order_item_meta_start avec les mêmes arguments de variable de fonction.

    Placez le code dans le fichier function.php de votre thème enfant ou dans un plugin.

    répondre
    0
  • Annulerrépondre