🏗️ Ejemplos CRUD — GET, POST, PUT, DELETE

Actualizado: 2024-12-01

La API REST de PrestaShop usa el metodo HTTP para determinar la operacion: GET para leer, POST para crear, PUT para actualizar y DELETE para eliminar.

#GET — leer recursos

GET — leer uno o varios recursos
php
<?php

function psApiGet(string $apiKey, string $shopUrl, string $endpoint, array $params = []): array
{
    $params['output_format'] = 'JSON';
    $url = rtrim($shopUrl, '/') . '/api/' . $endpoint . '?' . http_build_query($params);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_USERPWD       => $apiKey . ':',
    ]);
    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true) ?? [];
}

// ── Obtener un producto por ID ──
$data = psApiGet($key, $url, 'products/42');
$product = $data['product'];
echo $product['reference'];

// ── Obtener lista de productos ──
$data = psApiGet($key, $url, 'products', [
    'display'       => '[id,reference,price]',
    'filter[active]'=> 1,
    'limit'         => 20,
]);
$products = $data['products'];

// ── Obtener stock de un producto ──
$data = psApiGet($key, $url, 'stock_availables', [
    'filter[id_product]' => 42,
    'display'            => 'full',
]);
$stock = $data['stock_availables'][0]['quantity'] ?? 0;

#POST — crear recursos

POST — crear un nuevo producto
php
<?php

function psApiPost(string $apiKey, string $shopUrl, string $resource, string $xmlBody): array
{
    $url = rtrim($shopUrl, '/') . '/api/' . $resource . '?output_format=JSON';

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $xmlBody,
        CURLOPT_HTTPHEADER     => ['Content-Type: application/xml'],
        CURLOPT_USERPWD       => $apiKey . ':',
    ]);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true) ?? [];
}

// ── XML para crear un producto ──
// Nota: La API PS usa XML para POST/PUT, incluso con output_format=JSON
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
  <product>
    <price>29.99</price>
    <reference>MY-REF-001</reference>
    <active>1</active>
    <id_category_default>2</id_category_default>
    <id_tax_rules_group>1</id_tax_rules_group>
    <name>
      <language id="1">Mi Nuevo Producto</language>
      <language id="2">My New Product</language>
    </name>
    <description>
      <language id="1"><![CDATA[<p>Descripcion del producto</p>]]></language>
    </description>
    <description_short>
      <language id="1"><![CDATA[Descripcion corta]]></language>
    </description_short>
  </product>
</prestashop>';

$response = psApiPost($key, $url, 'products', $xml);
$newProductId = $response['product']['id'] ?? null;
echo 'Producto creado con ID: ' . $newProductId;

#PUT — actualizar recursos

PUT — actualizar stock y estado de pedido
php
<?php

function psApiPut(string $apiKey, string $shopUrl, string $endpoint, string $xmlBody): array
{
    $url = rtrim($shopUrl, '/') . '/api/' . $endpoint . '?output_format=JSON';

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST  => 'PUT',
        CURLOPT_POSTFIELDS     => $xmlBody,
        CURLOPT_HTTPHEADER     => ['Content-Type: application/xml'],
        CURLOPT_USERPWD       => $apiKey . ':',
    ]);
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true) ?? [];
}

// ── Actualizar stock de un producto ──
// Primero obtener el id_stock_available
$data = psApiGet($key, $url, 'stock_availables', ['filter[id_product]' => 42, 'display' => 'full']);
$idStock = $data['stock_availables'][0]['id'];

$stockXml = '<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
  <stock_available>
    <id>' . $idStock . '</id>
    <id_product>42</id_product>
    <id_product_attribute>0</id_product_attribute>
    <quantity>100</quantity>
  </stock_available>
</prestashop>';

psApiPut($key, $url, 'stock_availables/' . $idStock, $stockXml);

// ── Cambiar estado de un pedido ──
$orderHistoryXml = '<?xml version="1.0" encoding="UTF-8"?>
<prestashop>
  <order_history>
    <id_order>123</id_order>
    <id_order_state>5</id_order_state>
  </order_history>
</prestashop>';

psApiPost($key, $url, 'order_histories', $orderHistoryXml);

#DELETE — eliminar recursos

DELETE — eliminar un recurso
php
<?php

function psApiDelete(string $apiKey, string $shopUrl, string $endpoint): bool
{
    $url = rtrim($shopUrl, '/') . '/api/' . $endpoint;

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST  => 'DELETE',
        CURLOPT_USERPWD       => $apiKey . ':',
    ]);
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $httpCode === 200;
}

// ── Eliminar un producto ──
$success = psApiDelete($key, $url, 'products/42');

// ── Eliminar multiples recursos ──
$idsToDelete = [100, 101, 102];
foreach ($idsToDelete as $id) {
    psApiDelete($key, $url, 'products/' . $id);
    usleep(100000); // 100ms entre peticiones para no saturar el servidor
}

#Operaciones comunes completas

OperacionMetodoEndpointNotas
Crear productoPOSTproductsRequiere XML con todos los campos requeridos
Actualizar precioPUTproducts/{id}Enviar todo el objeto, no solo el campo modificado
Actualizar stockPUTstock_availables/{id}Obtener id_stock_available primero con GET
Cambiar estado pedidoPOSTorder_historiesCrear un nuevo historial de estado
Actualizar trackingPUTorder_carriers/{id}Obtener id_order_carrier con GET
Crear clientePOSTcustomersEl password se hashea automaticamente
Aplicar cuponPOSTcart_rulesCrear la regla de descuento
Subir imagenPOSTimages/products/{id}Requiere multipart/form-data
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.