[WordPress] 投稿済みの記事内容を一括で書き換える方法

WordPressの投稿済みの記事内容に、MySQLから一括でクラスを付与したり文字列を書き換えたりする方法です。SQL文で直接書き換えれば一瞬で行うことができるので、記事数が多くて修正を全て手作業で行うことが難しい時にはとてもよいです。

どこに投稿データが入っているか

WordPressの投稿データはデータベースの wp-posts というテーブルに格納されています。このテーブルにはタイトルや更新日時などの投稿記事に関するデータがいろいろ入っており、記事内容(コンテンツ部分)はこのテーブル内の post_content というフィールドに格納されています。ここには投稿記事の他に固定ページやリビジョンデータも一緒に入っています。

データベース

データを上書きするSQL文

SQLのデータを変更するにはUPDATE文を使用します。構文は以下のような形です。

UPDATE テーブル名 SET フィールド名=書き換え後の値 WHERE 検索条件 ;

↑のSQL文の最後「検索条件」部分で、 post_type=’post’ とすると投稿記事のみ、post_type=’page’とすると固定ページのみのデータ変更に絞込むことができます。post_type=’post’ & ‘revision’とすると、投稿記事とリビジョンデータを変更できます。ただしリビジョンのデータはページと投稿を区別できないようで固定ページのリビジョンも変更されるので注意です。

他にも、親ページで絞り込んだり、公開済みかどうかで絞り込んだりなどが可能です。

置換するための関数

SQLのデータの一部分を書き換えるには、REPLACE関数を使います。以下のような形で使用します。

REPLACE(置換を行いたいフィールド名, '置換対象' , '置換後の文字')

WordPressの記事内容は post_content というフィールドに入っているので、記事中の img タグに 新しくクラスを付けたいという場合のREPLACE関数は以下のようになります。

REPLACE(post_content, '<img' , '<img class="newclass" ')

このREPLACE関数をUPDATE文の「書き換え後の値」部分にはめ込みます。

一括置き換えするSQL文

最終的に例として、投稿記事内の img タグにクラスを付けて一括で書き換えるSQL文は以下になります。

UPDATE wp_posts 
SET post_content=REPLACE(post_content, '<img' , '<img class="newclass" ') 
WHERE post_type='post' ;

上記のSQL文をターミナルなどからMySQLに接続して打ち込むか、もしくはphpMyAdminの「SQL」タブを開いたところに打ち込んでも実行できます。(私はターミナルからの操作に不安があるのでphpMyAdminの方が落ち着きます…。)

sql文を入力

もちろんですが、事前にデータベースのバックアップを取りましょう。一瞬で書き換わってしまうので取り返しがつきません…。

もっと複雑な置換をする

例えば、<h2>〜<h4>だけの中身に対してや、aタグ内の img タグだけなど、複雑に置換を行いたい場合は正規表現でのマッチングが必要になりますが、その場合SQL文だけでは置換が行えなくなってくるようです。置き換えを行うREPLACE関数と正規表現を使用するための関数、REGEXP関数(正規表現を使ったパターンマッチングで比較(REGEXP演算子,RLIKE演算子) – データの取得)が同時に使えない為です。

正規表現と置き換えを同時に行う場合はPHPを組み合わせて使用すればよいようです。詳細は以下の参考サイトをご参照下さい。

Comments 3

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です