Задать вопрос
@Dev403

Как добавить свою доставку в woocomerce?

Какая то банальная проблема. Нужно добавить свой способ доставки, в целом есть доки и всё должно быть просто.
Ссылка на доку

Но суть в чем
Код

<?php
/*
Plugin Name: PЭК Shipping Module
Description: Модуль доставки ПЭК для WooCommerce.
Version: 1.0
Author: 
*/

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Выход, если доступ напрямую
}

function pecom_shipping_method_init() {
    if ( ! class_exists( 'WC_Pecom_Shipping_Method' ) ) {
        class WC_Pecom_Shipping_Method extends WC_Shipping_Method {

            public function __construct() {
                $this->id                 = 'pecom_shipping';
                $this->method_title       = __( 'Доставка ПЭК', 'woocommerce' );
                $this->method_description = __( 'Модуль доставки ПЭК для WooCommerce.', 'woocommerce' );
                $this->enabled            = "yes";
                $this->title              = "Доставка ПЭК";
                $this->init();
            }

            /**
             * Инициализация настроек
             */
            function init() {
                // Загрузка настроек
                $this->init_form_fields();
                $this->init_settings();

                // Сохранение настроек
                add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
            }

            /**
             * Определение полей настроек
             */
            function init_form_fields() {
                $this->form_fields = array(
                    'enabled' => array(
                        'title'       => __( 'Включить/Отключить', 'woocommerce' ),
                        'type'        => 'checkbox',
                        'description' => __( 'Включить модуль доставки ПЭК.', 'woocommerce' ),
                        'default'     => 'yes'
                    ),
                    'title' => array(
                        'title'       => __( 'Заголовок', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'Заголовок метода доставки, который виден покупателям.', 'woocommerce' ),
                        'default'     => __( 'Доставка ПЭК', 'woocommerce' ),
                        'desc_tip'    => true,
                    ),
                    'api_key' => array(
                        'title'       => __( 'API Key', 'woocommerce' ),
                        'type'        => 'text',
                        'description' => __( 'Ваш API ключ от ПЭК.', 'woocommerce' ),
                        'default'     => '',
                        'desc_tip'    => true,
                    ),
                );
            }

            /**
             * Расчет стоимости доставки
             */
            public function calculate_shipping( $package = array() ) {
                // Получение необходимых данных для API
                $api_key = $this->get_option( 'api_key' );

                // Пример данных заказа
                $origin = array(
                    'city'    => 'Москва', // Ваш город отправления
                    'postcode'=> '123456', // Индекс отправления
                );

                $destination = array(
                    'city'    => $package['destination']['city'],
                    'postcode'=> $package['destination']['postcode'],
                );

                $weight = 0;
                foreach ( $package['contents'] as $item_id => $values ) {
                    $_product = $values['data'];
                    $weight += $_product->get_weight() * $values['quantity'];
                }
                $weight = wc_get_weight( $weight, 'kg' );

                // Вызов API ПЭК для получения стоимости доставки
                $shipping_cost = $this->get_pecom_shipping_cost( $api_key, $origin, $destination, $weight );

                if ( $shipping_cost !== false ) {
                    $rate = array(
                        'id'    => $this->id,
                        'label' => $this->title,
                        'cost'  => $shipping_cost,
                        'calc_tax' => 'per_item'
                    );

                    // Регистрация тарифа
                    $this->add_rate( $rate );
                }
            }

            /**
             * Вызов API ПЭК для получения стоимости доставки
             */
            private function get_pecom_shipping_cost( $api_key, $origin, $destination, $weight ) {
                $api_url = 'https://api.pecom.ru/v1/calculate'; // Замените на актуальный URL API ПЭК

                $args = array(
                    'headers' => array(
                        'Authorization' => 'Bearer ' . $api_key,
                        'Content-Type'  => 'application/json',
                    ),
                    'body' => json_encode( array(
                        'origin'      => $origin,
                        'destination' => $destination,
                        'weight'      => $weight,
                    ) ),
                );

                $response = wp_remote_post( $api_url, $args );

                if ( is_wp_error( $response ) ) {
                    return false;
                }

                $body = wp_remote_retrieve_body( $response );
                $data = json_decode( $body, true );

                if ( isset( $data['cost'] ) ) {
                    return $data['cost'];
                }

                return false;
            }
        }
    }
}

// Подключение класса доставки после инициализации WooCommerce
add_action( 'woocommerce_shipping_init', 'pecom_shipping_method_init' );

function add_pecom_shipping_method( $methods ) {
    $methods['pecom_shipping'] = 'WC_Pecom_Shipping_Method';
    return $methods;
}

// Регистрация метода доставки в WooCommerce
add_filter( 'woocommerce_shipping_methods', 'add_pecom_shipping_method' );



Добавил таким образом, появились настройки способа доставки вкладкой отдельной.
676bb912a0c0b614272231.png

Но теперь добавить способ доставки в Методы доставки, но он не появляется.
676bb9509a6cc619242960.png

В итоге не пойму как его сюда добавить, чтоб корректно добавлялся.

Если в __construct добавляю

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


То появляется в выборе
676bba8f43e88207156752.png

Но потом не возможно удалить из списка доставок, удаляю, перезагружаю страницу, способ появляется.
Если нажимаю изменить, то перекидывает сюда
/wp-admin/admin.php?page=wc-settings&tab=shipping&instance_id=0

676bbac5adcfc831216060.png

Не пойму где ошибся, уже прошел код на несколько раз
676bbb9ba6699902135915.png
Не пойму почему доставка стала с id = 0
  • Вопрос задан
  • 27 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы