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

Personnaliser la méthode de zone d'expédition Woocommerce

<p>J'ai passé plusieurs heures à essayer de trouver la bonne façon de mettre en œuvre une solution permettant de créer une méthode de zone d'expédition personnalisée. </p> <p>WC:7.2.2 Stress au travail : 6.0.3</p> <p>Le site est en bonne santé, aucune erreur d'autorisation, etc. (uniquement les mises à jour des informations disponibles)</p> <p>J'ai utilisé un certain nombre de sources telles que : https://woocommerce.github.io/woocommerce-rest-api-docs/?php#shipping-zone-methods</p> <p>https://github.com/woocommerce/woocommerce/wiki/Shipping-Method-API#properties</p> <p>https://gist.github.com/mikejolley/3b37b9cc19a774665f31</p> <p>https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098</p> <p>Il en existe bien d’autres. </p> <p>Fondamentalement, j'ai besoin d'un exemple de code pour créer (un plug-in) pour une méthode de zone d'expédition avec une fonction de frais d'expédition personnalisée. Nous sommes basés sur Woocommerce Easy Booking et avons des jours dans les métadonnées, c'est pourquoi nous ne pouvons pas utiliser l'un des plugins premium officiels de woocommerce pour gérer cela.</p> <p>我最终得到了以下代码:</p> <pre class="brush:php;toolbar:false;"><?php si (!défini('ABSPATH')) { sortie; // Quitte si accès direct } fonction your_shipping_method_init() { if (!class_exists('WC_Your_Shipping_Method')) { la classe WC_Your_Shipping_Method étend WC_Shipping_Method { /*** Constructeur pour votre classe d'expédition * * @accès public * @retour nul*/ fonction publique __construct() { $this->id = 'diet_day_shipping'; // Identifiant de votre mode d'expédition. Devrait être unique. $this->method_title = __('Expédition par jour de régime'); // Titre affiché dans l'administrateur $this->method_description = __('Frais d'expédition par réservation'); // Description affichée dans l'administrateur $this->enabled = "oui" ; // Ceci peut être ajouté en tant que paramètre mais pour cet exemple, son activation est forcée //$this->title = "Réservation facile, expédition par jour" ; // Ceci peut être ajouté en tant que paramètre mais pour cet exemple, c'est forcé. //$this->rates = array('calculate_shipping'); $this->supporte = array( « zones d'expédition », 'paramètres d'instance', 'paramètres d'instance-modal', ); $this->instance_form_fields = tableau( 'titre' => tableau( 'titre' => __('Titre de la méthode'), 'type' => 'texte', 'description' => __('Cela contrôle le titre que l'utilisateur voit lors du paiement.'), 'par défaut' => __('Livraison quotidienne pour votre alimentation'), ), 'coût' => tableau( 'titre' => __('Coût'), 'type' => 'nombre', 'description' => __('Cela contrôle le coût par jour.'), 'par défaut' => 7, ) ); $this->init(); $this->titre = $this->get_option('titre'); $this->cost = $this->get_option('cost'); add_action('woocommerce_update_options_shipping_' . $this->id, array($this, 'process_admin_options')); }/*** Initialisez vos paramètres * * @accès public * @retour nul*/ fonction initialisation() { // Charge l'API des paramètres $this->init_form_fields(); // Enregistrez les paramètres dans l'administrateur si vous en avez défini add_action('woocommerce_update_options_shipping_' . $this->id, array($this, 'process_admin_options')); } fonction init_form_fields() { $this->form_fields = tableau( 'titre' => tableau( 'titre' => __('Titre de la méthode'), 'type' => 'texte', 'description' => __('Cela contrôle le titre que l'utilisateur voit lors du paiement.'), 'par défaut' => __('Frais d'expédition du régime quotidien'), ), 'coût' => tableau( 'titre' => __('Coût'), 'type' => 'nombre', 'description' => __('Cela contrôle le coût par jour.'), 'par défaut' => 7, ) ); } /*** fonction calculate_shipping. * @param array $package (par défaut : array())*/ fonction publique calculate_shipping ($ package = array ()) { //code en dur pour les tests $numéro_d'expédition = 7 ; //probablement un moyen de calculer les frais d'expédition finaux /* foreach ($package['contents'] as $item_id => $values) { $_product = $values['données']; $shipping_number = $shipping_number + $_product->wceb_get_product_booking_duration() * $values['quantity']; }*/ $this->add_rate(array( 'identifiant' => $this->id . $this->instance_id, 'étiquette' => 'Dostawa poza Wa-wa', 'coût' => $numéro_d'expédition, )); } } } } add_action('woocommerce_shipping_init', 'your_shipping_method_init'); fonction add_your_shipping_method($methods) { $methods['diet_day_shipping'] = 'WC_Your_Shipping_Method'; retourner $méthodes ; } add_filter('woocommerce_shipping_methods', 'add_your_shipping_method');</pre> <p>多人游戏天数的价值。</p> <p></p> <p>Quelqu’un peut-il m’aider à corriger mon code ? </p> <p>Il n'y a actuellement aucune option de paramètres affichée dans le panneau d'administration. Pas dans la ligne de méthode de la zone d'expédition, ni dans le panneau des paramètres de livraison. </p> <p>De plus, lorsque j'envoie un code postal depuis une zone en utilisant une méthode d'expédition personnalisée, le panier indique qu'aucune méthode d'expédition n'est disponible pour ce code postal)</p>
P粉558478150P粉558478150389 Il y a quelques jours424

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

  • P粉833546953

    P粉8335469532023-08-30 00:08:08

    J'ai également passé trois heures hier et une heure supplémentaire aujourd'hui à essayer de résoudre un problème très similaire. Je crois avoir maintenant une solution, ou du moins vous aider à vous mettre dans la bonne direction. La documentation officielle de WooCommerce semble faire la différence entre Paramètres et Paramètres d'instance (ou je ne trouve pas de documentation sur les paramètres d'instance - plus dans le paragraphe suivant).

    Ce qui suit est basé sur ce que j'ai découvert jusqu'à présent par essais et erreurs. Si quelqu'un possède une documentation "officielle" à ce sujet, j'attendrais avec impatience ses commentaires sur cette réponse.

    Il est important de faire la distinction entre « paramètres » et « paramètres d'instance ». Voir cette image pour une comparaison visuelle sur le backend WooCommerce :

    Paramètres

    Les paramètres font référence aux « Paramètres globaux du mode d'expédition », c'est-à-dire qu'ils apparaissent dans le sous-menu global, mais pas dans la zone d'expédition. La documentation officielle de WooCommerce montre comment utiliser les paramètres et comment ajouter une nouvelle page de paramètres :

    https://woocommerce.com/document/shipping-method-api/

    https://woocommerce.com/document/settings-api/

    Pour utiliser la fonction/API des paramètres, vous devez spécifier

    $this->supports = array('settings'); // You may also need to include shipping-zones

    Dans votre constructeur.

    Les « Paramètres » sont appliqués/utilisés/stockés globalement, c'est-à-dire indépendamment des régions de livraison individuelles.

    Paramètres de l'instance

    Les paramètres d'instance sont des paramètres qui peuvent être enregistrés individuellement pour chaque zone d'expédition. Pour les utiliser, vous devez utiliser

    $this->supports = array('shipping-zones', 'instance-settings', 'instance-settings-modal');

    Dans votre constructeur.

    L'exemple suivant me permet de comprendre les différences subtiles mais importantes de l'API de configuration d'instance :

    https://gist.github.com/malkafly/57a5e07fd03d6fd5cab84c6182d84c86

    Différences de code et concernant votre question d'origine

    Veuillez noter qu'il existe des différences subtiles dans les fonctionnalités et propriétés exactes de ces deux API. En fonction de votre situation, vous devez décider d'utiliser l'une de ces API, puis utiliser strictement cette API. Vous confondez les deux API, ce qui explique probablement pourquoi vous ne parvenez pas à faire fonctionner votre méthode d'expédition personnalisée.

    Si vous souhaitez utiliser l'API des paramètres (globaux) :

    • $this->supports = array('shipping-zones', 'settings');
    • Utilisez $this->form_fields (au lieu de $this->instance_form_fields)
    • Utilisez $this->settings['title'] pour récupérer les paramètres enregistrés

    Si vous souhaitez utiliser l'API des paramètres d'instance (spécifique à la région de livraison) :

    • Assurez-vous que votre constructeur ressemble à ceci/contient le code suivant :

      public function __construct( $instance_id = 0 ) {
                $this->instance_id = absint( $instance_id );
                //...
          }
    • Utilisez $this->instance_settings['title'] pour récupérer les paramètres enregistrés

    Les liens dans les catégories de paramètres/paramètres d'instance correspondantes que j'ai publiées ci-dessus contiennent de nombreux exemples de code (fonctionnels) supplémentaires pour chaque méthode.

    répondre
    0
  • Annulerrépondre