
WordPress è una delle piattaforme più versatili per la creazione di siti web, e la gestione dei contenuti multilingue è fondamentale per raggiungere un pubblico globale. Tuttavia, molti sviluppatori preferiscono evitare plugin pesanti come WPML, che, sebbene molto popolari, possono risultare ingombranti e difficili da personalizzare. In questa guida, esploreremo come creare un plugin per WordPress multilingue personalizzato che sia più leggero, ottimizzato e facilmente adattabile alle esigenze specifiche di qualsiasi progetto.
Un plugin personalizzato offre maggiore controllo sui dati, risparmiando risorse, migliorando le prestazioni ed evitando potenziali conflitti con altri plugin. Inoltre, la personalizzazione permette di adattare la soluzione alle esigenze specifiche del progetto, garantendo flessibilità e scalabilità.
Creazione della Struttura di Base del Plugin
Per iniziare, è necessario impostare correttamente la struttura di base del plugin. Ogni plugin WordPress ha un file principale, solitamente denominato come il nome del plugin stesso (ad esempio, multi-language.php
). Questo file contiene informazioni di base sul plugin e registra le azioni necessarie affinché WordPress riconosca e gestisca il plugin.
Ecco un esempio di come potrebbe apparire l'intestazione del plugin:
<?php
/**
* Plugin Name: Multi-Language
* Plugin URI: http://example.com/multi-language
* Description: Un plugin per gestire i contenuti multilingue in WordPress senza
WPML.
* Version: 1.0
* Author: Il Tuo Nome
* Author URI: http://example.com
* License: GPL2
*/
Successivamente, registriamo le hook necessarie per il plugin, come ad esempio per caricare i file di traduzione o inizializzare le funzionalità del plugin:
// Azione per inizializzare il plugin
add_action( 'init', 'multi_language_init' );
function multi_language_init() {
load_plugin_textdomain( 'multi-language', false, basename( dirname( __FILE__
) ) . '/languages' );
}
Gestione della Localizzazione delle Stringhe
Uno dei primi compiti quando si sviluppa un plugin multilingue è la gestione della localizzazione delle stringhe. In WordPress, le stringhe di testo possono essere tradotte in altre lingue utilizzando il sistema di internazionalizzazione (i18n). La funzione __()
viene utilizzata per segnare le stringhe da tradurre, e load_plugin_textdomain()
carica i file di traduzione.
Per gestire le traduzioni, è necessario creare un file .pot
(Portable Object Template) che contenga tutte le stringhe di testo da tradurre. WordPress utilizza i file .po
(Portable Object) per memorizzare le traduzioni e i file .mo
(Machine Object) per caricare le traduzioni nella lingua corretta.
Ecco un esempio di come tradurre una stringa nel plugin:
echo __( 'Ciao, benvenuto nel nostro sito!', 'multi-language' );
Una volta generato il file .pot
, puoi utilizzare strumenti come Poedit per creare i file .po
per ogni lingua che desideri supportare.
Creazione di un Sistema di Gestione delle Lingue
Per un plugin multilingue personalizzato, è necessario creare un sistema di gestione delle lingue. WordPress, di default, consente di passare da una lingua all'altra tramite il menu delle impostazioni, ma quando costruisci un plugin, potresti voler dare maggiore controllo sulle lingue disponibili e su come i contenuti vengono visualizzati.
Inizia definendo le lingue supportate dal sito. Puoi farlo creando un elenco delle lingue disponibili e memorizzarlo nelle impostazioni del plugin. Un semplice array nel tuo plugin potrebbe apparire così:
$lingue = array(
'it' => 'Italiano',
'en' => 'English',
'fr' => 'Français',
'de' => 'Deutsch'
);
Successivamente, dovrai fornire un'interfaccia per consentire all'utente di selezionare la lingua preferita. Puoi usare una pagina delle impostazioni, un widget o anche un menu personalizzato per consentire agli utenti di scegliere la lingua. Ecco un esempio di uno switcher di lingua di base:
function multi_language_switcher() {
global $lingue;
echo '<select onchange="window.location.href=this.value">';
foreach ($lingue as $codice => $nome) {
echo '<option value="?lang=' . $codice . '">' . $nome . '</option>';
}
echo '</select>';
}
Questo switcher può essere aggiunto al tuo tema o plugin, consentendo agli utenti di selezionare la loro lingua da un menu a tendina.
Associare i Contenuti alle Lingue
Uno degli aspetti più importanti di un plugin multilingue è associare i contenuti alla lingua corretta. Per fare questo, dobbiamo modificare la struttura predefinita dei post e delle pagine per permettere a WordPress di riconoscere e memorizzare la lingua per ogni contenuto.
Puoi memorizzare la lingua come metadato del post. Quando crei o aggiorni un post, gli assegnerai una lingua. Ad esempio, puoi usare update_post_meta()
per memorizzare il codice della lingua:
update_post_meta( $post_id, 'language_code', 'it' ); // Memorizza l'italiano per
un post
Successivamente, puoi fare query sui post in base al codice della lingua:
$lingua = get_query_var( 'lang' ); // Recupera la lingua dall'URL o dalle
impostazioni
$post = get_posts( array(
'meta_key' => 'language_code',
'meta_value' => $lingua
) );
Questo garantisce che ogni contenuto sia associato a una lingua specifica e possa essere recuperato di conseguenza.
Aggiungere la Lingua nella Lista dei Post in Admin
Per visualizzare la lingua di un post direttamente nella lista dei post, è necessario aggiungere una colonna personalizzata nella schermata di gestione dei post. In questa colonna, possiamo visualizzare un'icona o una bandierina per ogni lingua associata al post.
Per aggiungere una colonna personalizzata per la lingua dei post nel backend di WordPress, puoi utilizzare l'hook manage_posts_columns
per aggiungere una nuova colonna nella lista dei post e l'hook manage_posts_custom_column
per visualizzare la lingua del post.
// Aggiungi una colonna per la lingua
add_filter( 'manage_posts_columns', 'multi_language_add_language_column' );
function multi_language_add_language_column( $columns ) {
$columns['language'] = __( 'Lingua', 'multi-language' ); // Nome della
colonna
return $columns;
}
// Visualizza la lingua del post
add_action( 'manage_posts_custom_column', 'multi_language_show_language_column',
10, 2 );
function multi_language_show_language_column( $column_name, $post_id ) {
if ( 'language' === $column_name ) {
$language_code = get_post_meta( $post_id, 'language_code', true ); //
Recupera la lingua dal metadato
$flag_url = get_flag_url( $language_code ); // Funzione per ottenere
l'URL della bandiera
// Visualizza l'icona della bandiera (o testo se la bandiera non è
disponibile)
if ( $flag_url ) {
echo '<img src="' . esc_url( $flag_url ) . '" alt="' . esc_attr(
$language_code ) . '" style="width: 20px; height: auto;" />';
} else {
echo strtoupper( $language_code ); // Mostra il codice della lingua
se la bandiera non è disponibile
}
}
}
// Funzione per ottenere l'URL della bandiera in base al codice della lingua
function get_flag_url( $language_code ) {
$flags = array(
'it' => 'http://example.com/flags/italy.png',
'en' => 'http://example.com/flags/uk.png',
'fr' => 'http://example.com/flags/france.png',
// Aggiungi altre lingue e bandiere come necessario
);
return isset( $flags[$language_code] ) ? $flags[$language_code] : '';
}
In questo esempio, aggiungiamo una colonna chiamata "Lingua" che mostra una bandiera corrispondente alla lingua del post. Puoi personalizzare il codice per aggiungere altre lingue e bandiere.
Gestire la Lingua nel Dettaglio del Post
Nel dettaglio del post, permettiamo all'utente di selezionare e modificare la lingua del post. Puoi aggiungere una meta box personalizzata che consenta agli amministratori di selezionare la lingua del contenuto.
Per aggiungere una meta box per la lingua nel dettaglio del post, puoi usare il codice seguente:
// Aggiungi una meta box per la lingua del post
add_action( 'add_meta_boxes', 'multi_language_add_language_meta_box' );
function multi_language_add_language_meta_box() {
add_meta_box(
'language_meta_box', // ID della meta box
__( 'Lingua del Contenuto', 'multi-language' ), // Titolo della meta
box
'multi_language_language_meta_box', // Funzione di callback
'post', // Tipo di contenuto (in questo caso,
post)
'side', // Posizione (side = sidebar)
'high' // Priorità
);
}
// Funzione di callback per la meta box
function multi_language_language_meta_box( $post ) {
// Recupera la lingua del post
$current_language = get_post_meta( $post->ID, 'language_code', true );
// Aggiungi un campo per la selezione della lingua
$languages = array(
'it' => 'Italiano',
'en' => 'English',
'fr' => 'Français',
'de' => 'Deutsch',
);
echo '<select name="language_code" id="language_code">';
foreach ( $languages as $code => $name ) {
$selected = ( $current_language === $code ) ? 'selected' : '';
echo '<option value="' . esc_attr( $code ) . '" ' . $selected . '>' .
esc_html( $name ) . '</option>';
}
echo '</select>';
}
// Salva la lingua quando il post viene salvato
add_action( 'save_post', 'multi_language_save_language_meta' );
function multi_language_save_language_meta( $post_id ) {
if ( isset( $_POST['language_code'] ) ) {
update_post_meta( $post_id, 'language_code', sanitize_text_field(
$_POST['language_code'] ) );
}
}
In questo caso, abbiamo aggiunto una meta box nella barra laterale del dettaglio del post, che consente di selezionare la lingua del contenuto. Quando l'utente salva il post, la lingua viene salvata come metadato del post.
Visualizzare e Modificare la Versione Lingua
Una volta che i post sono recuperati in base alla lingua, puoi implementare una logica che permette di visualizzare i contenuti tradotti (o ancora da tradurre) direttamente dal dettaglio del post. Ad esempio, puoi aggiungere un link che permetta di passare facilmente tra le versioni linguistiche di un post.
add_action( 'post_submitbox_misc_actions',
'multi_language_add_language_switcher' );
function multi_language_add_language_switcher() {
global $post;
$languages = array( 'it', 'en', 'fr', 'de' ); // Le lingue disponibili
$current_language = get_post_meta( $post->ID, 'language_code', true );
echo '<div class="misc-pub-section">';
echo '<label>' . __( 'Lingue disponibili', 'multi-language' ) .
':</label><br>';
foreach ( $languages as $lang ) {
if ( $lang !== $current_language ) {
$post_url = get_edit_post_link( $post->ID ) . '?lang=' . $lang; //
Modifica il link per la lingua
echo '<a href="' . esc_url( $post_url ) . '">' . strtoupper( $lang )
. '</a> ';
}
}
echo '</div>';
}
Questa funzione aggiunge una sezione alla sidebar del post, mostrando i collegamenti per passare facilmente alla versione linguistica diversa del post (ad esempio, se il post è in italiano, verranno mostrati i collegamenti per la versione inglese, francese e tedesca).
Gestione delle Traduzioni dei Contenuti (Manuali o Automatizzate)
Una volta impostate le lingue, il passo successivo è gestire le traduzioni per post, pagine e altri tipi di contenuti. Ci sono due approcci principali: traduzioni manuali e traduzioni automatizzate.
Per le traduzioni manuali, puoi creare campi personalizzati o post separati per ciascuna versione linguistica di un contenuto. Ecco un esempio di come gestire le traduzioni manuali utilizzando campi personalizzati:
add_action( 'save_post', 'save_translated_content' );
function save_translated_content( $post_id ) {
if ( isset( $_POST['translated_content'] ) ) {
update_post_meta( $post_id, 'translated_content',
$_POST['translated_content'] );
}
}
Per le traduzioni automatizzate, puoi integrare API come Google Translate o DeepL. Ecco un esempio di come integrare Google Translate:
function translate_content( $content, $target_language ) {
$api_url = 'https://translation.googleapis.com/language/translate/v2';
$response = wp_remote_post( $api_url, array(
'body' => json_encode( array(
'q' => $content,
'target' => $target_language
) ),
'headers' => array( 'Content-Type' => 'application/json' )
) );
$translated_content = json_decode( wp_remote_retrieve_body( $response ) );
return $translated_content->data->translations[0]->translatedText;
}
Esistono alternative che sfruttano l'intelligenza artificiale per fornire traduzioni più fluide, naturali e contestualizzate. In particolare, l'utilizzo di modelli basati su intelligenza artificiale, come GPT o Mistral, offre vantaggi significativi, soprattutto quando si cerca una traduzione che non si limiti alla mera sostituzione di parole, ma che preservi anche il significato e il tono del testo originale.
L'uso di modelli seq2seq (sequence-to-sequence), che utilizzano tecnologie come i transformers e i mechanisms di attenzione, può garantire traduzioni più accurate. Modelli come GPT e Mistral sono ottimizzati per gestire il linguaggio in modo più sofisticato rispetto ai traduttori tradizionali. Integrando queste soluzioni nel plugin, è possibile ottenere traduzioni che rispettano meglio il contesto del contenuto e ne preservano la fluidità.
Per implementare una traduzione con modelli AI come GPT o Mistral, il plugin può fare una richiesta all'API del modello, inviando il testo da tradurre insieme alle lingue di origine e destinazione. Ad esempio, il plugin potrebbe utilizzare l'API di OpenAI (per GPT) o soluzioni simili per generare traduzioni in modo automatico.
Un altro vantaggio di utilizzare soluzioni basate su intelligenza artificiale è la possibilità di personalizzare i modelli in base al tipo di contenuto, permettendo traduzioni più accurate a seconda del dominio specifico del sito.
Per chi preferisce una soluzione locale, Argos Translate è un'opzione interessante. Si tratta di uno strumento open-source che consente di effettuare traduzioni senza dover dipendere da API esterne. Argos Translate è costruito su OpenNMT, un modello di traduzione neurale avanzato, che può essere eseguito localmente sul server. Questa soluzione permette di tradurre contenuti in modo autonomo, senza costi per le API esterne, e con un maggior controllo sui dati.
Se il sito web ha molte lingue e contenuti da tradurre, utilizzare una soluzione come Argos Translate può risultare più conveniente nel lungo periodo, soprattutto per i siti con un traffico elevato che necessitano di traduzioni frequenti e rapide.
Gestire la Selezione della Lingua sul Frontend
Per offrire agli utenti un'esperienza fluida, è necessario consentire loro di selezionare la lingua preferita. Ci sono vari modi per farlo, come attraverso un widget per il cambio lingua, un menu a tendina nell'intestazione o un menu personalizzato.
Ecco un esempio di uno switcher di lingua nella parte superiore del sito:
function display_language_switcher() {
global $lingue;
echo '<div class="language-switcher">';
foreach ($lingue as $codice => $nome) {
echo '<a href="?lang=' . $codice . '">' . $nome . '</a> ';
}
echo '</div>';
}
Questo consente agli utenti di cambiare lingua direttamente dal frontend del sito.
Considerazioni SEO per i Siti Multilingue
Quando si costruisce un plugin multilingue, la SEO è un aspetto importante da considerare. Google e gli altri motori di ricerca utilizzano l'attributo hreflang per capire la relazione tra le diverse versioni linguistiche di una pagina.
Per ogni versione linguistica di una pagina, puoi aggiungere il seguente tag meta nella sezione <head>
del tema:
<link rel="alternate" hreflang="it" href="http://example.com/it/" />
<link rel="alternate" hreflang="en" href="http://example.com/en/" />
Questo indica ai motori di ricerca che la pagina ha versioni in lingue diverse, migliorando la SEO e l'esperienza dell'utente.
Test e Debug del Plugin Multilingue
Dopo aver sviluppato il tuo plugin multilingue personalizzato, è essenziale testarlo accuratamente. Ecco alcune cose da testare:
- Cambio del Contenuto: Verifica che il contenuto corretto venga visualizzato per ogni lingua.
- Tag SEO: Assicurati che gli attributi
hreflang
e le altre etichette di lingua siano corretti. - Gestione delle Traduzioni: Testa sia le traduzioni manuali che quelle automatizzate per garantire che funzionino correttamente.
Utilizzare strumenti di debug come Query Monitor può aiutarti a identificare eventuali problemi con le query al database o conflitti con altri plugin.
Conclusioni
Creare un plugin multilingue personalizzato in WordPress offre il controllo completo sui contenuti e sulle prestazioni del sito. Con questa guida, dovresti essere in grado di sviluppare una soluzione multilingue robusta, adatta alle tue esigenze, che gestisca tutto, dalla localizzazione dei contenuti alla selezione della lingua sul frontend. La flessibilità di un plugin personalizzato ti permette di gestire le traduzioni nel modo che meglio si adatta al tuo progetto, mantenendo ottimizzazione e prestazioni SEO.