私はwoocommerceのためのカスタム配送方法を作っています - そして私の問題はそれを管理エリアの特定のゾーンに追加して設定をうまく調整できることです。しかし、何らかの理由でそれがチェックアウトページに表示されません - そして私はその理由がわかりません。
それは非常に率直であるべきです、そして私は実際にこれまでに数回(3.0より前の)これをしました - しかし私はそれを今はたらくことができません。
メインクラス
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;
}
}
特定GLSキャリアクラス:
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();
私は今同じ機能を開発しています、そして私にはこのようなことが起こります(私は管理ダッシュボードで設定を見ることができましたがチェックアウトページではできませんでした)...
WooCommerce/Settings/Shipping/Shipping options
で デバッグモードを有効にする をチェックすると、チェックアウトページで私のカスタム配送を見ることができました。その後、私は再びオプションを無効にします、そして、私の輸送料はまだチェックアウト・ページに見えます(私は理由を知りません、しかし、それは働きます)
私はあなたのコードをチェックしていて、あなたが注文した配送を追加するための重要な行動を逃していることに気づいていました:
add_action( 'woocommerce_shipping_init', 'tutsplus_shipping_method' );
tutsplus_shipping_method
はWC_Shipping_Methodを拡張するクラスを定義する関数です。
アクションwoocommerce_shipping_init
はWooCommerce Shippingsの主なアクションで、インスタンス化される前にすべての配送クラスが含まれます。このアクションを使用することで、WooCommerceが初期化された後で、WooCommerceがそれを使用するのに適切な場所に、配送方法が含まれるようになります。
私はまたあなたのフィルタadd_filter('woocommerce_shipping_methods', array($this, 'register_shipping_method'));
が存在しない関数を指していることに気づきます、多分それはタイプエラーであり、あなたはあなたのregister_shipping
関数を指し示したいと思いました。
私はこのチュートリアルに従った、そしてすべてが素晴らしかった: https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098