PHP, WordPress

CSV Attributi completi

<?php
// Connessione al database WooCommerce
$servername = "localhost";
$username = "fabio";
$password = "aaa";
$dbname = "ed_imp";
$conn = new mysqli($servername, $username, $password, $dbname);

// Verifica della connessione
if ($conn->connect_error) {
    die("Connessione fallita: " . $conn->connect_error);
}

function rimuoviAccenti($stringa) {
    $mappatura = array(
        'à' => 'a', 'è' => 'e', 'ì' => 'i', 'ò' => 'o', 'ù' => 'u',
        'À' => 'A', 'È' => 'E', 'Ì' => 'I', 'Ò' => 'O', 'Ù' => 'U',
        'á' => 'a', 'é' => 'e', 'í' => 'i', 'ó' => 'o', 'ú' => 'u',
        'Á' => 'A', 'É' => 'E', 'Í' => 'I', 'Ó' => 'O', 'Ú' => 'U',
        // Aggiungi altre mappature se necessario
    );

    return strtr($stringa, $mappatura);
}

// Normalizza i nomi delle colonne per risolvere i duplicati
function normalizzaNomeColonna($nome) {
    $nome = str_replace([' ', '-'], '_', $nome);
    $nome = rimuoviAccenti($nome);

    // Rinomina le colonne duplicate
    switch ($nome) {
        case 'numero_pagine':
            return 'numero_pagine2';
        case 'isbn':
            return 'isbn2';
        case 'sottotitolo':
            return 'sottotitolo2';
        case 'tag':
            return 'tag2';
        case 'codice_prodotto':
            return 'codice_prodotto2';
        case 'ricerca_ebook':
            return 'ricerca_ebook2';
        default:
            return $nome;
    }
}


// Modifica della prima query per includere sku_woocommerce_magento e MAGENTO_ID
$sql = "SELECT
            p.ID as id_prodotto,
            p.post_title as nome_prodotto,
            p.post_name as slug_prodotto,
            pm.meta_value as attributi_serializzati,
            sku_meta.meta_value as sku_woocommerce_magento,
            cpe.entity_id as MAGENTO_ID
        FROM
            ed2024_posts p
        JOIN
            ed2024_postmeta pm ON p.ID = pm.post_id
        LEFT JOIN
            ed2024_postmeta sku_meta ON p.ID = sku_meta.post_id AND sku_meta.meta_key = '_sku'
        LEFT JOIN
            catalog_product_entity cpe ON sku_meta.meta_value = cpe.sku
        WHERE
            p.post_type = 'product' AND pm.meta_key = '_product_attributes'";

$result = $conn->query($sql);

// Inizializza un array per tenere traccia di tutti i nomi degli attributi
$attributi_header = array('id_prodotto', 'nome_prodotto', 'slug_prodotto', 'MAGENTO_ID');
$attributi_rows = array();

// Elabora i risultati della prima query e costruisci l'array degli attributi
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $attributi = unserialize($row['attributi_serializzati']);
        $attributi_row = array(
            'id_prodotto' => $row['id_prodotto'],
            'nome_prodotto' => $row['nome_prodotto'],
            'slug_prodotto' => $row['slug_prodotto'],
            'MAGENTO_ID' => $row['MAGENTO_ID'] ?? ''
        );

        
        foreach ($attributi as $nome_attributo => $dettagli_attributo) {

            $nome_attributo = normalizzaNomeColonna($nome_attributo);
           
            if (!in_array($nome_attributo, $attributi_header)) {
                $attributi_header[] = $nome_attributo;
            }
            $attributi_row[$nome_attributo] = $dettagli_attributo['value'] ?? $dettagli_attributo['name'] ?? '';
        }
        $attributi_rows[$row['id_prodotto']] = $attributi_row;
    }
} else {
    echo "Nessun risultato trovato per la prima query";
}

// Seconda query per ottenere informazioni aggiuntive
$sql2 = "SELECT
            t.name AS attribute_name,
tt.taxonomy AS attribute_taxonomy,
tr.object_id AS product_id,
p.post_title AS product_name,
p.post_name as slug_prodotto
FROM
ed2024_terms t
JOIN
ed2024_term_taxonomy tt ON t.term_id = tt.term_id
JOIN
ed2024_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
JOIN
ed2024_posts p ON tr.object_id = p.ID
WHERE
p.post_type = 'product'
ORDER BY
p.ID, tt.taxonomy;";

$result2 = $conn->query($sql2);

// Elabora i risultati della seconda query
if ($result2->num_rows > 0) {
while($row2 = $result2->fetch_assoc()) {
$product_id = $row2['product_id'];
$attribute_taxonomy = $row2['attribute_taxonomy'];
$attribute_name = $row2['attribute_name'];


    // Aggiungi il nuovo header se non esiste
    if (!in_array($attribute_taxonomy, $attributi_header)) {
        $attributi_header[] = $attribute_taxonomy;
    }

    // Assicurati che l'array per questo prodotto esista
    if (!isset($attributi_rows[$product_id])) {
        $attributi_rows[$product_id] = array(
            'id_prodotto' => $product_id, 
            'nome_prodotto' => $row2['product_name'],
            'slug_prodotto' => $row2['slug_prodotto']
        );
    }

    // Aggiorna l'array dei dati del prodotto
    $attributi_rows[$product_id][$attribute_taxonomy] = $attribute_name;
}
} else {
    echo "Nessun risultato trovato per la seconda query";
    }
    
    // Creazione del file CSV
    $csvFileName = 'export-semi-pro-magento-id.csv';
    $csvFile = fopen($csvFileName, 'w');
    
    // Scrivi l'intestazione nel file CSV
    fputcsv($csvFile, $attributi_header);
    
    // Scrivi i valori degli attributi nel file CSV
    foreach ($attributi_rows as $product_id => $attributi_row) {
    $csvRow = array();
    foreach ($attributi_header as $header) {
    $csvRow[] = $attributi_row[$header] ?? '';
    }
    fputcsv($csvFile, $csvRow);
    }
    
    // Chiudi la connessione al database e il file CSV
    $conn->close();
    fclose($csvFile);
    
    echo "File CSV creato con successo: " . $csvFileName;

 
    
/*
// Prepara la query di inserimento
$columns = implode(', ', array_map(function($col) { return '`' . $col . '`'; }, $attributi_header));
$placeholders = implode(', ', array_fill(0, count($attributi_header), '?'));
$insertQuery = "INSERT INTO export_table ($columns) VALUES ($placeholders)";

$stmt = $conn->prepare($insertQuery);
if (!$stmt) {
    die("Errore nella preparazione della query: " . $conn->error);
}

// Divide $attributi_rows in lotti da 50 record
$lotti = array_chunk($attributi_rows, 50);

foreach ($lotti as $lotto) {
    foreach ($lotto as $attributi_row) {
        // Converti tutti i valori dell'array in stringa
        $values = array_map('strval', array_values($attributi_row));

        // Crea un array di tipi (tutti 's' per stringa)
        $types = str_repeat('s', count($values));

        // Lega i parametri alla query
        $stmt->bind_param($types, ...$values);

        // Esegui la query
        if (!$stmt->execute()) {
            echo "Errore durante l'inserimento dei dati: " . $stmt->error;
        }
    }
}

echo "Inserimento dei dati nella tabella riuscito con successo.";

// Chiudi lo statement e la connessione al database
//$stmt->close();
*/
//$conn->close();

    ?>