Senza categoria

EdiSES – Prodotti disabilitati

SELECT DISTINCT cpe.entity_id, cpe.sku, cpev_name.value AS product_name
FROM catalog_product_entity AS cpe
JOIN catalog_product_entity_int AS cpei_visibility ON cpe.entity_id = cpei_visibility.entity_id
JOIN catalog_product_entity_int AS cpei_status ON cpe.entity_id = cpei_status.entity_id
JOIN cataloginventory_stock_item AS csi ON cpe.entity_id = csi.product_id
JOIN catalog_product_entity_varchar AS cpev_name ON cpe.entity_id = cpev_name.entity_id
WHERE cpei_status.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'status' AND entity_type_id = 4)
AND cpei_status.value = 1 /* Stato abilitato */
AND cpei_visibility.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'visibility' AND entity_type_id = 4)
AND cpei_visibility.value = 2 /* Visibilità solo catalogo */
AND csi.manage_stock = 0 /* Gestione inventario non disponibile */
AND cpev_name.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'name' AND entity_type_id = 4)

vanno eliminati gli ebook

PHP

Categorie – Descrizione HTML

Questo script va fatto girare dopo l’import delle categorie, si occupa di sistemare i tag html delle descrizioni senza far tirare 10000 porchi

<?php
// Includi il file wp-load.php per avere accesso alle funzioni di WordPress
require_once('wp-load.php');

// Ottieni tutte le categorie di WooCommerce
$args = array(
    'taxonomy'   => 'product_cat',
    'hide_empty' => false,
);
$product_categories = get_terms($args);

// Controlla se ci sono categorie
if (!empty($product_categories)) {
    foreach ($product_categories as $category) {
        if (!empty($category) && !is_wp_error($category)) {
            // Ottieni l'ID della categoria
            $category_id = $category->term_id;

            // Ottieni la descrizione della categoria
            $description = $category->description;

            // Processa la descrizione qui se necessario
            // Per esempio, potresti voler usare html_entity_decode() o una funzione simile
            // per assicurarti che i tag HTML siano interpretati correttamente
            $processed_description = html_entity_decode($description);

            // Aggiorna la descrizione della categoria con la versione elaborata
            wp_update_term($category_id, 'product_cat', array(
                'description' => $processed_description,
            ));
        }
    }

    echo 'Le descrizioni delle categorie sono state aggiornate con successo.';
} else {
    echo 'Non ci sono categorie da aggiornare.';
}
Senza categoria

Aggiornamento EdiSES prodotti/categorie

Prima di tutto si esegue l’import sulla macchina virtuale 192.168.220.136/wordpress, a lei è demandato il compito di gestire l’import fin dal giorno 0.

Va copiata la tabella catalog_product_entity sul database edises_import
Si esporta il file csv tramite url: http://192.168.220.136/wordpress/export-attr.php
Si importa il file su un database a caso online, di seguito la stuttura di default in base all’esportazione (potrebbe variare)

I prodotti vanno esportati con l’ultimo template, poi si fa girare uno script che modifica il file csv e si carica quello perché contiene già colonne extra.

Bisogna esportare le categorie WooCommerce, solo dopo fare l’import dei prodotti, prendere CAT-3 come riferimento, va modificato anche woo-custom-menu-link.php come segue

// Aggiungi il campo personalizzato al form di modifica della categoria
add_action('product_cat_edit_form_fields', 'aggiungi_campo_personalizzato_categoria');

function aggiungi_campo_personalizzato_categoria($term) {
    ?>
    <tr class="form-field">
        <th scope="row" valign="top"><label for="_id_categoria_magento">ID Categoria Magento</label></th>
        <td>
            <input type="text" name="_id_categoria_magento" id="_id_categoria_magento" value="<?php echo get_term_meta($term->term_id, '_id_categoria_magento', true ); ?>">
            <p class="description">Inserisci qui l'ID Categoria Magento.</p>
        </td>
    </tr>
    <?php
}

// Salva il valore del campo personalizzato quando si modifica la categoria
add_action('edited_product_cat', 'salva_campo_personalizzato_categoria');

function salva_campo_personalizzato_categoria($term_id) {
    if (isset($_POST['_id_categoria_magento'])) {
        update_term_meta($term_id, '_id_categoria_magento', sanitize_text_field($_POST['_id_categoria_magento']));
    }
}


// Aggiungi il campo personalizzato al form di modifica della categoria
add_action('product_cat_edit_form_fields', 'aggiungi_campo_personalizzato_categoria_woocommerce');

function aggiungi_campo_personalizzato_categoria_woocommerce($term) {
    ?>
    <tr class="form-field">
        <th scope="row" valign="top"><label for="_id_categoria_woocommerce">ID Categoria WooCommerce</label></th>
        <td>
            <input type="text" name="_id_categoria_woocommerce" id="_id_categoria_woocommerce" value="<?php echo get_term_meta($term->term_id, '_id_categoria_woocommerce', true ); ?>">
            <p class="description">Inserisci qui l'ID Categoria WooCommerce.</p>
        </td>
    </tr>
    <?php
}

// Salva il valore del campo personalizzato quando si modifica la categoria
add_action('edited_product_cat', 'salva_campo_personalizzato_categoria_woocommerce');

function salva_campo_personalizzato_categoria_woocommerce($term_id) {
    if (isset($_POST['_id_categoria_woocommerce'])) {
        update_term_meta($term_id, '_id_categoria_woocommerce', sanitize_text_field($_POST['_id_categoria_woocommerce']));
    }
}

CREATE TABLE `magento_export_beta` (
  `id_prodotto` varchar(255) DEFAULT NULL,
  `nome_prodotto` varchar(255) DEFAULT NULL,
  `slug_prodotto` varchar(255) DEFAULT NULL,
  `MAGENTO_ID` varchar(20) DEFAULT NULL,
  `Autori` longtext,
  `Indice` text,
  `pa_has_cd` varchar(255) DEFAULT NULL,
  `pa_has_gift` varchar(255) DEFAULT NULL,
  `Estensioni_Web` text,
  `Autore` varchar(255) DEFAULT NULL,
  `Isbn` varchar(50) DEFAULT NULL,
  `pa_is_ebook` varchar(255) DEFAULT NULL,
  `pa_edizione` varchar(50) DEFAULT NULL,
  `Numero_pagine` varchar(255) DEFAULT NULL,
  `pa_stampa` varchar(50) DEFAULT NULL,
  `pa_is_novita` varchar(255) DEFAULT NULL,
  `pa_sfoglia_volume` varchar(255) DEFAULT NULL,
  `pa_is_disponible` varchar(255) DEFAULT NULL,
  `pa_is_prenotabile` varchar(255) DEFAULT NULL,
  `Ricerca_Ebook` text,
  `pa_has_software` varchar(255) DEFAULT NULL,
  `Sottotitolo` varchar(255) DEFAULT NULL,
  `pa_manuale_compet_sost_anief` varchar(255) DEFAULT NULL,
  `pa_eb_eserc_sost_anief` varchar(255) DEFAULT NULL,
  `pa_in_evidenza` varchar(255) DEFAULT NULL,
  `pa_nopromo` varchar(255) DEFAULT NULL,
  `pa_coupon` varchar(255) DEFAULT NULL,
  `pa_promo20_facebook` varchar(255) DEFAULT NULL,
  `pa_is_vst_ebook` varchar(255) DEFAULT NULL,
  `pa_maestrena` varchar(255) DEFAULT NULL,
  `pa_ripamcoesione` varchar(255) DEFAULT NULL,
  `pa_agenziaentratefb` varchar(255) DEFAULT NULL,
  `pa_man40` varchar(255) DEFAULT NULL,
  `pa_specializzazionimediche` varchar(255) DEFAULT NULL,
  `pa_collanads` varchar(255) DEFAULT NULL,
  `pa_prometheus` varchar(255) DEFAULT NULL,
  `pa_ammissioni` varchar(255) DEFAULT NULL,
  `pa_feedlibrerie` varchar(255) DEFAULT NULL,
  `pa_itastranieri` varchar(255) DEFAULT NULL,
  `pa_mibact` varchar(255) DEFAULT NULL,
  `pa_formato` varchar(50) DEFAULT NULL,
  `pa_scontostanfield` varchar(255) DEFAULT NULL,
  `pa_scontovigili` varchar(255) DEFAULT NULL,
  `pa_in_ebook_search` varchar(255) DEFAULT NULL,
  `pa_has_vst_ppe_ebook` varchar(255) DEFAULT NULL,
  `pa_affiliati_infermieri` varchar(255) DEFAULT NULL,
  `pa_profsanitarielavoro` varchar(255) DEFAULT NULL,
  `pa_infante` varchar(255) DEFAULT NULL,
  `pa_omaggioebook` varchar(255) DEFAULT NULL,
  `pa_kitinfante` varchar(255) DEFAULT NULL,
  `pa_specmedichevito` varchar(255) DEFAULT NULL,
  `pa_cgiltorino` varchar(255) DEFAULT NULL,
  `pa_medprofammissioni` varchar(255) DEFAULT NULL,
  `pa_sconto_aprile_2020` varchar(255) DEFAULT NULL,
  `pa_concorsocattedra100sconto` varchar(255) DEFAULT NULL,
  `pa_verdolina` varchar(255) DEFAULT NULL,
  `pa_codiceds` varchar(255) DEFAULT NULL,
  `pa_sibioc` varchar(255) DEFAULT NULL,
  `pa_escludi_pdf_catalogo` varchar(255) DEFAULT NULL,
  `pa_scontodisal` varchar(255) DEFAULT NULL,
  `pa_disalsingoli` varchar(255) DEFAULT NULL,
  `pa_is_edigita_ebook` varchar(255) DEFAULT NULL,
  `pa_is_edigita_ebook_ppe` varchar(255) DEFAULT NULL,
  `Errata_Corrige` text,
  `pa_url_sistema_verifica` varchar(255) DEFAULT NULL,
  `pa_vst_ppe_resource_id_prefix` varchar(255) DEFAULT NULL,
  `lista_sotto_img` text,
  `URL_ebook` text,
  `ID_Prodotto_nuova_versione` varchar(255) DEFAULT NULL,
  `Data_disponibilita` varchar(255) DEFAULT NULL,
  `Codice_Prodotto` varchar(50) DEFAULT NULL,
  `VST_resource_id_VBID` varchar(255) DEFAULT NULL,
  `Tag` text,
  `URL_cartaceo` text,
  `pa_acs_resource_id` varchar(255) DEFAULT NULL,
  `pa_lingua` varchar(50) DEFAULT NULL,
  `pa_versione` varchar(50) DEFAULT NULL,
  `pa_apple_store` varchar(255) DEFAULT NULL,
  `Brevi_Info` text,
  `pa_dispositivi_supportati` text,
  `Specifiche` text,
  `Struttura` text,
  `pa_demo` varchar(255) DEFAULT NULL,
  `pa_docebo_info` text,
  `pa_elearning` varchar(255) DEFAULT NULL,
  `pa_docebo_course` text,
  `Descrizione_per_widget` text,
  `Country_of_Manufacture` varchar(255) DEFAULT NULL,
  `Edizione` varchar(255) DEFAULT NULL,
  `id_riferimento_Edigita` varchar(255) DEFAULT NULL,
  `pa_market_android` varchar(255) DEFAULT NULL,
  `pa_printable_book_cover_url` text,
  `pa_edigita_ppe_resource_id` varchar(255) DEFAULT NULL,
  `pa_cost` varchar(255) DEFAULT NULL,
  `sottotitolo2` varchar(255) DEFAULT NULL,
  `isbn2` varchar(50) DEFAULT NULL,
  `numero_pagine2` varchar(255) DEFAULT NULL,
  `tag2` text,
  `codice_prodotto2` varchar(50) DEFAULT NULL,
  `ricerca_ebook2` text,
  `pa_simulazione_studenti` varchar(255) DEFAULT NULL,
  `Formato` varchar(50) DEFAULT NULL,
  `pa_ean` varchar(50) DEFAULT NULL,
  `Relatori` text,
  `pa_demo_link` varchar(255) DEFAULT NULL,
  `pa_featured` varchar(255) DEFAULT NULL,
  `pa_nome_landing` varchar(255) DEFAULT NULL,
  `pa_course_plans` text,
  `Programma` text,
  `product_cat` varchar(255) DEFAULT NULL,
  `product_type` varchar(255) DEFAULT NULL,
  `product_visibility` varchar(255) DEFAULT NULL,
  `product_tag` text,
  PRIMARY KEY (`id_prodotto`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Dopo aver importato il csv estratto, va aggiornata la tabella aggiungendo i campi mancanti

ALTER TABLE magento_export_beta
ADD COLUMN `contiene_ebook` varchar(100) NOT NULL AFTER `MAGENTO_ID`,
ADD COLUMN `isbn_ebook` varchar(100) NOT NULL AFTER `contiene_ebook`,
ADD COLUMN `contiene_cartaceo` varchar(100) NOT NULL AFTER `isbn_ebook`,
ADD COLUMN `isbn_cartaceo` longtext NOT NULL AFTER `contiene_cartaceo`,
ADD COLUMN `volume_kit` longtext NOT NULL AFTER `isbn_cartaceo`,
ADD COLUMN `isbn_volume_kit` longtext NOT NULL AFTER `volume_kit`,
ADD COLUMN `serialized_isbn_kit` longtext NOT NULL AFTER `isbn_volume_kit`;


Prima di mettere mano alla tabella definitiva creiamo una di test

CREATE TABLE magento_export_beta_2
SELECT * FROM magento_export_beta

Isoliamo i prodotti già presenti nel database finale rispetto a quelli nell’ambiente di sviluppo, lo facciamo andando ad esportare i valori ISBN e creando due tabelle definite:

CREATE TABLE `prodotti_destinazione` (
  `SKU` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `prodotti_origine` (
  `SKU` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

-- da tabella magento_export_beta prendiamo la lista di isbn che caricheremo nella tabella prodotti_origine

SELECT Isbn from magento_export_beta

-- preleviamo anche i prodotti attualmente disponibili su woocommerce

SELECT pm.meta_value AS ISBN
FROM wpcv_postmeta pm
JOIN wpcv_posts p ON pm.post_id = p.ID
WHERE pm.meta_key = 'isbn'
AND p.post_type = 'product'
AND pm.meta_value IS NOT NULL
AND pm.meta_value != '';

-- a questo punto compariamo i risultati ottenuti, la lista di ISBN estratta equivale ai prodotti non ancora presenti

SELECT p1.SKU
FROM prodotti_origine p1
LEFT JOIN prodotti_destinazione p2 ON p1.SKU = p2.SKU
WHERE p2.SKU IS NULL
AND p1.SKU IS NOT NULL
AND p1.SKU != '';

-- creiamo una nuova tabella temporanea dove andiamo a prendere tutti i prodotti nuovi

INSERT INTO nuovi_prodotti (SKU)
SELECT p1.SKU
FROM prodotti_origine p1
LEFT JOIN prodotti_destinazione p2 ON p1.SKU = p2.SKU
WHERE p2.SKU IS NULL
AND p1.SKU IS NOT NULL
AND p1.SKU != '';

-- lavoriamo solo sui nuovi prodotti e lasciamo il mondo come sta

CREATE TABLE magento_export_new
SELECT * FROM magento_export_beta_2 where Isbn IN (Select * from nuovi_prodotti); 

Si esegue l’import di prodotti e categorie, per farlo correttamente bisogna esportare come Migrate Prodotti (nel caso possiamo affinare, ma resta il nodo delle categorie prodotti che vengono cambiate a pioggia)


Contiene eBook
campo tabella URL_ebook se è pieno, il valore del campo contiene_ebook deve essere settato su yes

UPDATE magento_export_beta
SET contiene_ebook = CASE WHEN URL_ebook IS NOT NULL AND URL_ebook != '' THEN 'yes' ELSE contiene_ebook END;

ISBN eBook
Logica e script creati sul file http://script/isbn_ebook.php
Script successivo: /ebook-fix.php
Script successivo: /ebook-postmeta-fix.php

Contiene Cartaceo
si utilizza la stessa identica logica utilizzata per “contiene ebook”

UPDATE magento_export_beta
SET contiene_cartaceo = CASE WHEN URL_cartaceo IS NOT NULL AND URL_cartaceo != '' THEN 'yes' ELSE contiene_cartaceo END;


ISBN cartaceo
Logica e script creati sul file http://script/isbn_cartaceo.php

Volume Kit

UPDATE magento_export_beta
SET volume_kit = 'yes'
WHERE nome_prodotto LIKE '%kit%';

ISBN Volume Kit

eseguire lo scritp in /tool/volumi_kit_update.php. Ricordarsi di esportare la tabella aggiornata catalog_product_bundle_selection dal database Magento

-- creo una tabella con dentro tutti i dati solo dei nuovi prodotti
CREATE TABLE nuovi_prodotti_dati AS
SELECT magento.*
FROM magento_export_beta AS magento
INNER JOIN nuovi_prodotti AS nuovi ON magento.Isbn = nuovi.SKU;

Devo poi esportale le tabelle magento_export_beta e nuovi_prodotti verso il database definitivo

uso questa query per fare il match tra isbn della tabella magento con tutti i valori esportati e aggiornare il campo id_prodotto con il post_id di woocommerce

UPDATE magento_export_beta_2 AS m
JOIN wpcv_postmeta AS n ON m.Isbn = n.meta_value AND n.meta_key = 'isbn'
SET m.id_prodotto = n.post_id;
-- nel caso serva aggiornare gli id prodotto woocommerce rispetto a quelli attuali

UPDATE magento_export_new AS m
JOIN wpcv_postmeta AS w ON m.Isbn = w.meta_value
SET m.id_prodotto = w.post_id
WHERE w.meta_key = '_sku';

6. serialized_isbn_kit => script preposto

-- estrae in una tabella il corrispondente ID categoria Magento (funzionalità Legacy)
 
SELECT tm.meta_value AS ID_CAT_MAGENTO, 
tm.term_id AS ID_CAT_WOOCOMMERCE,
t.name AS NOME,
t.slug AS SLUG
FROM wpcv_termmeta as tm
JOIN wpcv_terms as t ON tm.term_id = t.term_id
WHERE tm.meta_key = '_id_categoria_magento';



Si esegue l’import di prodotti e categorie, per farlo correttamente bisogna esportare come Migrate Prodotti (nel caso possiamo affinare, ma resta il nodo delle categorie prodotti che vengono cambiate a pioggia)

Il nodo primario resta quello di sistemare solo i prodotti con differenze sostanziali per gli attributi extra, ad esempio: copertina, pagine, kit etc etc. Esistono già script che si occupano di sistemare tutti i dettagli, ma vengono fatti su tutti i prodotti, non vorrei andare ad intaccare quelli già sistemati, vanno rivisti tutti gli script.

-- questa pontentissima query estrae tutti i prodotti e relative categorie da magento

SELECT 
    cpe.entity_id AS 'Product_ID', 
    cpev.value AS 'Product_Name', 
    GROUP_CONCAT(DISTINCT ccv.value) AS 'Category_Names',
    GROUP_CONCAT(DISTINCT ccp.category_id) AS 'Category_IDs',
    MAX(ur.request_path) AS 'Product_URL'
FROM 
    catalog_product_entity AS cpe
JOIN 
    catalog_product_entity_varchar AS cpev ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'name' AND entity_type_id = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product'))
LEFT JOIN 
    catalog_category_product AS ccp ON cpe.entity_id = ccp.product_id
LEFT JOIN 
    catalog_category_entity_varchar AS ccv ON ccp.category_id = ccv.entity_id AND ccv.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'name' AND entity_type_id = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_category'))
LEFT JOIN 
    url_rewrite AS ur ON ur.entity_id = cpe.entity_id AND ur.entity_type = 'product' AND ur.redirect_type = 0 AND ur.store_id = 1
GROUP BY 
    cpe.entity_id, cpev.value;

-- Creazione della nuova tabella per i risultati, accoppiamo le categorie magento a quelle woocommerce

CREATE TABLE `cat-magento-woocommerce` (
    category_id INT,
    category_name VARCHAR(255),
    magento_category_id INT
);

-- Inserimento dei risultati della query nella nuova tabella
INSERT INTO `cat-magento-woocommerce` (category_id, category_name, magento_category_id)
SELECT t.term_id AS category_id, t.name AS category_name, meta.meta_value AS magento_category_id
FROM wpcv_terms t
INNER JOIN wpcv_term_taxonomy tt ON t.term_id = tt.term_id
LEFT JOIN wpcv_termmeta meta ON t.term_id = meta.term_id AND meta.meta_key = '_id_categoria_magento'
WHERE tt.taxonomy = 'product_cat';

script per far combaciare prodotti e categorie: /cat_magento_woo.php

<?php
// Registra il tempo all'inizio dello script
$time_start = microtime(true);

$servername = "localhost";
$username = "yqmkgwhd_fabios";
$password = "persolino83";
$dbname = "yqmkgwhd_eddef";

$record_count = 0;
$association_count = 0;

$conn = new mysqli($servername, $username, $password, $dbname);

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

// Query per recuperare i post_id presenti nella tabella cat-prod-magento
$post_ids_query = "SELECT DISTINCT post_id FROM wpcv_postmeta WHERE meta_key = '_magento_id'";
$post_ids_result = $conn->query($post_ids_query);

if ($post_ids_result->num_rows > 0) {
    $post_ids = [];
    while ($row = $post_ids_result->fetch_assoc()) {
        $post_ids[] = $row['post_id'];
    }
    $post_ids_string = implode(',', $post_ids);

    // Query per eliminare i legami relativi ai post_id presenti nella tabella cat-prod-magento
    $delete_existing_query = "DELETE FROM wpcv_term_relationships WHERE object_id IN ($post_ids_string)";
    $conn->query($delete_existing_query);
    echo "Legami esistenti cancellati per i post_id presenti nella tabella cat-prod-magento<br>";
} else {
    echo "Nessun post_id trovato nella tabella cat-prod-magento<br>";
}

// Query per recuperare i dati dalla tabella cat-prod-magento
$sql = "SELECT ID_Magento, Category_ID FROM `cat-prod-magento`";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $product_id_query = "SELECT post_id FROM wpcv_postmeta WHERE meta_key = '_magento_id' AND meta_value = '{$row['ID_Magento']}'";
        $product_id_result = $conn->query($product_id_query);
        if ($product_id_result->num_rows > 0) {
            $product_id_row = $product_id_result->fetch_assoc();
            $product_id = $product_id_row['post_id'];
            $category_ids = explode(',', $row['Category_ID']);
            foreach ($category_ids as $category_id) {
                $query = "SELECT woocommerce_cat FROM `cat-magento-woocommerce` WHERE magento_cat = '$category_id'";
                $woocommerce_result = $conn->query($query);
                if ($woocommerce_result->num_rows > 0) {
                    $woocommerce_row = $woocommerce_result->fetch_assoc();
                    $woocommerce_category_id = $woocommerce_row['woocommerce_cat'];

                    $check_query = "SELECT 1 FROM wpcv_term_relationships WHERE object_id = '$product_id' AND term_taxonomy_id = '$woocommerce_category_id'";
                    $check_result = $conn->query($check_query);
                    if ($check_result->num_rows == 0) {
                        $insert_query = "INSERT INTO wpcv_term_relationships (object_id, term_taxonomy_id) VALUES ('$product_id', '$woocommerce_category_id')";
                        $conn->query($insert_query);
                        echo "Prodotto $product_id associato con successo alla categoria WooCommerce $woocommerce_category_id<br>";
                        $association_count++;
                    } else {
                        echo "Relazione già esistente tra prodotto $product_id e categoria WooCommerce $woocommerce_category_id, non inserita per evitare duplicati<br>";
                    }
                } else {
                    echo "Nessuna corrispondenza trovata per il Magento category ID: $category_id<br>";
                }
            }
        } else {
            echo "Nessun post_id trovato per Magento ID: {$row['ID_Magento']}<br>";
        }
        $record_count++;
    }
} else {
    echo "0 risultati";
}

$conn->close();

// Registra il tempo alla fine dello script
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
$execution_minutes = floor($execution_time / 60);
$execution_seconds = round($execution_time % 60, 2);

echo "Numero totale di record processati: $record_count<br>";
echo "Numero di associazioni create con successo: $association_count<br>";
echo "Tempo totale di esecuzione dello script: $execution_minutes minuti e $execution_seconds secondi";

?>

-- categorie disabilitate su magento

SELECT entity_id
FROM catalog_category_entity
WHERE entity_id NOT IN (
    SELECT entity_id
    FROM catalog_category_entity_int
    WHERE attribute_id = (
        SELECT attribute_id
        FROM eav_attribute
        WHERE attribute_code = 'is_active'
        AND entity_type_id = (
            SELECT entity_type_id
            FROM eav_entity_type
            WHERE entity_type_code = 'catalog_category'
        )
    )
    AND value = 1
);
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();

    ?>
Senza categoria

EdiSES – Mappatura Database

SELECT ea.attribute_code, ea.backend_type, 
    CASE ea.backend_type
        WHEN 'varchar' THEN ce_varchar.value
        WHEN 'int' THEN ce_int.value
        WHEN 'decimal' THEN ce_decimal.value
        WHEN 'datetime' THEN ce_datetime.value
        WHEN 'text' THEN ce_text.value
        ELSE 'Unsupported type'
    END as value
FROM eav_attribute ea
LEFT JOIN catalog_product_entity_varchar ce_varchar ON ea.attribute_id = ce_varchar.attribute_id AND ce_varchar.entity_id = '4905'
LEFT JOIN catalog_product_entity_int ce_int ON ea.attribute_id = ce_int.attribute_id AND ce_int.entity_id = '4905'
LEFT JOIN catalog_product_entity_decimal ce_decimal ON ea.attribute_id = ce_decimal.attribute_id AND ce_decimal.entity_id = '4905'
LEFT JOIN catalog_product_entity_datetime ce_datetime ON ea.attribute_id = ce_datetime.attribute_id AND ce_datetime.entity_id = '4905'
LEFT JOIN catalog_product_entity_text ce_text ON ea.attribute_id = ce_text.attribute_id AND ce_text.entity_id = '4905'
WHERE ea.entity_type_id = '4';

La query che hai fornito interroga diverse tabelle per recuperare gli attributi e i loro valori per un dato prodotto in Magento. Ecco le tabelle coinvolte in questa query e una breve descrizione del loro scopo:

eav_attribute:
Questa tabella contiene informazioni sugli attributi, come l’ID dell’attributo (attribute_id), il codice dell’attributo (attribute_code), e il tipo di backend (backend_type) che indica il tipo di dato dell’attributo (varchar, int, decimal, datetime, text).

catalog_product_entity_varchar:
Questa tabella memorizza i valori degli attributi di tipo ‘varchar’ (stringhe di testo breve) per i prodotti. Viene associata alla tabella eav_attribute tramite attribute_id per ottenere i valori degli attributi di tipo varchar.

catalog_product_entity_int:

Questa tabella memorizza i valori degli attributi di tipo ‘int’ (numeri interi) per i prodotti. Come la tabella catalog_product_entity_varchar, viene associata alla tabella eav_attribute per ottenere i valori degli attributi di tipo intero.

catalog_product_entity_decimal:
Questa tabella è utilizzata per memorizzare i valori degli attributi di tipo ‘decimal’ (numeri decimali) per i prodotti. È associata a eav_attribute per ottenere i valori degli attributi di tipo decimale.

catalog_product_entity_datetime:

Questa tabella memorizza i valori degli attributi di tipo ‘datetime’ (data e ora) per i prodotti. Viene associata a eav_attribute per ottenere i valori degli attributi di tipo datetime.

 catalog_product_entity_text:

 Questa tabella è utilizzata per memorizzare i valori degli attributi di tipo ‘text’ (stringhe di testo lunghe) per i prodotti. Viene associata a eav_attribute per ottenere i valori degli attributi di tipo testo.

In questa query, la tabella eav_attribute viene utilizzata come tabella principale da cui vengono estratti i codici degli attributi e i tipi di backend. Le altre tabelle (catalog_product_entity_varchar, catalog_product_entity_int, catalog_product_entity_decimal, catalog_product_entity_datetime, catalog_product_entity_text) vengono poi associate a eav_attribute per recuperare i valori specifici degli attributi per un dato prodotto, identificato dall’entity_id (‘4905’ in questo caso) e filtrati per tipo di entità (entity_type_id = ‘4’, tipicamente per i prodotti).

catalog_product_entity
catalog_product_entity_varchar

entity_id ==> CHIAVE PRIMARIA

SELECT 
    entity.entity_id,
    entity.sku,
    varchar_table.attribute_id,
    varchar_table.value AS attribute_value,
    attribute.attribute_code AS attribute_name
FROM 
    catalog_product_entity AS entity
INNER JOIN 
    catalog_product_entity_varchar AS varchar_table ON entity.entity_id = varchar_table.entity_id
LEFT JOIN 
    eav_attribute AS attribute ON varchar_table.attribute_id = attribute.attribute_id
WHERE 
    entity.entity_id = 5305

tabella eav_attribute

Ci sono dentro tutte le label utili nella colonna attribute_code, fanno tutti riferimento al valore della colonna attribute_id

tabella catalog_product_entity_text

ulteriori informazioni prodotto: chiavi entity_id, attribute_id (recuperabile valore da eav_attribute)

tabella catalog_product_entity_varchar

tabella eav_attribute_option_value

copertina flessibile: option_id = 8
copertina rigida: option_id = 9
B/N: option_id = 4 ==> attribute_name = stampa
4 colori = option_id = 3
ebook = option_id = 10
lingua italiano = option_id = 7
lingua inglese = option_id = 6

SELECT 
    text_table.entity_id AS ID_PRODOTTO,
    attribute.attribute_code,
    text_table.value AS text_attribute_value
FROM 
    eav_attribute AS attribute
LEFT JOIN 
    catalog_product_entity_text AS text_table 
    ON attribute.attribute_id = text_table.attribute_id
WHERE 
    text_table.entity_id = 5305

La query estrae:
description
short_description
meta_keyword
indice
risorse
tagricerca (skip)
ebook_name

Prodotti Abilitati o disabilitati

SELECT 
    entity_id
FROM 
    catalog_product_entity
WHERE 
    entity_id IN (
        SELECT entity_id 
        FROM catalog_product_entity_int 
        WHERE attribute_id = (
            SELECT attribute_id 
            FROM eav_attribute 
            WHERE attribute_code = 'status'
        ) 
        AND value != 1 -- Valore che indica lo stato "Abilitato"
        # AND value = 1 -- abilitato
    )

SELECT 
    entity.entity_id AS ID_PRODOTTO,
    entity.sku AS ISBN,
    IFNULL(stock_table.value, 0) AS ABILITATO,
    visibility_table.value AS VISIBILITA
FROM 
    catalog_product_entity AS entity
LEFT JOIN 
    catalog_product_entity_int AS stock_table 
    ON entity.entity_id = stock_table.entity_id
    AND stock_table.attribute_id = (
        SELECT attribute_id 
        FROM eav_attribute 
        WHERE attribute_code = 'status' 
    )
LEFT JOIN 
    catalog_product_entity_int AS visibility_table 
    ON entity.entity_id = visibility_table.entity_id
    AND visibility_table.attribute_id = (
        SELECT attribute_id 
        FROM eav_attribute 
        WHERE attribute_code = 'visibility'
    )
WHERE 
    entity.entity_id IN (4693,1608,4694,1606,1610,4692) 

VIBILITÀ VALORI:

1: non visibile
2: catalogo
3: ricerca
4: catalogo e ricerca

ABILITATO VALORI:
1: abilitato
2: disabilitato

Senza categoria

Plugin Area Riservata

<?php
/**
 * Plugin Name: Notifica Area Riservata
 * Plugin URI: https://www.digitalfollowers.com
 * Description: Invia i dettagli dell'acquisto a un sistema esterno dopo il completamento dell'ordine in WooCommerce.
 * Version: 1.0.2
 * Author: Staff - Digital Followers
 * Author URI: https://www.digitalfollowers.com
 */

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}

add_action('woocommerce_payment_complete', 'notify_purchase_to_external_api');

function notify_purchase_to_external_api($order_id) {
    $order = wc_get_order($order_id);
    $products_data = [];
    
    foreach ($order->get_items() as $item_id => $item) {
        $product = $item->get_product();
        $magentoBookId = $product->get_id();
        $enableResources = get_post_meta($product->get_id(), 'enableResources', true);

        $products_data[] = [
            'magentoBookId' => $magentoBookId,
            'enableResources' => filter_var($enableResources, FILTER_VALIDATE_BOOLEAN)
        ];
    }

    $payload_details = [
        'customerId' => $order->get_user_id(),
        'customerEmail' => $order->get_billing_email(),
        'orderId' => $order->get_id(),
        'products' => $products_data
    ];

    $header = json_encode(['typ' => 'JWT', 'alg' => 'HS512']);
    $payload = base64_encode(json_encode($payload_details));
    $signature = hash_hmac('sha512', $header . "." . $payload, 'your_secret_key', true);
    $jwt = base64_encode($header) . "." . base64_encode($payload) . "." . base64_encode($signature);

    $ch = curl_init('https://areariservataedises.meetweb.dev/api/notify-purchased-products');
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['data' => $jwt]));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
    ]);

    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);

    if ($error) {
        // Handle error, maybe log it
        error_log('Curl error: ' . $error);
    } else {
        $response_data = json_decode($response, true);
        if (isset($response_data['error']) && $response_data['error']) {
            // Handle API error, maybe log it
            error_log('API error: ' . $response_data['error']);
        } else {
            // Handle successful response
            // ...
        }
    }
}
?>


Senza categoria

Elaborazione Prodotti

Procedura aggiornata al 06/03/2024

a. si importano tutti i prodotti su http://192.168.220.136/wordpress –> ubuntu server locale
a1. Esiste installazione backup al 06/03/2024 del sistema di import nella cartella Ubuntu-Server su drive, basta ripristinarla con Duplicatori Pro
b. Vanno esportati i prodotti nuovi appena creati tramite…
b1. anche le categorie vanno esportate, ma ci vuole un meccanismo che cerchi nuove e vecchie categorie
b2. bisognerebbe anche andare sul database magento e vedere quali sono effettivamente le categorie presenti sul sito

Tramite questa query andiamo a vedere qual’era la categoria di magento e qual è la nuova categoria associata

SELECT tm.meta_value as ID_VECCHIA_CATEGORIA,
t.term_id as ID_CAT_WOOCOMMERCE,
t.name as NOME_CATEGORIA
FROM ed2024_termmeta AS tm
INNER JOIN ed2024_terms AS t ON tm.term_id = t.term_id
WHERE tm.meta_key = '_fgm2wc_old_product_category_id-lang0';

Esportiamo dal database magento tutta la lista di id prodotto, categorie nomi e id

SELECT 
    cpe.entity_id AS 'Product ID', 
    cpev.value AS 'Product Name', 
    GROUP_CONCAT(DISTINCT ccv.value) AS 'Category Names',
    GROUP_CONCAT(DISTINCT ccp.category_id) AS 'Category IDs',
    MAX(ur.request_path) AS 'Product URL'
FROM 
    catalog_product_entity AS cpe
JOIN 
    catalog_product_entity_varchar AS cpev ON cpe.entity_id = cpev.entity_id AND cpev.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'name' AND entity_type_id = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product'))
LEFT JOIN 
    catalog_category_product AS ccp ON cpe.entity_id = ccp.product_id
LEFT JOIN 
    catalog_category_entity_varchar AS ccv ON ccp.category_id = ccv.entity_id AND ccv.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'name' AND entity_type_id = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_category'))
LEFT JOIN 
    url_rewrite AS ur ON ur.entity_id = cpe.entity_id AND ur.entity_type = 'product' AND ur.redirect_type = 0 AND ur.store_id = 1
GROUP BY 
    cpe.entity_id, cpev.value;

Si potrebbe realizzare uno script che segue questa logica:
a. controlla le categorie magento al quale è assegnato
b. controlla le categorie Woocommerce al quale è assegnato
c. se il prodotto non è nella categoria viene indirizzato automaticamente

Bisogna riuscire ad esportare tutti gli attributi prodotti

l’installazione finale di woocommerce è gestita su edises-import.digitalfollower.it ma i prodotti e categorie differiscono per id rispetto all’installazione originale perché i prodotti sono stati poi esportati con un tool, questo complica le cose, sarebbe utile capire se possibile cambiare riferimenti a id prodotto e categorie rendendoli identici

a. si esportano i prodotti con export_csv

CREATE TABLE `export_magento` (
  `id_prodotto` bigint(20) unsigned NOT NULL,
  `nome_prodotto` varchar(196) NOT NULL,
  `slug_prodotto` varchar(200) NOT NULL,
  `magento_id` bigint(20) unsigned NOT NULL,
  `autori` text,
  `indice` text,
  `pa_has_cd` varchar(2) DEFAULT NULL,
  `pa_has_gift` varchar(2) DEFAULT NULL,
  `estensioni_web` text,
  `autore` varchar(113) DEFAULT NULL,
  `isbn` varchar(16) DEFAULT NULL,
  `pa_is_ebook` varchar(2) DEFAULT NULL,
  `pa_edizione` varchar(12) DEFAULT NULL,
  `numero_pagine` varchar(49) DEFAULT NULL,
  `pa_stampa` varchar(8) DEFAULT NULL,
  `pa_is_novita` varchar(2) NOT NULL,
  `pa_sfoglia_volume` varchar(2) DEFAULT NULL,
  `pa_is_disponibile` varchar(2) DEFAULT NULL,
  `pa_is_prenotabile` varchar(2) DEFAULT NULL,
  `ricerca_ebook` text,
  `pa_has_software` varchar(2) DEFAULT NULL,
  `sottotitolo` varchar(243) DEFAULT NULL,
  `pa_manuale_compet_sost_anief` varchar(2) DEFAULT NULL,
  `pa_eb_eserc_sost_anief` varchar(2) DEFAULT NULL,
  `pa_in_evidenza` varchar(2) DEFAULT NULL,
  `pa_nopromo` varchar(2) DEFAULT NULL,
  `pa_coupon` varchar(2) DEFAULT NULL,
  `pa_promo20_facebook` varchar(2) DEFAULT NULL,
  `pa_is_vst_ebook` varchar(2) DEFAULT NULL,
  `pa_maestrena` varchar(2) DEFAULT NULL,
  `pa_ripamcoesione` varchar(2) DEFAULT NULL,
  `pa_agenziaentratefb` varchar(2) DEFAULT NULL,
  `pa_man40` varchar(2) DEFAULT NULL,
  `pa_specializzazionimediche` varchar(2) DEFAULT NULL,
  `pa_collanads` varchar(2) DEFAULT NULL,
  `pa_prometheus` varchar(2) DEFAULT NULL,
  `pa_ammissioni` varchar(2) DEFAULT NULL,
  `pa_feedlibrerie` varchar(2) DEFAULT NULL,
  `pa_itastranieri` varchar(2) DEFAULT NULL,
  `pa_mibact` varchar(2) DEFAULT NULL,
  `pa_formato` varchar(20) DEFAULT NULL,
  `pa_scontostanfield` varchar(2) DEFAULT NULL,
  `pa_scontovigili` varchar(2) DEFAULT NULL,
  `pa_in_ebook_search` varchar(2) DEFAULT NULL,
  `pa_has_vst_ppe_ebook` varchar(2) DEFAULT NULL,
  `pa_affiliati_infermieri` varchar(2) DEFAULT NULL,
  `pa_profsanitarielavoro` varchar(2) DEFAULT NULL,
  `pa_infante` varchar(2) DEFAULT NULL,
  `pa_omaggioebook` varchar(2) DEFAULT NULL,
  `pa_kitinfante` varchar(2) DEFAULT NULL,
  `pa_specmedichevito` varchar(2) DEFAULT NULL,
  `pa_cgiltorino` varchar(2) DEFAULT NULL,
  `pa_medprofammissioni` varchar(2) DEFAULT NULL,
  `pa_sconto_aprile_2020` varchar(2) DEFAULT NULL,
  `pa_concorsocattedra100sconto` varchar(2) DEFAULT NULL,
  `pa_verdolina` varchar(2) DEFAULT NULL,
  `pa_codiceds` varchar(2) DEFAULT NULL,
  `pa_sibioc` varchar(2) DEFAULT NULL,
  `pa_escludi_pdf_catalogo` text,
  `pa_scontodisal` varchar(2) DEFAULT NULL,
  `pa_disalsingoli` varchar(2) DEFAULT NULL,
  `pa_is_edigita_ebook` varchar(2) DEFAULT NULL,
  `pa_is_edigita_ebook_ppe` varchar(2) DEFAULT NULL,
  `pa_url_sistema_verifica` varchar(38) DEFAULT NULL,
  `id_prodotto_nuova_versione` varchar(92) DEFAULT NULL,
  `lista_sotto_img` text,
  `pa_vst_ppe_resource_id_prefix` varchar(13) DEFAULT NULL,
  `url_ebook` varchar(242) DEFAULT NULL,
  `data_disponibilita` varchar(19) DEFAULT NULL,
  `errata_corrige` text,
  `codice_prodotto` varchar(9) DEFAULT NULL,
  `vst_resource_id_vbid` varchar(14) DEFAULT NULL,
  `pa_acs_resource_id` varchar(51) DEFAULT NULL,
  `url_cartaceo` varchar(255) DEFAULT NULL,
  `pa_lingua` varchar(8) DEFAULT NULL,
  `pa_versione` varchar(30) DEFAULT NULL,
  `pa_apple_store` varchar(72) DEFAULT NULL,
  `brevi_info` varchar(207) DEFAULT NULL,
  `pa_dispositivi_supportati` varchar(107) DEFAULT NULL,
  `specifiche` text,
  `struttura` text,
  `pa_demo` varchar(59) DEFAULT NULL,
  `pa_docebo_info` varchar(175) DEFAULT NULL,
  `pa_elearning` varchar(2) DEFAULT NULL,
  `pa_docebo_course` varchar(11) DEFAULT NULL,
  `descrizione_per_widget` text,
  `country_of_manufacture` varchar(2) DEFAULT NULL,
  `tag` text,
  `pa_market_android` varchar(73) DEFAULT NULL,
  `id_riferimento_edigita` varchar(15) DEFAULT NULL,
  `pa_edigita_ppe_resource_id` varchar(13) DEFAULT NULL,
  `edizione` varchar(2) DEFAULT NULL,
  `pa_printable_book_cover_url` varchar(11) DEFAULT NULL,
  `pa_cost` varchar(100) DEFAULT NULL,
  `sottotitolo2` varchar(46) DEFAULT NULL,
  `isbn2` text,
  `numero_pagine2` text,
  `tag2` text,
  `codice_prodotto2` text,
  `ricerca_ebook2` text,
  `product_cat` varchar(161) NOT NULL,
  `product_type` varchar(8) NOT NULL,
  `product_visibility` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id_prodotto`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- INSERT INTO magento_import (magento_id, isbn)
-- SELECT entity_id, sku
-- FROM catalog_product_entity;

-- UPDATE magento_import mi
-- JOIN wpcv_postmeta wpm ON mi.isbn = wpm.meta_value AND wpm.meta_key = '_sku'
-- JOIN wpcv_posts wp ON wpm.post_id = wp.ID AND wp.post_type = 'product'
-- SET mi.id_woocommerce = wp.ID

-- UPDATE magento_import mi
-- JOIN wpcv_postmeta wpm ON mi.id_woocommerce = wpm.post_id
-- SET mi.kit = 'yes'
-- WHERE wpm.meta_key = '_custom_kit_checkbox'
-- AND wpm.meta_value = 'yes';
Senza categoria

Endpoint EdiSES Oauth2 – Area Riservata

Ambiente di test di auth:
Authorization: https://edisesauth.meetweb.dev/oauth2/authorize
Token: https://edisesauth.meetweb.dev/oauth2/token
Get User Info: https://edisesauth.meetweb.dev/oauth2/userinfo

Client ID: ediseswp_authtest_5423TEST
Client secret: WzfCt2LxqFbpkg2soEmc
Scope: openid
Authorize Endpoint: https://edisesauth.meetweb.dev/oauth2/authorize
Token Endpoint: https://edisesauth.meetweb.dev/oauth2/token
Userinfo Endpoint: https://edisesauth.meetweb.dev/oauth2/userinfo

#######################################################################
 
Gli endpoint dell’ambiente di produzione sono i seguenti:
Authorization: https://auth.edises.it//oauth2/authorize
Token: https://auth.edises.it/oauth2/token
Get User Info: https://auth.edises.it/oauth2/userinfo
 
Qui la documentazione delle specifiche oauth2 https://www.rfc-editor.org/rfc/rfc6749#section-4.

https://areariservataedises.meetweb.dev/purchases-api/doc/

secret JWT 
AJ2pwDCTSamcMR1KxfYSCYrEOXfsioCTWPZcHdzVj6l4t99R3ooOUBYjCqDzmo25T
<?php
/**
 * Plugin Name: Notifica API Area Riservata
 * Plugin URI: https://www.digitalfollowers.com
 * Description: API Notification Area Riservata.
 * Version: 1.3.1
 * Author: Staff - Digital Followers
 * Author URI: https://www.digitalfollowers.com
 */

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}

// Aggiungi il box personalizzato alla pagina dell'ordine
add_action('add_meta_boxes', 'wc_add_generate_api_meetweb');
function wc_add_generate_api_meetweb() {
    add_meta_box(
        'wc_add_generate_api',
        __('API Area Riservata', 'wc-generate-xml'),
        'wc_add_generate_api_meetweb_content',
        'shop_order',
        'side',
        'default'
    );
}

// Callback per il contenuto del box
function wc_add_generate_api_meetweb_content($post) {
    $order_id = $post->ID;
    $api_response = get_post_meta($order_id, '_api_response', true);
    $jwt_payload = get_post_meta($order_id, '_jwt_payload', true);
    ?>
    <button id="notify_api_button" class="button button-primary">Invia Notifica API</button>
    <div id="api_response"><pre><?php echo esc_html($api_response); ?></pre></div>
    <h4>Payload JWT</h4>
    <div style="width:250px;height:auto;overflow:scroll;"><pre id="jwt_payload"><?php echo esc_html($jwt_payload); ?></pre></div>
    <script type="text/javascript">
        jQuery(document).ready(function($) {
            $('#notify_api_button').click(function() {
                var orderId = '<?php echo $post->ID; ?>';
                $.ajax({
                    url: ajaxurl,
                    type: 'POST',
                    data: {
                        action: 'notify_api',
                        order_id: orderId,
                    },
                    success: function(response) {
                        $('#api_response').html('<pre>' + JSON.stringify(response, null, 2) + '</pre>');
                        $('#jwt_payload').text(response.jwt_payload);
                        location.reload(); // Ricarica la pagina per vedere i dati salvati
                    },
                    error: function(error) {
                        $('#api_response').html('<pre>' + JSON.stringify(error, null, 2) + '</pre>');
                    }
                });
            });
        });
    </script>
    <?php
}

// Gestisci la richiesta AJAX
add_action('wp_ajax_notify_api', 'notify_api_callback');
function notify_api_callback() {
    $order_id = intval($_POST['order_id']);
    $response = notify_purchase_to_external_api($order_id);
    if (!empty($response['jwt_payload'])) {
        update_post_meta($order_id, '_api_response', wp_json_encode($response));
        update_post_meta($order_id, '_jwt_payload', $response['jwt_payload']);
        error_log('Meta updated for order ' . $order_id . ': success');
        
        $order = wc_get_order($order_id);
        $note = 'API Notification Payload: ' . $response['jwt_payload'];
        $order->add_order_note($note);
    } else {
        error_log('JWT payload missing for order ' . $order_id);
    }
    echo wp_json_encode($response);
    wp_die();
}

// Funzione per notificare l'acquisto all'API esterna
function notify_purchase_to_external_api($order_id) {
    $order = wc_get_order($order_id);
    error_log('notify_purchase_to_external_api called for order ' . $order_id); // Debug log
    $products_data = [];
    
    foreach ($order->get_items() as $item_id => $item) {
        $product = $item->get_product();
        
        // Ottieni l'ID del libro Magento
        $magentoBookId = get_post_meta($product->get_id(), '_magento_id', true);
        if (!$magentoBookId) {
            $magentoBookId = $product->get_id();
        }
        
        // Ottieni enableResources
        $formato = get_post_meta($product->get_id(), 'formato', true);
        $enableResources = in_array($formato, ['eBook', 'Videocorso completo']);

        $products_data[] = [
            'magentoBookId' => $magentoBookId,
            'enableResources' => $enableResources
        ];
    }

    $payload_details = [
     //   'customerId' => (string) $order->get_user_id(), // Ensure customerId is a string
        'customerId' => "698292", // Ensure customerId is a string
        'customerEmail' => $order->get_billing_email(),
//        'customerEmail' => "fabio@digitalfollowers.com",

        'orderId' => (string) $order->get_id(), // Ensure orderId is a string
        'products' => $products_data
    ];

    $signature = 'AJ2pwDCTSamcMR1KxfYSCYrEOXfsioCTWPZcHdzVj6l4t99R3ooOUBYjCqDzmo25T';
    $jwt = generate_jwt($payload_details, $signature);

    // Esegui la chiamata all'API o log per il test
    $response = [];
    if (!is_test_mode()) {
      
     //   $api_response = wp_remote_post('https://areariservataedises.meetweb.dev/api/notify-purchased-products', [ 
     // meetweb api
        $api_response = wp_remote_post('https://www.digitalfollowers.com/api/endpoint-prodotto.php', [
            'body'    => wp_json_encode(['data' => $jwt]),
            'headers' => [
                'Content-Type' => 'application/json',
            ],
        ]);

        if (is_wp_error($api_response)) {
            $response = ['error' => $api_response->get_error_message(), 'jwt_payload' => $jwt];
        } else {
            $response_body = wp_remote_retrieve_body($api_response);
            error_log('API response body: ' . $response_body); // Log the response body for debugging
            error_log('API response code: ' . wp_remote_retrieve_response_code($api_response)); // Log the response code for debugging
            error_log('API response headers: ' . print_r(wp_remote_retrieve_headers($api_response), true)); // Log the response headers for debugging
            if (wp_remote_retrieve_response_code($api_response) == 200) {
                $response = ['message' => 'Notifica inviata con successo', 'jwt_payload' => $jwt];              
                } else {
                $response_body_decoded = json_decode($response_body, true);
                if (is_array($response_body_decoded)) {
                    $response = array_merge($response_body_decoded, ['jwt_payload' => $jwt]);
                } else {
                    $response = ['error' => 'Invalid response body: ' . $response_body, 'jwt_payload' => $jwt];
                }
            }
        }
    } else {
        // Log the payload for testing
        error_log('Test mode: Payload: ' . wp_json_encode(['data' => $jwt]));
        $response = ['message' => 'Test mode: Payload logged', 'jwt_payload' => $jwt];
    }

    // Aggiorna i metadati dell'ordine
    update_post_meta($order_id, '_api_response', $response['message']);
    update_post_meta($order_id, '_jwt_payload', $response['jwt_payload']);

    $order = wc_get_order($order_id);
    $data = date('d/m/y H:i');
    $note = 'API Notification Payload: ' . 'Data/Ora invio: '. $data .'Payload JWT: ' . $response['jwt_payload'];
    $order->add_order_note($note);
    
    error_log('Meta updated for order ' . $order_id . ': success');
    
    return $response;
}

function generate_jwt($payload, $secret) {
    $header = wp_json_encode(['typ' => 'JWT', 'alg' => 'HS512']);
    $base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header));
    $base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(wp_json_encode($payload)));
    $signature = hash_hmac('sha512', $base64UrlHeader . "." . $base64UrlPayload, $secret, true);
    $base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature));
    return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
}

function is_test_mode() {
    return false; // Set to false in production
}

// Esegui la notifica automatica quando lo stato dell'ordine viene impostato su "processing"
add_action('woocommerce_order_status_processing', 'notify_purchase_to_external_api');
?>

Senza categoria

EdiSES – Attributi Grezzi & Completi

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

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

// Esegui la query per estrarre gli attributi dei prodotti
$sql = "SELECT p.ID as id_prodotto, pm.meta_value as attributi_serializzati
FROM ed2024_posts p
JOIN ed2024_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product'
  AND pm.meta_key = '_product_attributes'";

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

// Creazione del file CSV
$csvFileName = 'attributi_grezzi.csv';
$csvFile = fopen($csvFileName, 'w');

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

// Elabora i risultati della 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']);
    foreach ($attributi as $nome_attributo => $dettagli_attributo) {
      if (!in_array($nome_attributo, $attributi_header)) {
        $attributi_header[] = $nome_attributo;
      }
      if (isset($dettagli_attributo['value'])) {
        $attributi_row[$nome_attributo] = $dettagli_attributo['value'];
      } elseif (isset($dettagli_attributo['name'])) {
        $attributi_row[$nome_attributo] = $dettagli_attributo['name'];
      }
    }
    $attributi_rows[] = $attributi_row;
  }
} else {
  echo "Nessun risultato trovato";
}

// Scrivi l'intestazione nel file CSV
fputcsv($csvFile, $attributi_header);

// Scrivi i valori degli attributi nel file CSV
foreach ($attributi_rows as $attributi_row) {
  $csvRow = array();
  foreach ($attributi_header as $header) {
    $csvRow[] = isset($attributi_row[$header]) ? $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;
?>

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

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

// Prima query per estrarre gli attributi dei prodotti
$sql = "SELECT p.ID as id_prodotto, pm.meta_value as attributi_serializzati
        FROM ed2024_posts p
        JOIN ed2024_postmeta pm ON p.ID = pm.post_id
        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');
$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']);
        foreach ($attributi as $nome_attributo => $dettagli_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
         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);
        }

        // 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 = 'attributi_completi.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;
?>
Senza categoria

UBUNTU 23.10 CONFIG MySQL/MariaDB

sudo apt update

sudo apt install mysql-server
sudo apt install mariadb-server

sudo mysql_secure_installation

sudo systemctl status mysql
sudo systemctl stop mysql / sudo systemctl restart mysql

sudo mysql -u root -p
CREATE USER 'fabio'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'fabio'@'%';
FLUSH PRIVILEGES;

[Permettere connessioni da esterno]

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0

sudo apt install nautilus-share
nautilus -q

sudo gpasswd --add $USER sambashare

sudo smbpasswd -a $USER

[riavvia il server per rendere effettive le modifiche]
[cambio user]

sed -i 's/edises-mage-usr/fabio/g' edises-backup-completo.sql
oppure
sed -i 's/edises-mage-usr/username-db-produzione/g' edises-backup-completo.sql

sed -i 's/DEFINER=`fabio`@`%`/DEFINER=`dsiqifol_magento`@`%`/g' edises-backup-completo.sql 

[controllo utente]
grep -o '/*!50017 DEFINER=`dsiqipof_magento`@`%`*/' dump_database_mariadb.sql | wc -l
[gxibghvy_mg2 o username db produzione]
grep -o 'DEFINER=`
dsiqipof_magento`@`%`' dump_database_mariadb.sql | wc -l

va eliminato /*!50017 DEFINER=`dsiqipof_magento`@`%`*/


[ripristino backup corrotto direttamente saltando errori]
mysql -u fabio -p -f -D nome-database < /home/fabio/Scrivania/DB/edises-backup-originale.sql 2> /home/fabio/Scrivania/log_import.txt

[export backup]

esporta con Antares SQL e importa con lo stesso software

[oppure]

mariadb-dump -u fabio -p --default-character-set=utf8mb4 --skip-set-charset --add-drop-database mag2 > /home/fabio/Scrivania/DB/dump_database_mariadb2.sql 2> /home/fabio/Scrivania/DB/error.log

import con MySQL Workbench

sed -i 's/DEFINER=`fabio`@`%`/DEFINER=`dsiqipof`@`localhost`/g' edises-backup-completo.sql