Principal/WordPress Fullstack/Blueprints/WooCommerce/Método de envío personalizado con integración de puntos de recogida y mapas
Volver a tarjetas «WooCommerce»
WooCommerce(ТЗ 40 из 54)
Especificación: Método de envío personalizado con integración de puntos de recogida y mapas
WooCommerce5 шагов • +25 XP

Especificación: Método de envío personalizado con integración de puntos de recogida y mapas

Desarrollo de método de entrega a medida basado en WC_Shipping_Method: cálculo dinámico de portes, conexión con API de taquillas o puntos de recogida, selector con mapa interactivo en Leaflet y almacenamiento en el pedido.

~14 ч работыУровень: MiddleWC_Shipping_MethodWC_Shipping_RateLeaflet / OpenStreetMapCheckout Modal APIHPOS Shipping MetaREST API Courier Integration
+5 XP за шаг
Выполнено 0 из 5 шагов (0%)
Трудозатраты~14 рабочих часов
Фриланс вилка~$630 – $1,050 (€560 – €980)
Оценка веб-студии~$1,330 – $2,240 (€1260 – €2100)

ТЗ заказчика (исходный бриф):

Queremos ofrecer un método de entrega en taquilla o punto de recogida. El cliente debe poder abrir un mapa interactivo en el checkout, buscar por código postal, elegir el punto y ver guardada la dirección en el pedido.
Ключевые требования:
  • •Clase de método de envío personalizada extendiendo WC_Shipping_Method registrada en woocommerce_shipping_methods
  • •Cálculo dinámico de tarifa según el peso del carrito y la zona de entrega
  • •Ventana modal con mapa interactivo en Leaflet para seleccionar la taquilla más cercana
  • •Validación obligatoria garantizando que se haya elegido un punto antes de confirmar la compra
  • •Registro del código y dirección del punto de recogida en los metadatos del pedido
Ограничения проекта:
  • •Sin plugins comerciales de suscripción periódica
  • •Uso de mapas abiertos OpenStreetMap / Leaflet sin costes de API de Google Maps
  • •Compatible con checkout clásico y por bloques
Критерии приёмки (KPI):
  • Carga del mapa interactivo en < 300ms
  • 100% de los pedidos con este método registran un identificador de punto válido
  • Cero errores de cálculo de tarifas durante el proceso de compra

Конфигурация блупринта под условия проекта

Выберите архитектуру и стек — шаги роадмапа, структура файлов и примеры кода переключатся автоматически:

Пошаговое практическое руководство по ТЗ

Подробный разбор архитектуры, код реализации и советы эксперта по каждому этапу:

1
Этап 1 из 5

Paso 1: Creación de la clase de envío extendiendo WC_Shipping_Method

~50 минСредний

Практическое руководство:

Defina la clase WC_Shipping_Custom_Pickup con identificador, título y compatibilidades. Conéctese a 'woocommerce_shipping_init' y regístrela en 'woocommerce_shipping_methods'.

План и контрольные точки реализации:
1Унаследовать класс от WC_Shipping_Method
2Определить поля init_form_fields() для настройки тарифов
3Реализовать метод calculate_shipping с динамическим расчетом стоимости
Важные технические нюансы и подводные камни:

Implemente init_form_fields() para configurar el coste base y el umbral de envío gratuito desde la administración.

Совет эксперта (Best Practice):

Округление веса в большую сторону: Большинство курьерских служб тарифицируют вес с округлением вверх до целого килограмма (ceil($total_weight)). Учитывайте это при калькуляции. (Важно: Если у товара не указан вес в админке, $product->get_weight() вернет пустую строку — обязательно приводите к (float).)

Ожидаемый артефакт этапа:

Полноценный метод доставки в зонах доставки WooCommerce.

PHP
<?php
declare(strict_types=1);

if (!defined('ABSPATH')) exit;

class WC_Shipping_Pvz extends \WC_Shipping_Method {
    public function __construct(int $instance_id = 0) {
        $this->id                 = 'pvz_shipping';
        $this->instance_id        = $instance_id;
        $this->method_title       = __('Доставка в ПВЗ (Самовывоз)', 'agenticlab');
        $this->method_description = __('Доставка до пункта выдачи с динамическим расчетом по весу и картой.', 'agenticlab');
        $this->supports           = ['shipping-zones', 'instance-settings'];

        $this->init();
    }

    public function init(): void {
        $this->init_form_fields();
        $this->init_settings();

        $this->title = $this->get_option('title', 'Самовывоз из ПВЗ');
        $this->enabled = $this->get_option('enabled', 'yes');

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

    public function init_form_fields(): void {
        $this->form_fields = [
            'enabled' => [
                'title'   => __('Включить', 'agenticlab'),
                'type'    => 'checkbox',
                'default' => 'yes',
            ],
            'title' => [
                'title'   => __('Название на чекауте', 'agenticlab'),
                'type'    => 'text',
                'default' => __('Пункт выдачи заказов (ПВЗ)', 'agenticlab'),
            ],
            'base_cost' => [
                'title'   => __('Базовая стоимость ($)', 'agenticlab'),
                'type'    => 'price',
                'default' => '250',
            ],
            'cost_per_kg' => [
                'title'   => __('Доплата за каждый 1 кг ($)', 'agenticlab'),
                'type'    => 'price',
                'default' => '50',
            ],
        ];
    }

    public function calculate_shipping($package = []): void {
        $base_cost = (float) $this->get_option('base_cost', 250);
        $cost_per_kg = (float) $this->get_option('cost_per_kg', 50);

        $total_weight = 0.0;
        foreach ($package['contents'] as $item) {
            /** @var \WC_Product $product */
            $product = $item['data'];
            $weight = (float) $product->get_weight();
            $total_weight += ($weight * (int) $item['quantity']);
        }

        $final_cost = $base_cost + ($total_weight * $cost_per_kg);

        $this->add_rate([
            'id'        => $this->get_rate_id(),
            'label'     => $this->title,
            'cost'      => $final_cost,
            'package'   => $package,
        ]);
    }
}

add_filter('woocommerce_shipping_methods', function ($methods) {
    $methods['pvz_shipping'] = 'WC_Shipping_Pvz';
    return $methods;
});
2
Этап 2 из 5

Paso 2: Cálculo dinámico de tarifa según características del pedido

~60 минСложный
3
Этап 3 из 5

Paso 3: Integración de mapa Leaflet y API de puntos de recogida

~35 минСредний
4
Этап 4 из 5

Paso 4: Validación en el checkout y campos ocultos

~40 минСредний
5
Этап 5 из 5

Paso 5: Registro de metadatos y visualización en pedidos y correos

~30 минЛегкий

Типичные грабли на этом ТЗ

2 антипаттерна

Инструменты экосистемы Fullstack AI Lab для этого ТЗ

Интеграция