Importador de produtos por planilha

  • PHP
  • WooCommerce
  • v1.0.0
Voltar

Resumo

Cria um importador de produtos (veículos) para uma loja de concessionária de veículos, com filtros de km, cor e etc.

Como usar

Insira o código abaixo no seu plugin de códigos PHP ou baixe o plugin, caso prefira.

O plugin recomendado caso queira usar o código como snippet é o Code Snippets (Code Snippets Pro).

Descrição

Ver descrição

📌 Resumo do importador

Este código implementa um importador personalizado de produtos WooCommerce via CSV, focado em produtos simples, com suporte a criação e atualização automática, integração com ACF, associação dinâmica de taxonomias e uma interface amigável no painel administrativo.

Ele foi desenvolvido para substituir importações manuais, garantindo padronização, segurança e controle no processo de cadastro e atualização de produtos.


✅ O que o importador faz

  • 📦 Importa produtos simples via CSV

  • 🔄 Cria ou atualiza produtos automaticamente

    • Identificação por ID ou SKU

  • 🧩 Integração com Advanced Custom Fields (ACF)

  • 🏷️ Suporte a taxonomias dinâmicas

  • 🛡️ Validações de segurança e consistência

  • 🧑‍💻 Interface dedicada no admin do WordPress


🛠️ Requisitos técnicos

🔹 Plugins obrigatórios

  • WooCommerce (ativo)

  • Advanced Custom Fields – ACF (ativo)

🔹 Permissões

  • Usuário com capacidade manage_woocommerce

🔹 Tipos de produto

  • Apenas produtos simples (WC_Product_Simple)


🏷️ Taxonomias (WooCommerce + ACF)

📌 Criação das taxonomias

  • As taxonomias devem existir previamente

  • O importador:

    • verifica se a taxonomia existe

    • cria termos automaticamente, se necessário

  • Não cria novas taxonomias

📌 Taxonomias compatíveis

  • product_cat

  • product_tag

  • marca

  • modelo

  • ano

  • Qualquer taxonomia registrada no WordPress

📌 Uso no CSV

Padrão de coluna:

tax:slug_da_taxonomia

Exemplo de cabeçalho:

tax:product_cat | tax:marca | tax:modelo

Exemplo de valores:

SUV|Sedan
Toyota|Honda
Corolla

📌 Regras

  • Separadores aceitos: | ou ,

  • Termos inexistentes são criados automaticamente

  • O produto é vinculado aos termos informados


📄 Campos obrigatórios no CSV

Coluna Descrição
post_title Nome do produto
post_content Descrição completa
post_excerpt Descrição curta
sku Identificador único do produto
regular_price Preço regular
sale_price Preço promocional (opcional)
post_status Status (publish, draft, etc.)

🔗 Integração com ACF (campo KM)

🔹 Campo ACF utilizado

  • Nome: KM

  • Tipo: Number

  • Field Key obrigatório:

field_6944b5a7bba72

🔹 Coluna no CSV

meta:km

🔹 Regras

  • Valor convertido para número inteiro

  • Pontos e vírgulas são removidos automaticamente

  • O campo ACF deve existir previamente

  • O Field Key deve ser o mesmo em todas as linhas


🔁 Lógica de funcionamento

🧠 Identificação do produto

Ordem de prioridade:

  1. ID válido → atualiza produto

  2. SKU existente → ignora (evita duplicidade)

  3. SKU inexistente → cria novo produto

💰 Lógica de preços

  • Aplica sale_price apenas se:

    • for menor que regular_price

  • Caso contrário:

    • remove preço promocional

    • mantém apenas o preço regular


🧑‍💻 Interface administrativa

O importador adiciona um novo menu em:

WooCommerce → Importador CSV

Funcionalidades da interface

  • Upload de arquivo CSV

  • Proteção com nonce

  • Instruções claras para preenchimento

  • Feedback visual com:

    • produtos criados

    • produtos atualizados

    • avisos de inconsistência


⚠️ Validações e mensagens

Durante a importação, o sistema:

  • Ignora linhas inválidas

  • Evita duplicação de SKU

  • Exibe avisos sem interromper o processo

  • Mostra um resumo final da importação


🎯 Casos de uso recomendados

Ideal para:

  • Lojas de veículos

  • Catálogos grandes

  • Migração de sistemas externos

  • Atualizações frequentes de produtos

  • Importações padronizadas com ACF


📝 Observações finais

  • Não depende do importador nativo do WooCommerce

  • Código extensível para:

    • novos campos ACF

    • novas taxonomias

    • validações adicionais

  • Recomenda-se sempre testar em ambiente de homologação

Plugin

Você pode baixar o plugin e usa-lo em qualquer tema.

Download do plugin
/**
 * Importador CSV WooCommerce
 * - Produtos simples
 * - ACF (KM)
 * - Taxonomias dinâmicas (tax:*)
 * - Interface amigável no admin
 */

/* =====================================================
 * MENU NO ADMIN
 * ===================================================== */
add_action('admin_menu', function () {
	add_menu_page(
		'Importar Produtos CSV',
		'Importador CSV',
		'manage_woocommerce',
		'importador-csv-woo',
		'render_importador_csv_woo',
		'dashicons-upload',
		56
	);
});

/* =====================================================
 * LISTA CATEGORIAS DE PRODUTO (product_cat)
 * ===================================================== */
function listar_categorias_produto_para_importacao() {
	if (!taxonomy_exists('product_cat')) {
		return '';
	}

	// ID da categoria "Sem categoria"
	$uncategorized_id = get_option('default_product_cat');

	$terms = get_terms([
		'taxonomy'   => 'product_cat',
		'hide_empty' => false,
		'exclude'    => [$uncategorized_id],
	]);

	if (is_wp_error($terms) || empty($terms)) {
		return '';
	}

	$nomes = wp_list_pluck($terms, 'name');

	return implode('|', $nomes);
}

/* =====================================================
 * TELA DO IMPORTADOR
 * ===================================================== */
function render_importador_csv_woo() {
	if (!current_user_can('manage_woocommerce')) {
		return;
	}

	$categorias_produto = listar_categorias_produto_para_importacao();
	?>
	<div class="wrap">
		<h1>Importar Produtos via Planilha (CSV)</h1>

		<!-- INSTRUÇÕES (NÃO É NOTICE DO WP) -->
		<div
			id="importador-csv-instrucoes"
			style="
				background:#f6f7f7;
				border:1px solid #c3c4c7;
				border-left:4px solid #2271b1;
				padding:15px;
				margin-bottom:20px;
				border-radius:4px;
			"
		>
			<strong>Instruções para preenchimento da planilha:</strong>
			<ul style="list-style: disc; padding-left:20px;">
				<li><strong>post_title</strong>: Nome do produto</li>
				<li><strong>post_content</strong>: Descrição completa</li>
				<li><strong>post_excerpt</strong>: Descrição curta</li>
				<li><strong>sku</strong>: Código único de identificação do veículo</li>
				<li><strong>regular_price</strong>: Preço do veículo</li>
				<li><strong>sale_price</strong>: Preço promocional (se não tiver, deixar em branco)</li>
				<li><strong>meta:_km</strong>: sempre <code>field_6944b5a7bba72</code> (duplicar para todas as linhas)</li>
				<li>O restante das colunas deve ser duplicado conforme o modelo da planilha</li>
			</ul>

			<?php if (!empty($categorias_produto)) : ?>
				<p>
					<strong>
						Categorias cadastradas (use <code>|</code> na coluna <code>tax:product_cat</code>):
					</strong>
					<textarea readonly style="width:100%;min-height:90px;"><?php echo esc_textarea($categorias_produto); ?></textarea>
				</p>
			<?php endif; ?>
		</div>

		<div
			style="
				background:#fff;
				border:1px solid #ccd0d4;
				border-radius:6px;
				padding:20px;
				margin-top:20px;
				max-width:700px;
				box-shadow:0 2px 6px rgba(0,0,0,0.05);
			"
		>
			<h2 style="margin-top:0;">📦 Importar arquivo CSV</h2>

			<form method="post" enctype="multipart/form-data">
				<?php wp_nonce_field('importar_csv_woo', 'importador_nonce'); ?>

				<div style="margin-bottom:15px;">
					<label style="font-weight:600; display:block; margin-bottom:6px;">
						Selecione o arquivo CSV
					</label>

					<input
						type="file"
						name="csv_file"
						accept=".csv"
						required
						style="
							padding:8px;
							border:1px solid #ccd0d4;
							border-radius:4px;
							width:100%;
							max-width:400px;
						"
					>
				</div>

				<button
					type="submit"
					class="button button-primary button-hero"
					style="padding:10px 24px; font-size:15px;"
				>
					🚀 Importar Produtos
				</button>
			</form>
		</div>
	</div>

	<?php
	if (!empty($_FILES['csv_file']['tmp_name'])) {
		processar_csv_woo();
	}
}

/* =====================================================
 * PROCESSAMENTO DO CSV
 * ===================================================== */
function processar_csv_woo() {
	if (
		!isset($_POST['importador_nonce']) ||
		!wp_verify_nonce($_POST['importador_nonce'], 'importar_csv_woo')
	) {
		wp_die('Falha de segurança.');
	}

	if (!function_exists('wc_get_product_id_by_sku')) {
		wp_die('WooCommerce não está ativo.');
	}

	$file = fopen($_FILES['csv_file']['tmp_name'], 'r');

	if (!$file) {
		wp_die('Não foi possível abrir o arquivo CSV.');
	}

	$header = fgetcsv($file);

	if (!$header) {
		fclose($file);
		wp_die('Cabeçalho do CSV inválido.');
	}

	$criadas     = 0;
	$atualizadas = 0;
	$avisos      = [];

	while (($row = fgetcsv($file)) !== false) {
		if (count($row) !== count($header)) {
			$avisos[] = 'Linha ignorada — número de colunas inválido.';
			continue;
		}

		$data = array_combine($header, $row);

		/* =========================
		 * IDENTIFICAÇÃO
		 * ========================= */
		$csv_id = !empty($data['ID']) ? intval($data['ID']) : 0;
		$sku    = !empty($data['sku']) ? sanitize_text_field($data['sku']) : '';

		if ($sku) {
			$id_por_sku = wc_get_product_id_by_sku($sku);

			if (!$csv_id && $id_por_sku) {
				$avisos[] = "SKU duplicado ignorado: {$sku}";
				continue;
			}
		}

		/* =========================
		 * CRIA / ATUALIZA PRODUTO
		 * ========================= */
		if ($csv_id && get_post($csv_id)) {
			$product = wc_get_product($csv_id);

			if (!$product) {
				continue;
			}

			$atualizadas++;
		} else {
			$product = new WC_Product_Simple();
			$criadas++;
		}

		/* =========================
		 * DADOS BÁSICOS
		 * ========================= */
		$nome = !empty($data['post_title'])
			? sanitize_text_field($data['post_title'])
			: 'Produto sem nome';

		$slug = !empty($data['post_name'])
			? sanitize_title($data['post_name'])
			: sanitize_title($nome);

		$product->set_name($nome);
		$product->set_slug($slug);
		$product->set_description($data['post_content'] ?? '');
		$product->set_short_description($data['post_excerpt'] ?? '');
		$product->set_status($data['post_status'] ?? 'publish');

		if ($sku) {
			$product->set_sku($sku);
		}

		/* =========================
		 * PREÇOS
		 * ========================= */
		$regular_price = ($data['regular_price'] !== '')
			? floatval($data['regular_price'])
			: null;

		$sale_price = ($data['sale_price'] !== '')
			? floatval($data['sale_price'])
			: null;

		if ($regular_price !== null) {
			$product->set_regular_price($regular_price);
			$product->set_price($regular_price);
		}

		if (
			$sale_price !== null &&
			$sale_price > 0 &&
			$regular_price !== null &&
			$sale_price < $regular_price
		) {
			$product->set_sale_price($sale_price);
			$product->set_price($sale_price);
		} else {
			$product->set_sale_price('');
		}

		$product_id = $product->save();

		/* =========================
		 * TAXONOMIAS tax:*
		 * ========================= */
		foreach ($data as $column => $value) {
			if (strpos($column, 'tax:') === 0 && !empty($value)) {
				$taxonomy = str_replace('tax:', '', $column);

				if (!taxonomy_exists($taxonomy)) {
					continue;
				}

				$terms = array_map('trim', preg_split('/[|,]/', $value));

				foreach ($terms as $term) {
					if (!term_exists($term, $taxonomy)) {
						wp_insert_term($term, $taxonomy);
					}
				}

				wp_set_object_terms($product_id, $terms, $taxonomy);
			}
		}

		/* =========================
		 * ACF – KM
		 * ========================= */
		if (isset($data['meta:km']) && $data['meta:km'] !== '') {
			$km = intval(str_replace(['.', ','], '', $data['meta:km']));

			if (function_exists('update_field')) {
				update_field('field_6944b5a7bba72', $km, $product_id);
			}
		}
	}

	fclose($file);

	echo '<div class="notice notice-success"><p>';
	echo 'Importação concluída.<br>';
	echo "Produtos criados: {$criadas}<br>";
	echo "Produtos atualizados: {$atualizadas}";
	echo '</p></div>';

	if (!empty($avisos)) {
		echo '<div class="notice notice-warning"><p><strong>Avisos:</strong><br>';
		echo implode('<br>', array_map('esc_html', $avisos));
		echo '</p></div>';
	}
}

Outros códigos

  • PHP
  • WooCommerce

CPF Login WooCommerce

Permite login e cadastro usando CPF no WooCommerce, integrado com o plugin WooCommerce Extra Checkout Fields for Brazil.
Ver detalhes

Vamos conversar?