📍 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.