6 de janeiro de 2022 - Frederico Marinho

Como deletar produtos em massa no Prestashop 1.7

Desde que comecei a trabalhar com Prestashop aqui na Divera, sinto falta de recursos de execução em massa como atualizar preços, descontos, etc. Para a maioria das funcionalidades já existem módulos muito bons que resolvem os pepinos. Para quem não conhece, um dos que usamos é o Bulk Mass editing product, que é pago porém é bastante completo.

Para quem prefere um módulo gratuito, tem o Mass Update prices da MyPresta que funciona bem, porém é limitado, porque serve apenas para atualização de preços.

Porém, quando temos um e-commerce com uma base de dados muito grande, acima de 20mil produtos por exemplo, essas ações em massa são praticamente essenciais e muitas delas não são padrões. E o problema que vamos resolver aqui é justamente uma que não é óbvia, até porque apagar produtos não é algo que deveria estar ao alcance de todos. É quase a mesma coisa que deixar produtos químicos ao alcance de crianças, hehe.

Precisava de uma solução rápida, por isso não montei um plugin, mas também não sei se é uma boa ideia ter um plugin com essa funcionalidade, já que deveria ser usada somente por programadores. Minha opinião, ok? Mas se alguém quiser desenvolver esse módulo, fiquem a vontade (e me enviem uma cópia depois rsrs). Vamos lá…

Observação: apesar de ter sido executado em Prestashop na versão 1.7, o script abaixo foi tirado de um post de 2017 que foi feito para a versão 1.6, ou seja, provavelmente funciona na versão antiga também.

Exporte um arquivo CSV com códigos dos produtos

No meu caso especificamente, o cliente tem uma integração com o sistema ERP dele, que faz a exclusão de produtos na loja virtual no momento em que é feito no sistema local de gestão de estoque deles. Porém, a necessidade era de muitos produtos que foram removidos de uma vez. Se fosse fazer pelo método tradicional, demoraria alguns dias.

A solução então foi fazer um dump no banco de dados do ERP deles, com os códigos de todos os produtos a serem excluídos, no formato CSV, com uma única coluna. Daí é só mesmo ler código a código e excluir do banco de dados do prestashop.

Script de exclusão de produtos

Com o arquivo CSV em mãos com os códigos dos produtos, basta ter um script PHP que leia cada um dos códigos, busque o produto e delete. Um detalhe aqui é que o processo de exclusão de produtos no Prestashop deve simular a exclusão do produto dentro da área administrativa da loja virtual, para evitar inconsistências no banco de dados.

Vamos ao código:

<?php
header("refresh: 3;");
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.inc.php');
include(dirname(__FILE__) . '/init.php');
$csv_file = 'products_by_reference.csv';
$row = 1;

if (($handle = fopen($csv_file, "r")) !== FALSE) {
    echo "<p>(".date('Y/m/d H:i:s').") Starting to delete products...</p>";
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $row++;
        $sql_query = 'SELECT `id_product` FROM `'._DB_PREFIX_.'product` where reference = '.$data[0];
        $res = Db::getInstance()->executeS($sql_query);

        if ($res) {
            echo "<p>(".date('Y/m/d H:i:s').") Deleting product with ID <b>".$res[0]['id_product']."</b>...";
            $p = new Product($res[0]['id_product']);
            if(!$p->delete()) {
                echo " <span style='color: red'>Error deleting this product!</span></p>";
            } else {
                echo " <span style='color: green'>DELETED</span></p>";
            }
        } else {
            echo " <span style='color: red'>Product ".$res[0]['id_product']." was not found!</span></p>";
        }
    }
    fclose($handle);
}
?>
  • Salve esse código num arquivo chamado mass_delete_products.php na raiz da loja Prestashop.

Explicando o código

require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.inc.php');
include(dirname(__FILE__) . '/init.php');
  • Esses dois includes são necessários para podermos usar métodos do próprio Prestashop e simularmos uma exclusão de dentro do admin da loja virtual.
$csv_file = 'products_by_reference.csv';
  • Salvei o arquivo CSV com esse nome aí, também na raiz do site, na mesma pasta do script php.
if (($handle = fopen($csv_file, "r")) !== FALSE) {
  • Tenta abrir o arquivo CSV e verifica se foi possível abrir.
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
  • Faz a leitura linha a linha do arquivo e joga o código do produto na variável $data que estará disponível dentro do loop.
$sql_query = 'SELECT `id_product` FROM `'._DB_PREFIX_.'product` where reference = '.$data[0];
$res = Db::getInstance()->executeS($sql_query);
  • Cria um comando SQL baseado no código do produto e executa, retornando o resultado da query na variável $res.

Observação: no meu arquivo CSV usamos o código de referência para identificar os produtos, por isso a query busca o produto pelo campo reference. Se no seu caso for o próprio ID, troque o campo na consulta.

$p = new Product($res[0]['id_product']);
  • Busca o produto usando a classe Product do próprio Prestashop. Essa e a próxima linha é que fazem o truque de simular a exclusão do produto como se fosse feito direto no admin da loja.

O código do produto buscado do arquivo CSV está na posição 0 (zero) do resultado da consulta que está em $res ($res[0]). Isso considerando que o código esteja na primeira coluna do arquivo CSV. Se estiver na segunda coluna, busque o código com $res[1], se estiver na terceira coluna busque com $res[2] e assim por diante.

if(!$p->delete()) {
       echo " <span style='color: red'>Error deleting this product!</span></p>";
} else {
       echo " <span style='color: green'>DELETED</span></p>";
}
  • Deleta o produto e verifica se foi removido com sucesso para exibir uma mensagem personalizada.
header("refresh: 3;");

Faltou falar dessa linha né. Se o arquivo com códigos de produtos for muito grande, a execução do script pode parar repentinamente. Essa linha refresh faria um recarregamento automático da página, o que faria o script rodar infinitamente, até ser finalizado manualmente.

Execução do script de remoção de produtos em massa

Salvo o script e arquivo CSV, ambos na raiz do site, agora é só executá-lo através do navegador, logo depois do endereço da loja.

Ex.:

http://www.lojavirtual.com.br/mass_delete_products.php

O resultado vai ser algo assim:

Tem alguma observação ou uma solução melhor? Deixa nos comentários pra gente!


Referência:

https://www.prestashop.com/forums/topic/609319-solved-delete-massive-products-from-database-10420-products/

0

Prestashop

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *