Migraciones en WordPress

Reemplazar cadenas de texto codificadas en base 64 dentro de la BBDD de WordPress

Subscribe
Voiced by Amazon Polly

¿Cómo lleváis el verano? Espero que muy bien y que aprovechéis para descansar y cargar pilas. Yo aquí ando, de migraciones , de un sitio para otro 😀 Siempre aprendo algo nuevo con cada una de ellas solucionando pequeños problemillas.

En la MegaMeetUp de Amurrio hablé sobre el maravilloso plugin Duplicator y lo bien que funcionaba para cambiar las URLs antiguas por las nuevas.

Justo hoy me ha surgido un contratiempo con Duplicator bastante gordo, después de migrar un sitio hecho con Visual Composer detecté que los elementos que se habían creado con «»HTML puro» estaban codificados en base 64, y mucho peor aún, tenía enlaces que apuntaban a la antigua URL, una verdadera pesadilla.

Decodificar para modificar y volver a codificar

Sólo había 2 alternativas, ir a mano enlace por enlace sustituyéndolo (algo totalmente inviable) o prepararte un script que hiciera el trabajo de decodificar las cadenas en la BBDD, hacer un replace y volver a codificar. Obviamente hice la segunda opción. Después de hacer una profunda búsqueda en Github, me encontré con un script bastante parecido al que yo necesitaba, simplemente tenía que hacer unos cambios, en mi caso necesitaba modificar la columna post_content de la tabla posts

function replace_composer_html_raw_base64(){

    if($_SERVER['REQUEST_URI'] == '/replace_composer_html_raw_base64'){
        global $wpdb;
        
        ini_set('error_reporting', E_ALL);
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);

        $response = $wpdb->get_results('SELECT ID,post_content FROM wp_posts WHERE post_type="page"',ARRAY_A);
        $count = count($response);
//Importante la variable tag, en mi caso cómo es un elemento HTML de visual composer es vc_raw_html.
        $tag = 'vc_raw_html';
        $pattern = '\['.$tag.'].*?\]';

        foreach ($response as $post){

            $matches = '';
            preg_match_all('/' . $pattern . '/s', $post['post_content'], $matches);
            $content = replacedComposerHtmlRawString($matches[0],$tag);

            if(!$content &amp;&amp; count($content)<1){
                continue;
            }

            foreach ($content as $key=>$item){
                $post['post_content'] = str_replace($item['original'],$item['modified'],$post['post_content']);
            }

            //$post['post_content'] = replacedComposerRawFromTo();

            $upd = array(// Actualizamos el post en la BBDD
                'ID'           => $post['ID'],
                'post_content' => $post['post_content'],
            );
            wp_update_post( $upd );
        }

        die('If no errors, all successful! =)  ');
    }
}

function replacedComposerHtmlRawString($strings,$tag){
    
    if(!is_array($strings)){
        return false;
    }
    
    $return=array();
    foreach ($strings as $key=>$string){
        $return[$key]['original']= $string;
        $string = str_replace('['.$tag.']','',$string);
        $string = str_replace('[/'.$tag.']','',$string);
        $string = base64_decode($string);
        $string = rawurldecode($string);//Si algo no funciona trata de cambiar rawurlencode po urlencode, etc... =)


        $string = replacedComposerRawFromTo($string);

        
        $string = rawurlencode($string);
        $string = base64_encode($string);
        $string = '['.$tag.']'.$string.'[/'.$tag.']';
        $return[$key]['modified'] = $string;
    }

    return $return;
}

function replacedComposerRawFromTo($string,$fromTo=false){

    $fromTo=array(
    //Datos de ejemplo, poned los vuestros!!!!
        'urlantigua'=>'urlnueva',

    );

    foreach ($fromTo as $from=>$to){
        $string = str_replace($from,$to,$string);
    }

    return $string;
}

add_action('init', 'replace_composer_html_raw_base64');

Donde pone ‘url_antigua’ lo sustituís por vuestra dirección antigua y en ‘urlnueva’ por la nueva que queréis sustituir. Ponéis el script en vuestro functions.php del tema hijo, lo guardáis y abrís el navegador escribiendo vuestrodominio/replace_composer_html_raw_base64 Y se ejecuta el script haciendo todo el trabajo por nosotros. ¿A que es alucinante?

¡Haced una copia de seguridad de la BBDD antes por favor!

Y no os olvidéis de quitar el script una vez lo hayáis usado (evitad el síndrome de diógenes).

Contadme, ¿alguna vez habéis tenido algún marrón cómo estos?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información sobre protección de datos

  • Responsable: Laura Díaz
  • Fin del tratamiento: Controlar el spam, gestión de comentarios
  • Legitimación: Tu consentimiento
  • Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  • Derechos: Acceso, rectificación, portabilidad, olvido.
  • Contacto: laura.bobysuh@gmail.com.
  • Información adicional: Más información en nuestra política de privacidad.