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:
0
Deixe um comentário