クモのようにコツコツと

フロントエンドエンジニア イイダリョウのブログ。略称「クモコツ」

AdminerからSQL文で「我輩は猫である」を「犬」にしてみる(WordPressのDB操作:その2)

前回の続きです。ターミナル(黒い画面)を叩かずにDB(データベース)をSQL文でコチョコチョしたい。
一番身近でSQL文に触れられるのは「Local by Flywheel」の「Adminer」でした。
今回のテーマはWordPressに投稿した「我輩は猫である」を「犬」にする、です! 

※目次:

Adminerの4つのメニュー

前回、WordPressのローカル環境である「Local by Flywheel」の「Adminer」からDBにアクセスし、エクスポートしたダンプ(.sql)ファイルの中を見ました。

※参考:SQL文はLocal by FlywheelのAdminerから慣れよう(WordPressのDB操作:その1) - クモのようにコツコツと

今回はAdminer上でSQL文を書いてみたいと思います。
Adminerのサイドバーを見ると「メニュー」と「テーブル」に別れています。

f:id:idr_zz:20181024203444j:plain

メニューは下記の4つです。

  • SQL command
  • Import
  • Export
  • Create table

SQL command:SQL文入力

一つ目のメニューはSQLコマンド。ここからSQL文でDBへの命令が書けます。

f:id:idr_zz:20181024203447j:plain

Import:ダンプファイルインポート

二つ目はインポート。ここから外部のDBのダンプファイルをインポートできます。別のサーバのDBのデータを当環境に移行する時に使います。

f:id:idr_zz:20181024203453j:plain

Export:ダンプファイルエクスポート

三つ目はエクスポート。こちらはインポートと逆でDBのダンプファイルをエクスポートします。当環境のDBのデータを別のサーバに移行するときに使います。(ここから前回ダンプファイルを書き出しましたね)

f:id:idr_zz:20181024203459j:plain

Create table:新規テーブル追加

最後はクリエイトテーブル。ここから新規テーブルを追加します。WordPressのコアなテーブルとは別に例えば商品情報などの独自のデータを置きたい場合に使います。

f:id:idr_zz:20181024203505j:plain

前回も解説したように「テーブル」とはエクセルの表のように「行(レコード)」と「列(カラム)」があるデータ形式です。

※参考:SQL文はLocal by FlywheelのAdminerから慣れよう(WordPressのDB操作:その1) - クモのようにコツコツと

WordPressのテーブル構成

次はWordPressのテーブルを見ていきましょう。前回も触れたようにWordPressにはテーブルがあらかじめ用意されています。

  • wp_commentmeta
  • wp_comments
  • wp_links
  • wp_options
  • wp_postmeta
  • wp_posts
  • wp_termmeta
  • wp_terms
  • wp_term_relationships
  • wp_term_taxonomy
  • wp_usermeta
  • wp_users

なんだか随分たくさんありますねぇ。。頭に「wp_」という接頭辞ついています。

よく見ると後ろに「meta」がついたペアになっている物が見受けられます。

f:id:idr_zz:20181025063305j:plain

metaはメタデータの意味。メタデータとは詳細情報のことです。

※参考:メタデータ

また、「term_hoge」とターム系で名前が似ている物も見受けられます。ある程度のまとまりはありそうです。

「wp_posts」は投稿データのテーブル

今回はテーブル「wp_posts」の中を見ていきたいと思います。wp_postsは投稿データが入っているテーブルです。
「Table」の「wp_posts」をクリック。(左メニューの「wp_posts」から開いても同様です)

f:id:idr_zz:20181024210622j:plain

「Show structure」画面が開きました。ストラクチャーは「構造」という意味。投稿ID、Author(投稿者)、Date(投稿日)などの構造が表示されているようです。
Show structureタブの左型「Select data」タブをクリック。

f:id:idr_zz:20181024210626j:plain

「Select: wp_posts」画面が開きます。いくつかの投稿データが入っています。(正確にいうと投稿だけでなく、固定ページやカスタム投稿もここに入ります)
一番上の「ID 1」の「edit」をクリック。

f:id:idr_zz:20181024210631j:plain

投稿「ID 1」の編集画面が開きます。上から「投稿日時」「本文」「タイトル」になります。

f:id:idr_zz:20181024210635j:plain

なんと、WordPressダッシュボードだけでなく、この画面からも投稿を編集できちゃうんですね!タイトルが本文の下にあるのがちょっとクセありますw
この画面はタイトル「Hello word!」という投稿のデータです。

「Local by Flywheel」の「VIEW SITE」でサイトを見てみましょう。

f:id:idr_zz:20181024211824j:plain

先ほど「Adminer」で見た「Hellow world!」と同一内容が投稿されていますね。

f:id:idr_zz:20181024210642j:plain

我輩は猫である」を投稿する

次に、今回の題材となる「我輩は猫である」を新規投稿したい。WordPressダッシュボードを開きます。
「Local by Flywheel」の「ADMIN」をクリック。

f:id:idr_zz:20181024212259j:plain

前回書いたようにダッシュボードのログイン画面が開きますので、IDとパスワードを入力してログインします。

f:id:idr_zz:20181023214927j:plain

ログインしたら新規投稿を追加する。ダッシュボードの「投稿>新規追加」で投稿。*1

f:id:idr_zz:20181024214015j:plain

青空文庫」から夏目漱石先生の「我輩は猫である」から。*2

※参考: 図書カード:吾輩は猫である

サイトを表示。投稿が追加された!

f:id:idr_zz:20181024214038j:plain

Adminerの「wp_posts」にも追加されている!

f:id:idr_zz:20181024214213j:plain

「Edit」画面。ここからも修正できるけど、ダッシュボードと比べると枠が狭くて修正しにくそうね。。

f:id:idr_zz:20181024214251j:plain

SQL文で「我輩」を「犬」にする!

再びAdminerの「SQLコマンド」を開く。ここにSQL文を書いてみる。

f:id:idr_zz:20181024203447j:plain

SQL文(DDLDML、DCL)

前回解説したように、SQL文は「DDL」「DML」「DCL」の3種類がある。

  • DDL:データ定義言語
  • DML:データ操作言語
  • DCL:データ制御言語

DMLの基本命令(SELECT文、INSERT文、UPDATE文、DELETE文)

今回はデータ操作言語である「DML」を書きたい。DMLの基本命令は下記の四つ

  • SELECT文:検索
  • INSERT文:追加
  • UPDATE文:更新
  • DELETE文:削除

「SELECT文」で「猫」を検索

まずは手初めに「猫」という単語を検索してみる。

このような書式になります。

SELECT カラム名 FROM テーブル名
WHERE カラム名 LIKE "文字列"
  • FROMのテーブルからSELECTのカラムから取得
  • WHEREのカラムからLIKEの文字列を含む、という条件で

前回解説したように、カラムはエクセルでいう列のことです。

このように打ってみる。

SELECT * FROM wp_posts
WHERE post_content LIKE "%猫%"
  • wp_postsテーブルのすべて(*)のカラムから取得
  • post_contentカラムから「猫」という文字列を含む条件で

文字列「猫」の両サイドのパーセント%で挟むと文章の途中にある文字列も検索ができます。

%は0以上の文字列というパターン文字になります。文字列の前後につけることで文章の途中に含まれていてもマッチするようになります。

※参考:WordPressで学ぶデータベース(MySQL)の基礎 | webOpixel

「Execute」をクリックして命令を実行。

f:id:idr_zz:20181024223017j:plain

検索された!

f:id:idr_zz:20181024223148j:plain

「UPDATE文」で「猫」を犬にする

次に「猫」という文字列を「犬」にしてみます。 「UPDATE文」で書きます。

UPDATE テーブル名 SET `カラム名` = replace(`カラム名`, '検索文字', '置換文字')
  • テーブル名のSETカラム名の中から、replaceカラム名の検索文字を置換文字に置き換えます。

※参考:[WordPress] 投稿記事内の文字列をSQL文で一括置換 | しゃけろぐ

こう書いてみた。

-- 本文の「猫」→「犬」
UPDATE wp_posts SET `post_content` = replace(`post_content`, '猫', '犬')
  • wp_postsテーブルの本文post_contentの「猫」を「犬」に

f:id:idr_zz:20181025010905j:plain

置換された!

f:id:idr_zz:20181025010929j:plain

他にもいろいろ打ち替えてみた。

-- タイトルも「猫」→「犬」
UPDATE wp_posts SET `post_title` = replace(`post_title`, '猫', '犬')

-- タイトルの作者名「夏目漱石」→「冬目漱水」
UPDATE wp_posts SET `post_title` = replace(`post_title`, '夏目漱石', '冬目漱水')

-- 本文「ニャーニャー」→「ワンワン」
UPDATE wp_posts SET `post_content` = replace(`post_content`, 'ニャーニャー', 'ワンワン')

-- 本文「吾輩」→「拙者」
UPDATE wp_posts SET `post_content` = replace(`post_content`, '吾輩', '拙者')

-- タイトル「吾輩」→「拙者」
UPDATE wp_posts SET `post_title` = replace(`post_title`, '吾輩', '拙者')

-- 本文ルビ「わがはい」→「せっしゃ」
UPDATE wp_posts SET `post_content` = replace(`post_content`, 'わがはい', 'せっしゃ')

できた!

f:id:idr_zz:20181025010955j:plain

「拙者は犬である」完成!

f:id:idr_zz:20181025011009j:plain

今回は1投稿だがサイト全体に渡って文字列を置換できます。URLや会社名、電話番号などの変更に活用できそうです!

でもなんだか…あまりにも一瞬に「あっ」という間に検索置換できてしまったので、ちょっと怖さすら感じるなー。失敗すると後戻りできない。作業前は「Export」でデータをバックアップした方が安心ですね。

「INSERT文」と「DELETE文」は投稿自体の追加、削除

「INSERT文」と「DELETE文」も何か書いてみようと思ったが、調べたところ文字列ではなく投稿自体の追加、削除の規模のようだった。今回は参考記事の紹介にとどめます。

※参考:「INSERT文」で投稿を追加
WordPressにSQL(INSERT文)で直接投稿する方法

※参考:「DELETE文」で投稿を削除
WordPressの過去記事をSQL文を使って一気に削除する方法 - その日暮らし

最後に

Local by FlywheelのAdminerのからSQL文でDBの検索(SELECT文)と置換(UPDADE文)をやってみました。1行でデータ全体がザーッと置き換わるのは快感があります。

DBはターミナル(黒い画面)でコマンド打つイメージだったけど、GUIで実際のSQL文を書くと、どんなことができるのかイメージしやすいです。*3

検索(SELECT文)はデータに影響がないので気軽にできます。置換(UPDADE文)の方はあまりに簡単すぎて、本番環境で使うにはちょっと怖いですね…。まずはローカル環境のテストサイトで気軽に体験するのをオススメいたします。

なお、PHPの中でSQL文を書いてDBを直接操作する方法もあるようなので、今後そちらもトライしていきたいと思います。それではまた!


※参考:サーバサイドの基本まとめました!
【WordPress、PHP、SQL文】Webデザイナーでもわかるサーバサイドの基本まとめ!(6記事) - クモのようにコツコツと idr-zz.hatenablog.com

*1:ダッシュボードが英語の場合は「Setting」の「Site Language」で日本語してください。

*2:我輩は猫であるは1905年の作品!今読んでもとても楽しい小説です

*3:同じく GUIのデータベース接続クライアントphpMyAdminは Adminerとほぼほぼ同じ機能です