/**
* 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>';
}
}