Skip to content

Questa guida è pensata per sviluppatori e designer che lavorano con temi WordPress e hanno bisogno di confrontare due versioni di un tema per identificare rapidamente le differenze tra di esse.

In realtà lo script che troverai è in grado di confrontare due cartelle o due file zip a prescindere dal fatto che siano temi per WordPress, Drupal, Prestashop o qualsiasi altri CMS.

Il confronto può essere utile in diversi scenari:

  • Aggiornamenti del Tema: Quando si aggiorna un tema alla nuova versione e si desidera vedere quali file sono stati aggiunti, rimossi o modificati e quali righe sono cambiate.
  • Debugging: Per trovare differenze nel codice che possono causare bug o problemi tra due versioni del tema.
  • Collaborazione: Quando si lavora in un team e si vuole vedere cosa è stato modificato da un collaboratore.
  • Ottimizzazione: Per identificare modifiche che possono influire sulle prestazioni o sulla sicurezza del sito.

In questa guida, utilizzeremo uno script Python che può essere eseguito sia in locale (utilizzando ad esempio Visual Studio Code) sia su Google Colab. Lo script analizzerà i file dei temi, confrontando ogni singolo file e generando un report dettagliato che evidenzia le differenze.

Requisiti

Prima di iniziare, assicurati di avere:

  • Python installato sulla tua macchina.
  • Le librerie Python standard zipfile, difflib, os e pathlib, che sono già incluse nella distribuzione standard di Python.
  • Un ambiente di sviluppo come Visual Studio Code o un account Google Colab se preferisci eseguire lo script online.

Struttura delle Cartelle

Crea una cartella di lavoro con la seguente struttura:

<directory_principale>/
│
├── script.py
└── input/
    ├── tema1.zip (o cartella tema1)
    └── tema2.zip (o cartella tema2)
  • /: La directory principale dove salverai lo script Python (script.py).
  • script.py: Lo script Python che eseguirà il confronto dei temi.
  • input/: Una cartella che contiene i due temi da confrontare. I temi possono essere in formato ZIP o come cartelle estratte.

Output

  • Lo script genererà un file di report il cui nome includerà i nomi dei due temi confrontati e la data e l’ora corrente (ad esempio, report_tema1_vs_tema2_20240528_1530.txt).
  • Il report sarà salvato nella directory principale e includerà:
    • File mancanti: Elenco dei file presenti in un tema ma mancanti nell’altro.
    • File aggiunti: Elenco dei file presenti in un tema ma aggiunti rispetto all’altro.
    • File modificati: Elenco dei file modificati con un confronto dettagliato delle differenze riga per riga.

Spiegazione del Report

Il report generato include una sezione che spiega il formato delle differenze utilizzato (unified diff), che è standard per i confronti di file:

  • @@ -a,b +c,d @@: Indica un blocco di differenze dove:
    • a e b sono il numero di riga iniziale e il numero di righe nel file originale.
    • c e d sono il numero di riga iniziale e il numero di righe nel file modificato.
  • -: Le righe rimosse dal file originale.
  • +: Le righe aggiunte nel file modificato.

Esempio di Output

Il file di report sarà strutturato come segue:

Formato delle differenze:
@@ -a,b +c,d @@
a: Numero di riga iniziale nel file originale
b: Numero di righe del blocco nel file originale
c: Numero di riga iniziale nel file modificato
d: Numero di righe del blocco nel file modificato
-: Righe rimosse dal file originale
+: Righe aggiunte al file modificato

File mancanti in tema2:
file1.php
file2.css

File aggiunti in tema2:
file3.js
file4.html

File modificato: style.css
--- tema1/style.css
+++ tema2/style.css
@@ -15,7 +15,7 @@
- old line 15
+ new line 15
  unchanged line 16
  unchanged line 17
  unchanged line 18
@@ -25,4 +25,4 @@
- old line 25
+ new line 25

Codice completo

import os
import zipfile
import difflib
from pathlib import Path
from datetime import datetime

def extract_zip_files(input_folder):
    for item in os.listdir(input_folder):
        item_path = os.path.join(input_folder, item)
        if zipfile.is_zipfile(item_path):
            with zipfile.ZipFile(item_path, 'r') as zip_ref:
                extract_path = os.path.join(input_folder, os.path.splitext(item)[0])
                zip_ref.extractall(extract_path)

def get_all_files(folder):
    file_list = []
    for root, _, files in os.walk(folder):
        for file in files:
            file_list.append(os.path.relpath(os.path.join(root, file), folder))
    return set(file_list)

def compare_files(file1, file2):
    with open(file1, 'r', encoding='utf-8', errors='ignore') as f1:
        f1_lines = f1.readlines()
    with open(file2, 'r', encoding='utf-8', errors='ignore') as f2:
        f2_lines = f2.readlines()

    diff = difflib.unified_diff(f1_lines, f2_lines, fromfile=file1, tofile=file2, lineterm='')
    return [line for line in diff if line.startswith(('---', '+++', '@@', '-', '+'))]

def generate_report(theme1, theme2):
    theme1_files = get_all_files(theme1)
    theme2_files = get_all_files(theme2)

    missing_files = theme1_files - theme2_files
    added_files = theme2_files - theme1_files
    common_files = theme1_files & theme2_files

    report = []
    report.append("Formato delle differenze:\n"
                  "@@ -a,b +c,d @@\n"
                  "a: Numero di riga iniziale nel file originale\n"
                  "b: Numero di righe del blocco nel file originale\n"
                  "c: Numero di riga iniziale nel file modificato\n"
                  "d: Numero di righe del blocco nel file modificato\n"
                  "-: Righe rimosse dal file originale\n"
                  "+: Righe aggiunte al file modificato\n")

    if missing_files:
        report.append(f"File mancanti in {os.path.basename(theme2)}:\n" + "\n".join(missing_files) + "\n")
    if added_files:
        report.append(f"File aggiunti in {os.path.basename(theme2)}:\n" + "\n".join(added_files) + "\n")

    modified_files = []
    for file in common_files:
        file1_path = os.path.join(theme1, file)
        file2_path = os.path.join(theme2, file)

        if not Path(file1_path).read_text(errors='ignore') == Path(file2_path).read_text(errors='ignore'):
            diff = compare_files(file1_path, file2_path)
            if diff:
                modified_files.append(file)
                report.append(f"File modificato: {file}\n" + "\n".join(diff) + "\n")

    return "\n\n".join(report), modified_files

def main():
    input_folder = "input"
    extract_zip_files(input_folder)

    themes = [os.path.join(input_folder, d) for d in os.listdir(input_folder) if os.path.isdir(os.path.join(input_folder, d))]

    if len(themes) != 2:
        raise ValueError("Devono esserci esattamente 2 temi da confrontare.")

    theme1, theme2 = themes
    report, modified_files = generate_report(theme1, theme2)

    theme1_name = os.path.basename(theme1)
    theme2_name = os.path.basename(theme2)
    current_time = datetime.now().strftime("%Y%m%d_%H%M")
    report_filename = f"report_{theme1_name}_vs_{theme2_name}_{current_time}.txt"

    with open(report_filename, 'w', encoding='utf-8') as report_file:
        report_file.write(report)

    print(f"Report generato: {report_filename}")
    if modified_files:
        print("File modificati:\n" + "\n".join(modified_files))
    else:
        print("Nessun file modificato.")

if __name__ == "__main__":
    main()

Conclusione

Seguendo questa guida, sarai in grado di confrontare facilmente due temi WordPress e generare un report dettagliato delle differenze. Questo strumento può aiutarti a identificare rapidamente le modifiche tra le diverse versioni dei temi e a comprendere meglio le variazioni nei file, semplificando il processo di sviluppo e manutenzione del tuo sito WordPress.

Articoli correlati

Autore

Commenti |2

Lascia un commento Lascia un commento
  1. Stefano 2 commenti

    Ma quanto sei bravo! Ogni volta che ricevo la tua newsletter trovo sempre qualcosa di super interessante. Non vedo l’ora di metterlo in pratica :-)

    1. Giovanni Sacheli 760 risposte

      Grazie mille Stefano :) apprezzo molto!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ultimi articoli aggiornati

Richiedi un preventivo SEO e Google Ads

Porta il tuo sito web al livello successivo con l’esperienza di EVE Milano. La nostra agenzia di Search Marketing ha ricevuto oltre 1172 richieste di preventivo, un segnale chiaro della fiducia che imprenditori e manager, come te, ripongono nella nostra specializzazione tecnica e verticale nella SEO e PPC. Se la tua organizzazione cerca competenze specifiche per emergere nei risultati di Google, noi siamo pronti a fornire quel valore aggiunto. Richiedi un preventivo ora e scopri la differenza tra noi e gli altri.
Richiedi un preventivo

Vuoi ricevere un avviso al mese con le nuove guide pubblicate?

Iscriviti alla newsletter!

Informativa sui cookies

Noi e terze parti selezionate utilizziamo cookie o tecnologie simili per finalità tecniche e, con il tuo consenso, anche per le finalità di esperienza e misurazione come specificato nella cookie policy. Puoi liberamente prestare, rifiutare o revocare il tuo consenso, in qualsiasi momento, accedendo al pannello delle preferenze. Il rifiuto del consenso può rendere non disponibili le relative funzioni. Usa il pulsante “Accetta” per acconsentire. Usa il pulsante “Rifiuta” per continuare senza accettare.