📍 Tracking de envios — URLs de seguimiento

Actualizado: 2024-12-01

PrestaShop permite configurar una URL de seguimiento en cada transportista. Cuando el comerciante introduce el numero de guia en el pedido, el cliente puede hacer clic en el enlace para ver el estado de su envio en la web del transportista.

#Configurar la URL de tracking

Configurar url_tracking al crear el transportista
php
<?php

private function createCarrier(): bool
{
    $carrier = new Carrier();
    $carrier->name             = 'Mi Transportista';
    $carrier->active           = true;
    $carrier->deleted          = false;
    $carrier->shipping_handling = false;
    $carrier->range_behavior   = 0; // 0 = mayor rango disponible, 1 = deshabilitar
    $carrier->is_module        = true;
    $carrier->id_tax_rules_group = 0; // sin impuestos

    // ── URL de tracking ──
    // '@' es el placeholder que PrestaShop reemplaza con el numero de guia
    $carrier->url = 'https://tracking.mitransportista.com/seguimiento?numero=@';

    // Nombre del transportista en cada idioma
    foreach (Language::getLanguages() as $lang) {
        $carrier->delay[$lang['id_lang']] = '24-48 horas';
    }

    if (!$carrier->add()) {
        return false;
    }

    Configuration::updateValue('MYCARRIER_ID', (int) $carrier->id);
    Configuration::updateValue('MYCARRIER_ID_REFERENCE', (int) $carrier->id);

    $this->assignCarrierGroups($carrier->id);
    $this->assignCarrierZones($carrier->id);

    return true;
}

#Actualizar el numero de seguimiento

Actualizar el numero de guia en un pedido
php
<?php

/**
 * Actualizar el numero de seguimiento de un pedido.
 * Normalmente se llama desde un webhook del transportista.
 */
private function updateTrackingNumber(int $idOrder, string $trackingNumber): bool
{
    $order = new Order($idOrder);
    if (!Validate::isLoadedObject($order)) {
        return false;
    }

    // Obtener el OrderCarrier del pedido
    $orderCarrier = new OrderCarrier((int) OrderCarrier::getIdByOrderId($idOrder));
    if (!Validate::isLoadedObject($orderCarrier)) {
        // Si no existe, crear uno
        $orderCarrier             = new OrderCarrier();
        $orderCarrier->id_order   = $idOrder;
        $orderCarrier->id_carrier = (int) $order->id_carrier;
    }

    $orderCarrier->tracking_number = pSQL($trackingNumber);
    $orderCarrier->save();

    // Cambiar el estado a 'Enviado' si no lo esta
    if ($order->current_state != (int) Configuration::get('PS_OS_SHIPPING')) {
        $history                 = new OrderHistory();
        $history->id_order       = $idOrder;
        $history->id_order_state = (int) Configuration::get('PS_OS_SHIPPING');
        $history->addWithemail(true, ['carrier_name' => 'Mi Transportista', 'tracking_number' => $trackingNumber]);
    }

    return true;
}

#Hook de envio con numero de tracking

Hook para interceptar el cambio de estado a Enviado
php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionObjectOrderCarrierUpdateAfter');
}

/**
 * Se dispara cuando se actualiza un OrderCarrier (p.ej. al introducir el numero de guia).
 */
public function hookActionObjectOrderCarrierUpdateAfter(array $params): void
{
    /** @var OrderCarrier $orderCarrier */
    $orderCarrier = $params['object'];

    // Solo procesar si el transportista es el nuestro
    $ourCarrierId = (int) Configuration::get('MYCARRIER_ID');
    if ((int) $orderCarrier->id_carrier !== $ourCarrierId) {
        return;
    }

    $trackingNumber = $orderCarrier->tracking_number;
    if (empty($trackingNumber)) {
        return;
    }

    // Notificar a la API del transportista
    $this->notifyCarrierApi($orderCarrier->id_order, $trackingNumber);
}

private function notifyCarrierApi(int $idOrder, string $trackingNumber): void
{
    // Enviar datos del pedido al sistema del transportista
    $order   = new Order($idOrder);
    $address = new Address($order->id_address_delivery);

    // ... llamada a la API del transportista
}

#Mostrar el tracking al cliente

Obtener el enlace de tracking de un pedido
php
<?php

// ── Desde PHP ──
$idOrder      = 42;
$order        = new Order($idOrder);
$orderCarrier = new OrderCarrier((int) OrderCarrier::getIdByOrderId($idOrder));
$carrier      = new Carrier((int) $order->id_carrier);

$trackingNumber = $orderCarrier->tracking_number;
$trackingUrl    = '';

if ($trackingNumber && $carrier->url) {
    // PrestaShop reemplaza '@' con el numero de seguimiento
    $trackingUrl = str_replace('@', urlencode($trackingNumber), $carrier->url);
}

// La pagina 'order-detail' del FO ya muestra el enlace de tracking automaticamente
// si el Carrier tiene url_tracking y el OrderCarrier tiene tracking_number.

// ── En Smarty (tema) ──
// {if $carrier.tracking_url}
//   <a href="{$carrier.tracking_url|escape:'html'}" target="_blank">
//     Seguir mi pedido
//   </a>
// {/if}
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.