Polylang è il plugin che uso sempre quando devo offrire la traduzione per un sito web fatto in WordPress o WooCommerce.
L’altro giorno ho avuto un problema con un cliente, che aveva un database datato, una installazione fatta male e tabelle del DB sparse ovunque. Utilizzava il famoso plugin WPML che molti ritengono affidabile e prestazionale, in realtà, Polylang è superiore ma poco usato.
Personalmente ritenfo Polyang molto buono, con poche opzioni e facile da utilizzare e sopratutto non mi ha mai dato problemi!
Import da XML
Ho dovuto importare tutti gli articoli via XML con la procedura standard di WP per non riavere lo stesso database corrotto.
Quindi ho tutti gli articoli del vecchio sito su quello nuovo, ma il problema è che questi articoli (con lo stesso ID del precedente sito) non sono collegati tra loro con le traduzioni.
Errore 500
Veniamo a noi, il problema è che il cliente ha 9.000 articoli, ma nemmeno il plugin WPML to Polylang riusciva ad associare le traduzioni di ogni post fatto con WPML, quindi il server, nonostante il memory_limit aumentanto a dismisura, non riusciva ad elaborare la richiesta.
Per questo ho fatto le cose a mano.
Polylang salva tutto nelle tabelle esistenti di WordPress, mentre WPML usa delle tabelle personalizzate, (tipo 10 almeno 🤣).
Ho deciso quindi di trovare la relazione che collega ogni post in italiano, alla rispettiva lingua.
Codice PHP
La prima cosa da fare è indivisuare la tabella di WPML, di solito ha la nomenclatura “_icl_translations“.
Dentro a questa tabella troverete le varie colonne con i relativi dati. A questo punto andiamo a creare la funzione che prende i dati direttamente dal DB.
Andremo ad elaborare i vari array ed andiamo a creare la funzione finale, sempre facendo combaciare i dati corretti ed importante, eseguire questa funzione solo 1 volta.
Il codice/funzione da inserire è nel vostro file è la seguente:
fucntion wpml_to_polylang_500_fix() { // nome della tabella che contiene le relazioni tra i posts $tabella_icl_translations = 'wp_icl_translations'; // prendo i valori che mi interessano dal DB $relazioni = $wpdb->get_results(" SELECT language_code, element_id, trid FROM {$tabella_icl_translations} WHERE element_type = 'post_post' "); // Preparo l'array associativo $manipolazione_ids = []; foreach ($relazioni as $relazione) { $manipolazione_ids[$relazione->trid][] = [ 'post_lang' => $relazione->language_code, 'post_id' => $relazione->element_id ]; } // Riformulo l'array ed eseguo la funzione di Polylang per ogni post ID foreach ($manipolazione_ids as $key => $value) { $nuovo_array = []; foreach ($value as $item) { if ( ! is_null($item['post_id']) ) { $nuovo_array[$item['post_lang']] = $item['post_id']; } } pll_save_post_translations( $nuovo_array ); } } add_action( 'evento_wpml_to_polylang_one_time','wpml_to_polylang_500_fix' );
Ora, dobbiamo richiamarla solo 1 volta, affinché venga eseguita.
Useremo la funzione che offre Polylang, ovvero pll_save_post_translations
Non sono stato a creare un ciclo spezzettando l’array e creando un loop, in quanto 9.000 articoli vengono convertiti senza problemi in circa 60 secondi di operazione, basta solo attendere!
Per eseguire la funzione 1 sola volta ci basta inserire questo codice e dopo almeno 60 secondi il sistema la eseguirà. Attendete con pazienza che il server elabori la richiesta e avrete finito!
wp_schedule_single_event( time() + 60, 'evento_wpml_to_polylang_one_time' );
Gli stiamo dicendo di eseguire la funzione tra 60 secondi a partire da adesso.
Ora avrete i vostri articoli, ex WPML, collegati a quelli tradotti di WPML con Polylang!