web-dev-qa-db-fra.com

La méthode d'expédition personnalisée ne s'affiche pas à la caisse

Je fais une méthode d'expédition personnalisée pour woocommerce - et mon problème est que je peux l'ajouter à une zone spécifique dans la zone d'administration et ajuster les paramètres sans problème. Mais pour une raison quelconque, il n'apparaît pas sur la page de paiement - et je ne sais pas pourquoi.

il devrait être très simple, et je l’ai déjà fait quelques fois auparavant (avant la version 3.0) - mais je ne peux tout simplement pas le faire fonctionner maintenant.

Classe principale

abstract class Main_Shipping extends WC_Shipping_Method
{
abstract protected function register_shipping($methods);
abstract protected function addActions();
abstract protected function addFilters();

function init() 
{
    $this->instance_form_fields                     = include('setting/shipping-settings.php' );
    $this->title                                    = $this->get_option('title' );
    $this->tax_status                               = $this->get_option('tax_status');
    $this->shipping_price                           = $this->get_option('shipping_price');
    $this->enable_free_shipping                     = $this->get_option('enable_free_shipping');
    $this->free_shipping_total                      = $this->get_option('free_shipping_total');

    $this->init_settings(); 

    add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
}

public function calculate_shipping($package = array())
{
    global $woocommerce;
    $return_price = $this->shipping_price;
    if(!isset($return_price))
    {
       $return_price = 0;
    }
    $rate = array(
        'id'      => $this->id .'_'. $this->instance_id,
        'label'   => $this->title,
        'cost'    => $return_price,
       );
    $this->add_rate( $rate );
}

public function oaship_pickuppoint()
{ 
    ob_start();
    ?>
        <div>
            test
        </div>

    <?php
    $sContent = ob_get_clean();
    echo $sContent;
}
}

Classe de transporteur GLS spécifique:

 require_once('main-shipping.php');
 class GLS_Shipping_Pickuppoint extends Main_Shipping
{
public function __construct( $instance_id = 0 ) 
{
    $this->id                    = 'gls_shipping_pickuppoint';
    $this->instance_id           = absint( $instance_id );
    $this->method_title          = __('GLS Pickup Point OA', '');
    $this->method_description    = __('Adds the option to ship with the GLS pickup point to the checkout', '');
    $this->supports              = array(
        'shipping-zones',
        'instance-settings',
    );
    $this->init(); 
}

function addActions()
{     
    add_action('woocommerce_after_shipping_rate', array($this, 'check_choosen_shipping_method') );
}

function addFilters()
{
    add_filter('woocommerce_shipping_methods', array($this, 'register_shipping_method'));
}

function register_shipping($methods) 
{

    $methods['gls_shipping_pickuppoint'] = 'GLS_Shipping_Pickuppoint';

    return $methods;
}

function check_choosen_shipping_method($rate)
{

    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = preg_replace('/[0-9]+/', '', $chosen_methods[0]);;
    if($chosen_shipping === 'gls_shipping_pickuppoint')
    {
        if ($rate->method_id == 'gls_shipping_pickuppoint') {
            $this->oaship_pickuppoint();
        }
    }
}
}

$oOAGlsPickupPoint = new GLS_Shipping_Pickuppoint();
$oOAGlsPickupPoint->addActions();
 $oOAGlsPickupPoint->addFilters();
2
Mac

Je développe la même fonctionnalité en ce moment et il m'est arrivé quelque chose comme ça (j'ai pu voir les paramètres dans le tableau de bord de l'administrateur mais pas dans la page de paiement) ...

Ce que j'ai fait était de vérifier l'option Activer le mode débogage dans WooCommerce/Settings/Shipping/Shipping options et ensuite, j'ai pu voir ma livraison personnalisée dans la page de paiement. Après cela, je désactive à nouveau cette option et mon envoi est toujours visible dans la page de paiement (je ne connais pas la raison mais cela fonctionne)

Je vérifiais votre code et remarquais qu'il vous manquait une action importante pour ajouter une expédition personnalisée:

add_action( 'woocommerce_shipping_init', 'tutsplus_shipping_method' );

tutsplus_shipping_method est une fonction qui définit la classe qui étend le WC_Shipping_Method.

L'action woocommerce_shipping_init est l'action principale de WooCommerce Shippings, qui inclut toutes les classes d'expédition avant leur instanciation. En utilisant cette action, nous sommes sûrs que notre méthode d’expédition sera incluse après l’initialisation de WooCommerce et qu’elle est au bon endroit pour que WooCommerce puisse l’utiliser.

J'ai également remarqué que votre filtre add_filter('woocommerce_shipping_methods', array($this, 'register_shipping_method')); pointe vers une fonction qui n'existe pas. C'est peut-être une erreur de type et vous vouliez pointer vers votre fonction register_shipping.

J'ai suivi ce tutoriel et tout était super: https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098