Cambio de URL en el bloque html sin formato del compositor visual

7 minutos de lectura

Visual Composer guarda el bloque HTML sin procesar como una cadena codificada en base64 (y codificada en URL) en la base de datos. Mi sitio necesita pasar de http a https, y necesitaría cambiar las URL de los activos que se usan en estos bloques HTML sin procesar para que se sirvan con https. Claramente, la herramienta de búsqueda/reemplazo de WordPress no funcionará aquí.

¿Alguien sabe una solución para esto?

  • Una simple consulta de PHP puede hacer el trabajo. Seleccione las tablas que contienen los datos de VC, luego haga una str_replace()luego vuelva a insertar

    – ProEvilz

    16 de noviembre de 2017 a las 12:48


Avatar de usuario de Alexander Sanik
Alejandro Sanik

Yo también tengo este problema, y ​​escribí un pequeño guión para esto.
https://github.com/lSanik/WordPress-VisualComposer-RawHtml-Base64-Replace

# WordPress VisualComposer RawHtml Base64  data base mass Replacing

For developers only!

This is little script for mass changes in wordpress visual composer database. 
You can change all domains, html code, scripts and etc, data that in base64 coded.

MAKE BACK-UP database table WP_POSTS!

All what you need, its take this in function.php at your theme folder.
Change sample data to yours needs.
Run url - your_site.com/replace_composer_html_raw_base64

If success - all data will be changed and you are happy now ;)


<?php
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);
        $tag = 'vc_raw_js';//'vc_raw_js';//'vc_raw_html';//vc_raw_js
        $pattern = '\['.$tag.'].*?\]';

        foreach ($response as $post){

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

            if(!$content && 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(// Update the post into the database
                'ID'           => $post['ID'],
                'post_content' => $post['post_content'],
            );
            wp_update_post( $upd );
        }

        die('If no errors, all successful! =)  ');
    }
}
// String with shortcode tag, and different tag send, like vc_raw_html,vc_raw_js, etc.
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);//If something is not working, try changing rawurldecode to urldecode, etc... dumped it =)

        //place to replace decoded string
        $string = replacedComposerRawFromTo($string);
        //end place..

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

    return $return;
}

function replacedComposerRawFromTo($string,$fromTo=false){
    //Changed from 'value' = > to 'value';
    $fromTo=array(
    //Sample data to change!
        'http'=>'https',
        'token123'=>'token321',
        '<script>Hello World</script>'=>'<script>HI WORLD</script>',

    );

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

    return $string;
}

add_action('init', 'replace_composer_html_raw_base64');

  • Buen trabajo. La próxima vez que necesite usar esto, volveré y lo probaré. Gracias

    – vidente

    9 oct 2018 a las 18:59

  • por el bien de la terminación .. su comentario //If something not working, try change this rawurlencode to urlencode, etc... dumped it =) debiera ser rawurldecode y urldecode respectivamente.

    – frecuencia

    25/01/2019 a las 21:40

  • Muchas gracias compañero. Solo un recordatorio para que otros usuarios no olviden cambiar esta línea según su propio uso $tag = 'vc_raw_js';//'vc_raw_js';//'vc_raw_html';//vc_raw_js

    –Yug Kapoor

    8 de marzo de 2020 a las 13:01

  • Hola, tengo un bloque como este: [vc_raw_html css=”.vc_custom_1587030205472{margin-top: 0px !important;margin-right: 0px !important;margin-bottom: 0px !important;margin-left: 0px !important;}”] El guión no lo entiende. Creo que es porque el atributo css y {}. ¿Cómo puedo editar la expresión regular para hacerlo? Gracias

    – djoo

    11 dic 2020 a las 13:50

  • Gran trabajo. ¡Gracias!

    – Miguel

    15 de enero de 2021 a las 15:04

Este complemento de WordPress hizo el truco:
https://wordpress.org/plugins/mejor-búsqueda-reemplazar/
Lo probé con cadenas codificadas y tuve éxito.

De esto: https%3A%2F%2Fevergreendent.com%2Fhu

A esto:https%3A%2F%2Fevergreendent.hu

Como esto:
http://prntscr.com/qxu65n

Reemplazó los enlaces del creador de páginas de Visual Composer / WP Bakery.

De esto:
https://evergreendent.com/hu

A esto:
https://evergreendent.hu

  • Esta debería ser la respuesta aceptada. Sólido hallazgo. ¡Solo tiene que usar las cadenas codificadas de URL en la búsqueda y reemplazo (así como una búsqueda y reemplazo regular, sin codificar para cualquier lugar que no sea VC) y estará bien! ¡Gracias!

    – Samyer

    1 oct 2020 a las 20:10


  • Muchas gracias. (%2F), fue muy complicado (Funciona) [ Save my Brain and Time ]

    – Shahinul Islam

    3 de enero de 2021 a las 12:59

  • Debo decir que hice muchos intentos siguiendo su consejo exacto y captura de pantalla y encuentra 0 instancias en una ejecución en seco (varios otros complementos también encuentran 0 instancias) cuando puedo ver claramente en la herramienta de creación de compositor visual WPbakery que las URL antiguas todavía están allí. En este caso, están en un bloque “HTML sin procesar” y hay al menos 6 instancias que conozco. ¿Alguien?

    – usuario3035649

    16 de agosto de 2021 a las 15:11

Avatar de usuario de Rajkumar Gour
Rajkumar Gour

coloque el siguiente código en las funciones de su tema.php

add_filter('the_content', 'chnage_http_to_https', 10);
function chnage_http_to_https($content){
    return str_replace('http://example.com','https://example.com', $content);
}

te ayudará en la parte delantera. Cambie example.com al nombre de su sitio

  • Esto reemplazará CADA instancia de ‘http://’ en CUALQUIER publicar, ya sea una URL a otro sitio o lo que sea. It will help you on the front end -> al menos explique su código porque esto podría haber dañado potencialmente el sitio de OP si lo hizo sin saber lo que hace completamente.

    – ProEvilz

    16 de noviembre de 2017 a las 12:56


  • puede agregar la letra come de su sitio str_replace(‘Tú sitio‘, ‘Tú sitio‘, $contenido);

    – Rajkumar Gour

    16 de noviembre de 2017 a las 12:57

  • Esto no funcionará para sitios con http://www y si OP tiene una mezcla de http://www y http:// entonces esto no funcionará al 100%.

    – ProEvilz

    16 de noviembre de 2017 a las 12:59


  • es un filtro para cambiar la salida del contenido. no hará nada en su base de datos.

    – Rajkumar Gour

    16/11/2017 a las 13:00

  • Gracias, pero los elementos de Visual Composer generalmente no activan el the_content gancho. Probado rápidamente y no funciona con el elemento html sin formato

    – vidente

    16/11/2017 a las 13:00


Necesitaba una solución para un solicitud de soporte y lo resolvió de la siguiente manera.

Puedes usar el Complemento Go Live Update Urls junto con el siguiente filtro.

add_action( 'go-live-update-urls/database/after-update', function ( $old_url, $new_url ) {
    global $wpdb;
    $possibles = $wpdb->get_results( "SELECT ID, post_content FROM {$wpdb->posts} WHERE post_content LIKE '%[vc_raw_html]%';" );

    foreach ( $possibles as $possible ) {
        $replaced = preg_replace_callback( '/\[vc_raw_html\](.*?)\[\/vc_raw_html]/', function ( $matches ) use ( $old_url, $new_url ) {
            list( $full, $encoded ) = $matches;
            $replaced = str_replace( $old_url, $new_url, base64_decode( $encoded ) );
            return str_replace( $encoded, base64_encode( $replaced ), $full );
        }, $possible->post_content );

        if ( $replaced !== $possible->post_content ) {
            $wpdb->update( $wpdb->posts, [
                'post_content' => $replaced,
            ], [
                'ID' => $possible->ID,
            ] );
        }
    }
}, 10, 2 );

Ejecute el complemento como de costumbre y encontrará que todas las URL han sido reemplazadas dentro de los bloques HTML sin formato también han sido reemplazados.

  1. URL antigua: http: (o cualquier otra URL).
  2. Nueva URL: https: (o cualquier otra URL).

usar https://wordpress.org/plugins/velvet-blues-update-urls/ y actualice la URL desde el panel de administración, esto cambiará todas las URL en el sitio, ya sea en el contenido o en los enlaces de URL.

  • lee la pregunta de nuevo por favor. este es un buen complemento, pero no reemplazará nada en la cadena codificada almacenada por el compositor visual

    – vidente

    16 de noviembre de 2017 a las 20:11

  • lee la pregunta de nuevo por favor. este es un buen complemento, pero no reemplazará nada en la cadena codificada almacenada por el compositor visual

    – vidente

    16 de noviembre de 2017 a las 20:11

¿Ha sido útil esta solución?