2026年8月12日

2026年8月12日

Visual Composer(WPBakery)停止後に残ったショートコードを削除する方法

Visual Composer(現在の WPBakery Page Builder)を停止すると、本文に [vc_row] や [vc_column_text] といったショートコードがそのまま文字として表示されます。これを片付けるには、まず影響範囲を調べ、表示側で一時的に隠してから、バックアップを取ったうえで本文からタグだけを取り除くのが安全な順序です。この記事では、その3段階を具体的なSQLとコードで説明し、タグを消すだけでは失われる内容があることも含めて整理します。

前提:どの「Visual Composer」かを確認する

「Visual Composer」という名前は、もともと現在の WPBakery Page Builder の旧称でした。その後、同じ系統の開発元から別製品の「Visual Composer Website Builder」が出ています。この記事で扱う vc_ で始まるショートコードが残る問題は、主に WPBakery Page Builder(旧 Visual Composer)と、それを同梱したテーマで起きるものです。Visual Composer Website Builder は保存方式が異なるため、停止後の残り方も違います。

また、テーマに WPBakery が同梱されていた場合、テーマ独自の要素(vc_ 以外の接頭辞を持つショートコード)や、Ultimate Addons などの拡張プラグインのショートコードも一緒に残っていることがあります。以下の手順は vc_ を例にしていますが、調査の段階でほかの接頭辞がないかも確認してください。

ステップ1:影響範囲を調べる

最初に、どの投稿にショートコードが残っているかを数えます。phpMyAdmin などで次のSQLを実行します(テーブル接頭辞が wp_ 以外なら置き換えてください)。

SELECT ID, post_type, post_status, post_title
FROM wp_posts
WHERE post_content LIKE '%[vc\_%'
  AND post_status NOT IN ('trash', 'auto-draft', 'inherit')
ORDER BY post_type, ID;

LIKE の中で _ は「任意の1文字」を表す記号なので、\_ と書いて文字としての下線を指定しています。これを忘れると、関係のない投稿まで拾います。

次に、使われているショートコードの種類を把握します。種類によって、タグを消したときに残るものが変わるためです。

  • **vc_row / vc_column / vc_column_text など**:レイアウト用の枠と文章です。タグを消すと中の文章は残り、段組みや背景の指定が失われます。
  • **vc_single_image など**:画像を属性(添付ファイルのID)で指定しているため、タグを消すと画像ごと消えます。
  • **vc_raw_html / vc_raw_js**:中身がエンコードされた文字列で保存されているため、タグを消すと意味の分からない英数字の列が本文に残ります。

画像や生HTMLの要素が多いページは、一括削除ではなく、手作業で作り直すページとして分けておきます。

ステップ2:まず表示側で一時的に隠す

本文を書き換える前に、訪問者に見えている崩れだけを先に止める方法があります。子テーマの functions.php に次のコードを追加すると、表示するときだけ vc_ のタグを取り除きます。データベースの内容は変わらないので、問題があればコードを外すだけで元に戻せます。

<?php
// 子テーマの functions.php に追記
add_filter( 'the_content', 'mychild_strip_vc_shortcodes', 9 );

function mychild_strip_vc_shortcodes( $content ) {
	// WPBakery が有効なときは何もしない
	if ( shortcode_exists( 'vc_row' ) ) {
		return $content;
	}
	return preg_replace( '/\[\/?vc_[^\]]*\]/', '', $content );
}

優先度を9にしているのは、the_content で段落を整える wpautop(優先度10)やショートコードを展開する do_shortcode(優先度11)より先にタグを取り除くためです。shortcode_exists() で WPBakery がまだ有効かを確認しているので、誤ってプラグインを有効に戻したときにレイアウトを壊すこともありません。

この方法は応急処置です。本文には古いタグが残ったままなので、検索結果の抜粋やRSS、別のテーマへの移行時には再び問題になります。落ち着いたらステップ3で本文を整理します。

ステップ3:バックアップを取ってから本文のタグを削除する

本文を一括で書き換える前に、データベースのバックアップを取ります。WP-CLI が使えるなら wp db export で書き出せます。可能ならステージング環境で先に試します。

次のスクリプトを strip-vc.php として保存し、WP-CLI で実行します。最初は確認だけを行う設定になっています。

<?php
// strip-vc.php : wp eval-file strip-vc.php で実行する
$dry_run = true; // 一覧を確認したら false に変えて再実行する

// WP-CLI 実行時に本文の iframe などが除去されないようにする
kses_remove_filters();

global $wpdb;
$pattern = '/\[\/?vc_[^\]]*\]/';

$ids = $wpdb->get_col(
	$wpdb->prepare(
		"SELECT ID FROM {$wpdb->posts}
		 WHERE post_content LIKE %s
		 AND post_status NOT IN ('trash', 'auto-draft', 'inherit')",
		'%' . $wpdb->esc_like( '[vc_' ) . '%'
	)
);

foreach ( $ids as $id ) {
	$post    = get_post( $id );
	$content = $post->post_content;
	$count   = preg_match_all( $pattern, $content );
	$new     = preg_replace( $pattern, '', $content );

	if ( $new === $content ) {
		continue;
	}

	WP_CLI::log( sprintf( '#%d %s : %d 個のタグ', $id, $post->post_title, $count ) );

	if ( ! $dry_run ) {
		wp_update_post(
			array(
				'ID'           => $id,
				'post_content' => wp_slash( $new ),
			)
		);
	}
}

実行は wp eval-file strip-vc.php です。表示された一覧が、ステップ1で調べた結果と合っているかを確認してから、$dry_run を false に変えて再実行します。

コードの中で注意している点は2つあります。1つは wp_slash() です。wp_update_post() は受け取ったデータからバックスラッシュを取り除いて保存するため、そのまま渡すと本文中のバックスラッシュが消えます。もう1つは kses_remove_filters() です。WP-CLI ではログインユーザーがいない状態で実行されるため、保存時の HTML フィルターが働き、本文の iframe や一部の属性が削除されることがあります。

wp_update_post() で更新すると投稿のリビジョンが作られるので、個別の投稿なら編集画面のリビジョン機能から書き換え前に戻せます。WP-CLI の wp search-replace に正規表現を指定して一括置換する方法もありますが、リビジョンが残らず、リビジョン自体も置換対象になるため、ここでは投稿ごとに更新する方法を紹介しています。

ステップ4:削除後に残るものを片付ける

タグを消したあとの本文には、次のようなものが残ることがあります。

  • 空の段落や余分な改行:枠のタグがあった場所に空行が残り、表示上の余白になります。気になるページはブロックエディターで開き、「ブロックへ変換」で整えます。
  • カスタムCSSの名残:WPBakery は、ページごとのカスタムCSSを投稿のカスタムフィールド(_wpb_ で始まるメタキー)に保存していました。表示には影響しませんが、不要なら整理の対象になります。削除する場合もバックアップを取ってから行います。
  • リンク切れの画像:ステップ1で分けておいた画像要素のあるページは、メディアライブラリから画像を挿入し直します。

作業が終わったら、ステップ2の表示用フィルターを外し、主要なページを開いて [vc_ の文字が出ていないかを確認します。キャッシュプラグインを使っている場合は、キャッシュを削除してから確認します。最後にステップ1のSQLをもう一度実行し、結果が0件になっていれば片付けは完了です。ここで紹介したコードは、WordPress と WP-CLI の現行の動作に基づいています(2026年10月現在)。

まとめ

  • vc_ のショートコードは WPBakery Page Builder(旧 Visual Composer)停止後に残るもので、まずSQLで対象の投稿と要素の種類を調べます。
  • 画像や生HTMLの要素はタグを消すと中身が失われるため、一括削除の対象から外して手作業で作り直します。
  • 応急処置として、the_content フィルター(優先度9)で表示時だけタグを取り除けます。
  • 本文の書き換えはバックアップ後、確認モードで一覧を見てから実行し、wp_slash() と kses_remove_filters() で本文の欠落を防ぎます。
  • 作業後は表示用フィルターを外し、SQLで残りが0件になったことを確認します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲