サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

WordPressローカル環境を1Clickで更新(5/5)

2023-12-09 記載
概要 : サーバとローカルのファイル更新時間を比較して必要ファイルをダウンロード
関連記事:(1/5), (2/5), (3/5), (4/5)
Keyword : WordPress, VBA, FTP,

(前回のつづきより)
全ファイルを削除して全ファイルをダウンロードすれば楽ですが、ローカルではバックアップは不要ですし、さらにはバックアップのプラグインも不要です。ほかにもアクセス解析などサーバでしか意味のないプラグインというのもあります。
つきつめてみると、ダウンロード対象のフォルダはイメージ関係の
/wp-content/uploads/2023/
テーマ関係の
/wp-content/themes/
この2つとそのサブフォルダだけでよいと思われます。
あとはときどき手作業で総入れ替えを行えば事足りるでしょう。

FTP操作を何度も行うので、まずこの部分をSub/Functionにします。

'FTP
Public Sub FTP_ByCmdList(ByRef cCmdList As Collection)
  Dim sCmd As String

  'FTPアカウント情報
  sCmd = "open svNN.cloudfree.ne.jp" & vbNewLine
  sCmd = sCmd & "cfsid_ftpuser@cfsid.cloudfree.jp" & vbNewLine
  sCmd = sCmd & "password" & vbNewLine
  sCmd = sCmd & "BINARY" & vbNewLine

  'FTPコマンド
  For Each svLine In cCmdList
    sCmd = sCmd & svLine & vbNewLine
  Next
  'FTP終了コマンドの書き込み
  sCmd = sCmd & "quit" & vbNewLine

  'FTPコマンドをファイルに出力
  Dim adoStream As Object:Set adoStream = CreateObject("ADODB.Stream")
  'Dim adoStream As New ADODB.Stream '参照:Microsoft ActiveX Data Objects 2.8 Library
  adoStream.Charset = "utf-8"
  adoStream.Open
  adoStream.WriteText sCmd
  adoStream.SaveToFile "c:\work\cmd.txt", 2 '2=adSaveCreateOverWrite
  adoStream.Close

  'FTP接続
  Dim wsh As Object: Set wsh = CreateObject("WScript.Shell")
  'Dim wsh As New IWshRuntimeLibrary.WshShell '参照:Windows Script Host Object Model
  Call w.Run_Sync("FTP -i -s:c:\work\cmd.txt")
    
  'FTPコマンドファイル削除
  Kill "c:\work\cmd.txt"
End Sub

ファイル更新時間の比較はサブフォルダも含めて調べますから、再帰関数の形で組みます。再帰関数( FTP_DiffListup )は1つのCollectionにダウンロードすべきファイルパスを格納する処理結果をとるようにしました。

処理の呼び出し側Sub

'cloudfreeサーバから必要ファイルをダウンロード
Sub LocalWPUpdate_FTPDownload()
  Dim cDiff As New Collection
  
  'wp-content/uploads/uploads/2023/"
  Call FTP_DiffListup(cDiff, "public_html/mywordpress/wp-content/uploads/2023/")
  'wp-content/uploads/uploads/themes/"
  Call FTP_DiffListup(cDiff, "public_html/mywordpress/wp-content/themes/", True)
  
  'FTP File取得
  Dim vItem As Variant
  Dim cCmdList As New Collection
  For Each vItem In cDiff
    cCmdList.Add "get /cfsid.cloudfree.jp/" & vItem & " C:\home\cfsid\cfsid.cloudfree.jp\" & Replace(vItem, "/", "\")
  Next
  Call FTP_ByCmdList(cCmdList)
  
End Sub

ファイル更新時間比較のサブフォルダ探索再帰関数。
cloudfreeのFTP dirコマンドでは、ファイル更新日時の年と秒がとれないのですが、そこはあまり厳密に考えないようにします。
またテーマのファイル群は画像ファイルと違って、存在することで作用するケースがあるので、ローカルにしかないファイルは削除しています。

Public Sub FTP_DiffListup(ByRef cDiff As Collection, ByVal sSubDir As String, _
                          Optional ByVal fKillLocalOnly As Boolean = False)
  Dim cCmdList As New Collection
  Dim sDirFile As String
  
  'ファイル情報をFTPで取得
  sDirFile = "C:\work\" & Replace(sSubDir, "/", "/") & ".txt"
  cCmdList.Add "cd /cfsid.cloudfree.jp/" & sSubDir
  cCmdList.Add "dir ./ " & sDirFile
  Call FTP_ByCmdList(cCmdList)

  'ローカルにしかないファイルを削除するために当該フォルダのファイル一覧を保管
  Dim sFile As String
  Dim cLocalFiles As New Collection
  Dim idx As Long
  sFile = Dir(sLocalBase)
  Do While sFile <> ""
    Call cLocalFiles.Add(sFile)
    sFile = Dir
  Loop

  Dim vLine As Variant
  Dim asItem() As String
  Dim sSeverTime As String
  Dim sLocalTime As String
  Dim sLocalFile As String
  
  'FTP取得のファイルを開いて読み込み
  Dim sFileContent As String 
  Dim adoFile As New ADODB.Stream '参照:Microsoft ActiveX Data Objects 2.8 Library
  Call adoFile.Open
  Call adoFile.LoadFromFile(sDirFile)
  sFileContent = adoFile.ReadText
  adoFile.Close
  
  For Each vLine In Split(sFileContent, vbNewLine)
    'スペース区切りとして読み込む
    Do While InStr(vLine, Space(2))
      vLine = Replace(vLine, Space(2), Space(1))
    Loop
    asItem = Split(vLine)
    If UBound(asItem) = 8 Then
      If asItem(8) = "." Or asItem(8) = ".." Then
        '. or ..
      Else
        If Left(asItem(0), 1) = "d" Then
          'フォルダは再帰呼出
          Call FTP_DiffListup(cDiff, sSubDir & asItem(8) & "/")
        Else
          'ローカルにしかないファイルを削除するために存在ファイルを消し込む
          For idx = cTarget.Count To 1 Step -1
            If cLocalFiles(idx) = asItem(8) Then Call cLocalFiles.Remove(idx)
          Next
          'ファイルの場合は更新時間を比較
          sSeverTime = Format(CDate(asItem(5) & " " & asItem(6) & " " & asItem(7)), "mm/dd hh:nn")
          sLocalFile = "C:\home\cfsid\cfsid.cloudfree.jp\" & Replace(sSubDir, "/", "\") & asItem(8)
          If Dir(sLocalFile) = "" Then
            'サーバのみに存在するファイル
            sLocalTime = "[NEW]"
          Else
            sLocalTime = Format(FileDateTime(sLocalFile), "mm/dd hh:nn")
          End If
          '更新日時に差がある場合は、サーバからダウンロード必要として格納
          If sSeverTime <> sLocalTime Then
            cDiff.Add sSubDir & asItem(8)
          End If
        End If
      End If
    End If
  Next

  'ローカルにしかないファイルを削除する(Option指定の場合)
  Dim vItem As Variant
  If fKillLocalOnly Then
    For Each vItem In cLocalFiles
      Kill "C:\home\cfsid\cfsid.cloudfree.jp\" & vItem
    Next
  End If
  
  Kill sDirFile
End Sub

dirコマンドで取れる1行は
-rw—-r– 1 cfsid_ftpuser@cfsid.cloudfree.jp 1000 102400 Dec 7 23:59 myimage.jpg
という内容で”Dec 7 23:59″がタイム情報。
年と秒が欠けてますけど、これをCDateにかけると今年と00秒で埋めてくれてます。1年経つとどうなるか確かめてませんがとりあえずこれでよしとします。2024年10月問題?ということに。

2023.12.27 追記
この部分は
phpのFTP関数でローカルファイルをサーバと同じにする処理を走らせる
で後日アップデートしました。


以上で「1クリックでローカル更新」が完成しました。

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog