★ExcelVBA ~ MySQLが無い環境でも、「All-in-One WP Migration」でバックアップした自分のWordpressデータを、Excelに吸い込んで読んだり検索したりできるようにする方法(画像・動画・音声は無しで記事の文字のみ)
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
★はじめに
・Wordpressのバージョンが古くなりすぎて載せ替えしたいけど、
その前に記事が取り出せなくなる状況を回避したい、
・載せ替え「失敗」が怖いから、バックアップファイルとしてではなく、
HTML形式で全記事をいったん書き出しておきたい、
・MySQLが無い・分からない・扱えない、
・MySQLのインストール自体がめんどくさい、
という状況の時に、しかしながら、現状のバックアップの中身(記事)が見たいことがあります。
その際、ExcelVBAでExcelファイルに記事の内容を吸い込めば、html形式に書き出して閲覧したりはもちろんできますし、任意の語句で検索したりもできることがあります。
とりあえず、「バックアップファイルが単純なテキストファイル」の場合だけしかできないんですが、Wordpressの記事のテキストをExcelファイルに吸い込むVBAなどをご紹介します。
ここでは、「All-in-One WP Migration」というプラグインでバックアップ・ダウンロードした記事データを、Traktor (https://traktor.wp-migration.com/?utm_source=chatgpt.com) という無料ソフトにて、解凍してから吸い込む事例をご紹介します。
★事前準備
WordPressサイトに「All-in-One WP Migration」というプラグインが動くことが前提です。
入ってなかったら入れてください。
あと、解凍には「Traktor (https://traktor.wp-migration.com/?utm_source=chatgpt.com) を使うので、ダウンロードしてインストールしておいてください。(無料)
2026/06/09時点では、「YOUR PLATFORM」のところの「Windows 64-bit Installer」のところの「DOWNLOAD EXE」ボタンを押せば大丈夫です。
ダウンロードしたら普通にインストールしてください。
最後に、一番最後にに書いてあるログラムを仕込んだExcelファイルを「Wpressインポートテスト01.xlsm」という名前で保存しておきます。
★注意事項?とヒント?
もし、「All-in-One WP Migration」が動かない場合、似たような「バックアップ用のプラグイン」なら、たいがい、バックアップを解凍したのちの「.sql」拡張子のファイルがデータベースのバックアップだと思いますので、その中身がもし「テキストファイル」なら、似たようなプログラムをChatGPTに作ってもらうなどすれば、同じようなことができると思います。
なお、「All-in-One WP Migration」の場合、「.wpress」拡張子のファイルがDBのバックアップのようですが、これはテキストファイルなのでテキストエディタで開けます。
で、今のところは、
INSERT INTO SERVMASK_PREFIX_posts VALUES (123,2,'2017-01-24 02:53:42','2017-01-23 17:53:42','パスタとか\r\n手作りビールとか\r\n蕎麦打ちとか\r\nケーキとか\r\nパンとか','お料理','','trash','closed','closed','','cooking__trashed','','','2017-01-29 02:42:04','2017-01-28 17:42:04','',0,'https://abcd/efg/?page_id=123',0,'page','',0);
のような形で、
「INSERT INTO SERVMASK_PREFIX_posts VALUES (」で始まって、
そこから最初の「',0);と改行コードの組み合わせ」のところまでが、
1記事分(1ブロック分)です。
で、
さらに、このうち、
「,'trash','closed','closed',」の部分が、「trash」 を含まないものと、
また、
「'nav_menu_item','',0);」を含まないもの、
が、最低限、サイトに表示できている「記事」、っぽいです。
実際にはもう少し絞り込み条件があると思いますが。
(※「,'trash','closed','closed',」の部分が、「trash」 を含まないもの、とはつまり、『最初から「trash」を含まない、そういう1ブロック・・・』という認識でもOKです。「trash」を含むブロック(=記事)はゴミ箱行きになったものらしく、サイトに表示されません。なお、「nav_menu_item」を含むものは、多分メニューかカテゴリか何かなので、「記事」ではないです。)
★流れ
(01)「All-in-One WP Migration」にて、「エクスポート」→エクスポート先は「ファイル」。
とりあえず、サイトの「wp/wp-content/ai1wm-backups」の中にバックアップされるので、いつでもダウンロードできるようになってます。
「All-in-One WP Migration」の「バックアップ」メニューでも、同じものが見れて、見れてるうちは、何回でもダウンロードもできます。
(02)で、ファイルへのバックアップが完了すると、それを「ダウンロードするか?」と言われるのでダウンロードする。
※これは「wp/wp-content/ai1wm-backups」からFTPクライアントでダウンロードしてもOKです。
(03)ダウンロードすると、「サイト名-wp-20260609-092235-lr0m00.wpress」のような名前のファイルがダウンロードできる。
(04)「Traktor」にて、解凍する。
起動すると「Set Up Traktor」というダイアログが出るので「Skip」する。
(05)出ている画面に「サイト名-wp-20260609-092235-lr0m00.wpress」をドラッグで放り込んで、画面右帯の「Extract to…」を押し、解凍先フォルダを指定。
解凍先フォルダは「ダウンロード」フォルダなどで問題無し。
(06)解凍されると、自動で解凍先フォルダが開くので、その中の「database.sql」が記事のデータベース。これをMySQL(MySQLAdmin など)に読ませれば、中が見えるとのこと。今回はExcelファイルに吸い込みます。
(07)「Wpressインポートテスト01.xlsm」を開いて、一番左のシートを
「空にしてもよいシート」にしてから(これ絶対に忘れないで)、
「Extract_SQL_RealStream」というプログラムを実行。
これで「database.sql」の中身を吸い込みします。
1セルには32,767文字入るのですが、それを超えるごとに、横展開でテキストデータが吸い込まれていきます。多分文字化けしないとは思いますけど、もし文字化けして吸い込まれてしまったら、ChatGPTなどにコードを直してもらってください。
(08)吸い込んだ直後は、空白の行がところどころできるので並べ替えして、
データのある行だけを上のほうにもっていく作業をします。
(これも必ずやってください。プログラムがChatGPTに作らせたテキトーなやつなので、これやっとかないと正常に処理できないかもしれないので)
(※事前にVBEにて、イミディエイトで「? Activesheet.Usedrange.Address」をやっておくと、何列目目までデータが入っているかがわかります。)
一番上に空白行を作り、
一番左に空白列を作ります。
一番左の列名は「連番」にします。2番目の列名から右は、「内容01」を右へオートフィルして、「内容02」「内容03」「内容05」などと、します。(VBAが分かる人は、「? Activesheet.Usedrange.Address」で調べた列まで、列名を入れればいいと思います。)
「連番」の列にドラッグ(手動)のオートフィルで、一番最後の行まで連番を入れます。
「連番」の列の隣にもう一つ空白行を作ります。並べ替え用の列です。
列名は「連番02」とか「並べ替え用連番」とか適当につけてください。
その列の一番上に、以下の数式を入れます。
「=--MID($C2,FIND("(",$C2)+1,FIND(",",$C2)-FIND("(",$C2)-1)」
(※「C2」のところは、実際のセルに、「INSERT INTO SERVMASK_PREFIX_posts VALUES (数字,・・・」と入力されている列のセルアドレスを入れます。)
すると、「INSERT INTO SERVMASK_PREFIX_posts VALUES (数字,・・・」の部分の、「数字」が記事の入力順なので、それが「数値型」として、「並べ替え用連番」の列に表示されます。
以降は、ダブルクリックで一番下まで、オートフィルします。
「並べ替え用連番」が埋まったら、その列で昇順に並べ替えます。
「INSERT INTO SERVMASK_PREFIX_posts VALUES (数字,・・・」の値の入った行だけが上の方に記事の入力順に並べ変わります。
「表示」→「ウィンドウ枠の固定」で、列名の行だけ固定しておきます。
(09)吸い込まれたシートをアクティブにしてから(これも絶対に忘れないで)、
「Replace_All_Cells」というプログラムを実行します。
これで吸い込んだテキスト内容の置換をして、改行を有効にしたり
余計な「¥」を消したりして整えます。
上書き保存します。
(10)好きな検索語句で検索します。
(11)ヒットしたセルの行の「内容01」から横に、データがあるセルまでを選択して、適当なテキストファイルにコピペして保存します。
どのセルからどのセルまで値が入っているかは、「←」や「→」のキーで調べればわかります。
(12)たまに「"」の部分が「""」と、ダブルクォーテーションが2つになって貼り付いてしまうことがあるので、それを一応想定して、「必ず」テキストエディタの側で、「""」を「"」に置換します。
(無かったら無かったでいいので)
(13)その状態のテキストファイルをいったん閉じて、拡張子を「.txt」から「.htm」や「.html」に書き変えます。エラーが出ますが、かまわずOKします。
たいがいはhtmファイルとして、再現できると思います。
ただ、再現できるのは、文字だけです。
(※画像や映像は、記事のDBの外にそれらを保存している人しか出ないと思います。逆に、画像や映像を記事のDBの外に保存して記事に表示させている人は、ほぼほぼ再現されると思います。)
★ChatGPTへのプロンプト内容
(一発で成功しないと思うので、動作テストしながら直していってください。)
【1つめのプロンプト】
テキストファイルの中身を読みながら、以下のような条件で、WordPressのバックアップファイルの内容をExcelシートに吸い込むVBAコードを作ってください。
(01)吸い込んだ記事内容が文字化けしないように、「ADODB.Stream」を、
つまり、
Set xxxxxx = CreateObject("ADODB.Stream")
をどこかで使ってください。
(02)テキストファイルの中身をSQLとして認識しない。ただの文字列として処理する。
記事やタイトルがどうこうとか、全部、「考えなくていい」。
改行も勝手に変換しない。つながったままでいい。
(03)『INSERT INTO SERVMASK_PREFIX_posts VALUES (』という文字列を含む行から、
『最初の、「',0);」と改行コードの組み合わせ』を含む行までを1つの単位(1つのブロック)として抽出。
もし、両方ともが1行内に収まっているなら、そのままその1行が1ブロック。
基本的には、1行が1ブロックになるはずではないか?
つまり、抽出単位としては、
『INSERT INTO SERVMASK_PREFIX_posts VALUES ( ... ',0);』
を「1ブロック」として抽出する。
しかし、SQLの命令単語は無視する。
単なる文字列として解釈し、「\r\n」や「\n\n」などの改行コードなどもいじらない。
改行に変換しない。そのままでいい。何もしなくていい。
「INSERT INTO SERVMASK_PREFIX_posts VALUES (」や「);」も含めた形で、
1抽出単位(1ブロック)とする。
(04)そのうち、「,'trash',」を含むブロックは捨てる
(05)また、「'nav_menu_item','',0);」を含むブロックも捨てる
(06)その1単位(1ブロック)を、1セルにそのまま保存。
1セルに入りきらないなら、32,700文字ごとに、以下のように横展開で。
A列 B列 C列 D列 ...
抽出文1 抽出文2 抽出文3 抽出文4 ...
============
【2つめのプロンプト】
あと、吸い込んた後に、セルの中身を見て行って、
以下の順番で、
(01) ¥r¥n を
に
(02) ¥" を " に
(03) ¥' を ' に
一括置換するコードも教えてください。
チェック(置換)するセルのセル範囲は、ActiveSheet.UsedRange、でいいです。
※置換の処理は、必要に応じて追加します。
★全記事の、HTMLファイルへの一括自動書き出しについて
現状はそこまでのプログラムは作ってありませんが、ChatGPTに聞くなどすれば、このまま、「1ブロック分=1HTMLファイル」という形での全記事の自動書き出しは可能で、かつ、それほど難しくないと思います。
なお、一括で全記事を書き出したのち、「""」によって変な表示になっていたり、リンクが効かないといけないので、ブラウザで開く前に、テキストエディタで「""」を「"」に一括置換すればまったくもって大丈夫だと思います。
※恐らくですが、VBAで自動書き出しする際は、「"」の部分が「""」と、ダブルクォーテーションが2つになってしまうことは無いのではないか?と思います。ただ、念のため、ブラウザで開く前に、テキストエディタで「""」を「"」に一括置換してみてください。
ただ、慣れてきたのち、あえて何回か「事前の置換」をやらずにいってみて、で、もし「これはもうやらなくて大丈夫」となれば、「おかしい」と思った時だけ置換をすればOKかと思います。
★「Wpressインポートテスト01.xlsm」のVBAプログラム
以下の1つめのプログラムの「Extract_SQL_RealStream()」の、
「sqlText = ReadUTF8File("D:\1\database.sql")」の行の、
「"D:\1\database.sql"」の部分は、
実際に「database.sql」ファイルを置いた場所のフルパスに書き変えてから実行してください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
' ' Option Explicit Const MAX_CELL As Long = 32700 '1セルあたりの文字数上限設定 Sub Extract_SQL_RealStream() Application.ScreenUpdating = False Dim sqlText As String Dim buf As String Dim startPos As Long Dim endPos As Long Dim ws As Worksheet Dim row As Long sqlText = ReadUTF8File("D:\1\database.sql") Set ws = ThisWorkbook.Sheets(1) ws.Cells.Clear row = 1 buf = sqlText Do While True startPos = InStr(buf, "INSERT INTO `SERVMASK_PREFIX_posts` VALUES (") If startPos = 0 Then Exit Do ' endPos = InStr(startPos, buf, ");") endPos = InStr(startPos, buf, "',0);") If endPos = 0 Then Exit Do Dim block As String block = Mid(buf, startPos, endPos - startPos + 2) buf = Mid(buf, endPos + 2) Call ProcessBlock(block, ws, row) row = row + 1 Loop Application.ScreenUpdating = True End Sub Function ReadUTF8File(filePath As String) As String Dim stm As Object Set stm = CreateObject("ADODB.Stream") stm.Type = 2 ' text stm.Charset = "utf-8" stm.Open stm.LoadFromFile filePath ReadUTF8File = stm.ReadText(-1) stm.Close Set stm = Nothing End Function Sub ProcessBlock(block As String, ws As Worksheet, row As Long) Dim col As Long ' trash除外 If InStr(block, "'trash'") > 0 Then Exit Sub ' nav_menu_item除外 If InStr(block, "'nav_menu_item','',0);") > 0 Then Exit Sub col = 1 Call WriteSplit(ws, row, col, block) End Sub Sub WriteSplit(ws As Worksheet, row As Long, ByRef col As Long, txt As String) Dim pos As Long Dim chunk As String pos = 1 Do While pos <= Len(txt) chunk = Mid(txt, pos, MAX_CELL) ws.Cells(row, col).Value = chunk col = col + 1 pos = pos + MAX_CELL Loop End Sub '============================== '吸い込んだセルデータを全部見て一括置換し、 '改行などの設定を有効にしたり、余計な「¥」を取ったりする Sub Replace_All_Cells() Dim c As Range Dim txt As String For Each c In ActiveSheet.UsedRange If Not IsError(c.Value) Then If Len(c.Value) >= 3 Then txt = c.Value 'Chr(34)="" ' (01) \r\n → <BR> txt = Replace(txt, "\r\n", "<BR>", , , vbBinaryCompare) ' (02) \" → " txt = Replace(txt, "\""", """", , , vbBinaryCompare) ' (03) \' → ' txt = Replace(txt, "\'", "'", , , vbBinaryCompare) ' (04) "" → " ' txt = Replace(txt, """""", """") ' txt = Replace(txt, "\""", Chr(34)) ' txt = Replace(txt, "\'", "'") ' txt = Replace(txt, "\r\n", "<BR>") ' txt = Replace(txt, """", Chr(34)) ←これは削除推奨ケースあり c.Value = txt End If End If Next c End Sub ' ' |
- 投稿タグ
- ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, SQL, Wordpress, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ワークシート関数, 独学, 自動化