Skip to content

Instantly share code, notes, and snippets.

@gemmadlou
Last active April 20, 2024 14:56
Show Gist options
  • Save gemmadlou/7a0189bfae6c2c7268de12f1de822b8a to your computer and use it in GitHub Desktop.
Save gemmadlou/7a0189bfae6c2c7268de12f1de822b8a to your computer and use it in GitHub Desktop.
Removing Visual Composer & Shortcodes From Wordpress Content

Adding @k1sul1's suggestion from the comments as it's more concise than what I had before:

I just wanted them all gone, so I ran this in the MySQL shell.

UPDATE wp_posts SET post_content = REGEXP_REPLACE(post_content, "\\[\/?vc(.*?)\]", "");

Note the double backslash. If you forget it, you'll replace all v's and c's with nothing, and the shortcodes will still be there. This works for other shortcode as well, just replace vc.

Take a backup beforehand.

@michaelbourne
Copy link

I just wanted them all gone, so I ran this in the MySQL shell.

UPDATE wp_posts SET post_content = REGEXP_REPLACE(post_content, "\\[\/?vc(.*?)\]", "");

Note the double backslash. If you forget it, you'll replace all v's and c's with nothing, and the shortcodes will still be there.
This works for other shortcode as well, just replace vc.

Take a backup beforehand.

Cheers for the best reply here. We don't need a paid plugin for this.

@Jany-M
Copy link

Jany-M commented Nov 8, 2021

@gemmadlou @k1sul1 help with MySQL 5.6? :( can't use REGEXP_REPLACE (available only in MySQL 8+)

@gemmadlou
Copy link
Author

Hi @Jany-M - my method before was more manual as I would dump the SQL and fix it while migrating the site:

https://gist.github.com/gemmadlou/7a0189bfae6c2c7268de12f1de822b8a/210503ff67d9c1d220a8d69acbfc3479eca4b64f

Maybe a mixture of pure REGEXP with REPLACE can help?

https://dev.mysql.com/doc/refman/5.6/en/regexp.html

@praful2111
Copy link

Here Is the updated answer to update all images in the post/page content.

    // Args for the WP_Query
    $args = array(
    	'post_type' => 'post',
    	'posts_per_page' => 10,
    	'post__in' => array(5824),
    	'orderby' => 'post__in' 
    );
    
    // Execute WP_Query with args
    $query = new WP_Query( $args );
    
    // Start the Loop
    while ( $query->have_posts() ) {
    	$query->the_post();
    	// Get Page/Post content 
    	$content = apply_filters('the_content', $content);
    
    	// Get the vc_single_image count from the post 
    	$found_keyword = substr_count( $content,"vc_single_image" );
    
    	// Start loop to replace all elements from the content 
    	for ($i=0; $i < $found_keyword; $i++) { 
    		// Get the position of vc_single_image shortcode with Image ID and Image Size
    		preg_match( '/\[vc_single_image image="(\d+)" img_size="(\w+)"[^\]]*\]/', $content, $matches );
    
    		// Check shotcode are exist on loop
    		if( isset( $matches[1]) ){
    			
    			// Get the Image ur by Image id and Size
    			$url =	wp_get_attachment_image_url( (int) $matches[1], $matches[2] );
    			$img = sprintf( '<img src="%s" />', $url );
    
    			// Replce shortcode with <img> tag
    			$content = str_replace( $matches[0], $img, $content );
    
    		}
    	}
    
    	// Update post content with updated content with <img> tag
    	wp_update_post( [ 'ID' => get_the_ID(), 'post_content' => $content] );
    }
    // END the Loop

@jkriznar
Copy link

Hi, @praful2111

I'm having trouble with this code due to PHP Notice: Undefined variable: content in /var/www/example.com/htdocs/wp-content/themes/generatepress_child/functions.php on line 474 so the Woocommerce product content always gets replaced with blank content.

It's something with the line $content = apply_filters('the_content', $content);

I must add that I want to replace those image shortcodes on Woocommerce products, but I tested it with regular Wordpress post as-well and it doesn't work...

Can somebody please advise?

Thanks a ton.

@m4c
Copy link

m4c commented Apr 20, 2023

I still have an additional follow-up question. How to construct a regex query to MySQL to replace The7 VC gallery shortcodes to classic WP gallery:

From this:

[dt_gallery_masonry mode="grid" bwb_columns="desktop:2|h_tablet:2|v_tablet:2|phone:2" gap_between_posts="10px" image_border_radius="12px" image_scale_animation_on_hover="disabled" image_hover_bg_color="disabled" show_zoom="n" include="6205,6206,6207,6208,6209,6210" css_dt_gallery=".vc_custom_1664369671640{margin-bottom: 30px !important;}"]

to this:

[gallery size="medium" columns="2" ids="6205,6206,6207,6208,6209,6210"]

The idea is to keep and move the value of the 'include' parameter from dt_gallery_masonry to the 'ids' parameter in gallery.

I'll try this:

UPDATE wp_sandbx_posts SET post_content = REGEXP_REPLACE(post_content, '(\[\/?dt_gallery_masonry)(.*?)(include\=\")(.*?)(\")(.*?)(\])', '[gallery size=\"medium\" columns=\"2\" ids=\"$4\"]');

But something is wrong.

@nodsaibot
Copy link

mysql query is enough, NEVER pay for software, much less for plugins

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment