Recientemente me ha tocado crear un WooCommerce con GeneratePress pero aprovechando todos los productos y páginas anteriores, creados con Divi.
Al final toca ir recreando una a una cada una de las páginas, podría hacerse algo que mapease los shortcodes de Divi y generase el HTML necesario, pero no dejaría de ser un apaño y lo que realmente quería era mantener «la chicha», las descripciones de los productos (que estaban todos maquetados en Divi), el contenido de las páginas y el de los posts, para los que también habían utilizado Divi.
Ir eliminando los shortcodes uno a uno era prácticamente inviable. La primera opción fue un volcado de la tabla wp_posts y ahí buscar y eliminar, pero daba algún problema y no me gustaba en exceso el resultado.
Otra opción era exportar los productos a CSV, ahí buscar y reemplazar, pero debido a las comillas dobles de los shortcodes, tampoco era muy buena idea, aunque hice una buena sustitución de varios miles de cadenas, no me convencía.
La solución final por la que opté, fue que al guardar un post, página o producto, eliminase los shortcodes.
Así podía editar una página, previsualizarla con todos los shortcodes y al darle a guardar, los elimina todos. Pero además como también funciona en la edición rápida, puedo seleccionar 50 productos, editar en bloque y darle a guardar (sin hacer ningún cambio).
Puede parecer que no es el método ideal, pero en este caso es el que mayor control me daba y podía seleccionar sólo los que quería «limpiar». Sería muy fácil aplicar un bucle y ejecutarlo en todos los productos, páginas, etc…
Sólo he aplicado «la limpieza» de shortcodes en el contenido, podría aplicarlo también en otros campos, pero en este caso no era necesario. Eso si, tened backups de la base de datos antes de realizar cualquier cambio de este tipo.
Para hacer funcionar este «apaño», he utilizado el filtro de WordPress que se ejecuta antes de guardar una entrada y que es content_save_pre que como vemos en https://developer.wordpress.org/reference/hooks/field_no_prefix_save_pre/ podemos aplicar al contenido (el que he utilizado), título o cualquier otro campo.
Este código podéis utilizarlo en vuestro plugin de funciones o en el functions.php de vuestro tema hijo; eso si, acordaos de desactivar el filtro (o eliminar el código) cuando ya tengáis vuestras entradas limpias de los shortcodes de Divi. No pasaría nada si no se desactiva, pero no le vamos a dar un trabajo extra a nuestro WordPress cada vez que guarde una entrada si ya no hay códigos que limpiar.
Y aquí va el código, que es lo que la mayoría querrá y no toda esta literatura previa, aclarar que con muy pocas modificaciones de la expresión regular utilizada, lo podemos adaptar para otros shortcodes.
/**
* Clean Divi shortcodes from content Post.
*
* NOTE: Only for migrate from Divi to Gutenberg. Deactivate it after that.
*
* @param string $content The post content.
*
* @return string
*/
function cl_save_clean_content( $content ) {
return preg_replace( '/\[\/?et_pb.*?\]/', '', $content );
}
add_filter( 'content_save_pre', 'cl_save_clean_content', 10, 1 );
Añadido (20/03/2021): Si hemos eliminado Divi de nuestra instalación y queremos eliminar todo rastro del mismo, deberemos buscar en la tabla de opciones y de post_meta, aquellas que comiencen con et_
y _et_
, primero las buscamos:
SELECT * FROM wp_options WHERE option_name LIKE 'et\_%';
SELECT * FROM wp_postmeta WHERE meta_key LIKE 'et\_%';
SELECT * FROM wp_postmeta WHERE meta_key LIKE '\_et\_%';
Y acto seguido, si estamos seguros de que no vamos a volver a utilizar Divi, las eliminamos (podemos hacerlo todo en una consulta, pero prefiero ir viendo tabla a tabla y comprobar con los SELECT los datos devueltos):
DELETE FROM wp_options WHERE option_name LIKE 'et\_%';
DELETE FROM wp_postmeta WHERE meta_key LIKE 'et\_%';
DELETE FROM wp_postmeta WHERE meta_key LIKE '\_et\_%';
Recordad que debemos «escapar» el carácter _
porque en la sentencia SQL con el LIKE, representa un carácter https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html.