自作WordPress プラグイン「Simple FTP Upload」

wordpress,Web開発,システム開発,アイデア

プラグイン「Simply Staic」で生成した静的HTMLを本番環境へFTPアップロードするプラグインを探したのですが、良い物が無かったので自作しちゃいました。汎用性を持たせて、アップロード元ディレクトリとアップロード先サーバーを自由に設定できるようにしています。

ちなみに、方向は、「Linux -> Linux 」もしくは「Windows -> Linux 」にのみ対応しています。

使い方

  1. 以下のURLからZIPファイルをダウンロードしてください。

    http://tool.hippo-lab.com/0002-wp-plugin-simply-ftp2/simple_ftp_upload.zip
    (ダウンロードが怖い方はソースコードからインストールしてください。本頁末尾に記載しておきます。)

  2. 「プラグイン」>「新規追加」>「プラグインのアップロード」>「ファイルの選択」と操作し、ダウンロードしたZIPファイルを選択。最後に「今すぐインストール」のボタンを押します。
  3. インストールすると「有効化」ボタンが現れるのでクリックしてください。
  4. 「SimpleFTP」>「設定」を選択しFTP情報を設定してください。
    ※なおディレクトリ指定は、必ず最後に「/」もしくは「\」を入れてください。
    しょぼくてスマソ(;^ω^)
  5. 「SimpleFTP」>「実行」を選択し「FTP開始」ボタンを押して下さい。アップロードが開始されます。

ソースコード

以下にソースを記載しておきます。稚拙なプログラムで申し訳ないですが、とってもシンプルに書いたつもりです。改造、その他、ご自由にお使い下さいませ♪

<?php
/*
Plugin Name: Simple FTP Uploads
Description: FTPアップロード用プラグイン(使用例:Simple Staticで生成した静的コンテンツをWebサーバにFTPアップロード)
Author: shimada@hippo-lab.com
Version: 0.1
Author URI: https://hippo-lab.com
*/
class SimpleFtpUpload {
    
    function __construct() {
        add_action('admin_menu', array($this, 'add_plugin_admin_menu'));
    }

    //---------------------------------------------------------------------------------
    //管理画面メニュー追加
    function add_plugin_admin_menu() {
        //親メニュー FTP実行
         add_menu_page(
              'FTP設定',       // page_title
              'Simple FTP',    // menu_title
              'edit_posts',    // capability
              'simple-ftp',    // menu_slug
              array($this,'ftp_upload_page') , // function
              '', // icon_url
              100 // position
         );
        //サブメニュー FTP実行
         add_submenu_page(
              'simple-ftp',     // parent_slug
              'Simple FTP実行', // page_title
              '実行',           // menu_title
              'edit_posts',     // capability
              'simple-ftp',     // menu_slug (★親スラッグと一緒にして、親メニューを置き換え)
              array($this,'ftp_upload_page') // function
         );
         //サブメニュー FTP設定
         add_submenu_page(
              'simple-ftp',     // parent_slug
              'Simple FTP設定', // page_title
              '設定',           // menu_title
              'edit_posts',     // capability
              'simple-ftp-sub', // menu_slug
              array($this,'ftp_login_option_page') // function
         );
         
         //remove_submenu_page
    }

    //---------------------------------------------------------------------------------
    //FTPアップロード 設定オブション画面
    function ftp_login_option_page() {
    
        //$_POST['ftp_user_options'])があったらDBへオプション保存
        if ( isset($_POST['ftp_user_options'])) {
            $opt1 = $_POST['ftp_user_options']; //USER
            $opt2 = $_POST['ftp_pass_options']; //PASS
            $opt3 = $_POST['ftp_serv_options']; //SERV
            $opt4 = $_POST['ftp_port_options']; //PORT
            $opt5 = $_POST['ftp_srcd_options']; //SRC DIR
            $opt6 = $_POST['ftp_dstd_options']; //DST DIR
            
            update_option('ftp_user_options', $opt1);
            update_option('ftp_pass_options', $opt2);
            update_option('ftp_serv_options', $opt3);
            update_option('ftp_port_options', $opt4);
            update_option('ftp_scrd_options', $opt5);
            update_option('ftp_dstd_options', $opt6);
            ?><div class="updated fade"><p><strong><?php _e('Options saved.'); ?></strong></p></div><?php
        }
        ?>
        <div class="wrap">
        <div id="icon-options-general" class="icon32"><br /></div><h2>FTPアップロード設定</h2>
            <form action="" method="post">
                <?php
                // DBよりFTP設定オプション値を取得 (設定が無い場合はnullをセット)
                $opt1 = get_option('ftp_user_options');
                $opt2 = get_option('ftp_pass_options');
                $opt3 = get_option('ftp_serv_options');
                $opt4 = get_option('ftp_port_options');
                $opt5 = get_option('ftp_scrd_options');
                $opt6 = get_option('ftp_dstd_options');
                $show_user = isset($opt1['text']) ? $opt1['text']: null;
                $show_pass = isset($opt2['text']) ? $opt2['text']: null;
                $show_serv = isset($opt3['text']) ? $opt3['text']: null;
                $show_port = isset($opt4['text']) ? $opt4['text']: 21;   //デフォルト21
                $show_srcd = isset($opt5['text']) ? $opt5['text']: null;
                $show_dstd = isset($opt6['text']) ? $opt6['text']: null;

                // Windows対策
                $show_srcd=str_replace("\\\\","\\",$show_srcd);
                $show_dstd=str_replace("\\\\","\\",$show_dstd);

                // FTP設定画面を出力
                ?> 
                <table class="form-table">
                    <tr valign="top">
                        <th scope="row"><label for="inputtext">ユーザー</label></th>
                        <td><input name="ftp_user_options[text]" type="text" id="inputtext" value="<?php echo $show_user ?>" class="regular-text" /></td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label for="inputtext">パスワード</label></th>
                        <td><input name="ftp_pass_options[text]" type="password" id="inputtext" value="<?php echo $show_pass ?>" class="regular-text" /></td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label for="inputtext">サーバー</label></th>
                        <td><input name="ftp_serv_options[text]" type="text" id="inputtext" value="<?php echo $show_serv ?>" class="regular-text" /></td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label for="inputtext">PORT</label></th>
                        <td><input name="ftp_port_options[text]" type="text" id="inputtext" value="<?php echo $show_port ?>" class="regular-text" /></td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label for="inputtext">FTP元ディレクトリ(From)</label></th>
                        <td><input name="ftp_srcd_options[text]" type="text" id="inputtext" value="<?php echo $show_srcd ?>" class="regular-text" /></td>
                    </tr>
                    <tr valign="top">
                        <th scope="row"><label for="inputtext">FTP先ディレクトリ(To)</label></th>
                        <td><input name="ftp_dstd_options[text]" type="text" id="inputtext" value="<?php echo $show_dstd ?>" class="regular-text" /></td>
                    </tr>
                </table>
                <p class="submit"><input type="submit" name="Submit" class="button-primary" value="変更を保存" /></p>
            </form>
        <!-- /.wrap --></div>
        <?php
    }

    //---------------------------------------------------------------------------------
    //FTPアップロード 実行画面
    function ftp_upload_page() {

        //FTPアップロード実行処理
        if (isset($_POST["SubmitFTP"])) {
            echo "<p>==== FTP 開始 =====</p>";
            
            //DBよりオプション読込み
            $opt1 = get_option('ftp_user_options');
            $opt2 = get_option('ftp_pass_options');
            $opt3 = get_option('ftp_serv_options');
            $opt4 = get_option('ftp_port_options');
            $opt5 = get_option('ftp_scrd_options');
            $opt6 = get_option('ftp_dstd_options');
            $errmsg = "<p><font color='#FF0000'>エラー</font>: FTP先の情報が設定されていません</p>";
            $ftp_user = isset($opt1['text']) ? $opt1['text']: exit($errmsg);;
            $ftp_pass = isset($opt2['text']) ? $opt2['text']: exit($errmsg);;
            $ftp_serv = isset($opt3['text']) ? $opt3['text']: exit($errmsg);;
            $ftp_port = isset($opt4['text']) ? $opt4['text']: exit($errmsg);;
            $ftp_srcd = isset($opt5['text']) ? $opt5['text']: exit($errmsg);;
            $ftp_dstd = isset($opt6['text']) ? $opt6['text']: exit($errmsg);;
            
            //FTP接続
            $conn = ftp_connect($ftp_serv,$ftp_port) or die("<p><font color='#FF0000'>エラー</font>: FTP接続エラー</p>");;
            ftp_login($conn, $ftp_user, $ftp_pass)   or die("<p><font color='#FF0000'>エラー</font>: FTPログインエラー</p>");;
            ftp_pasv($conn, true)                    or die("<p><font color='#FF0000'>エラー</font>: FTP pasvモードエラー</p>");;
            
            //FTPアップロード(プライベート関数「ftp_lists」で再帰処理しリストを精製)
            $ftp_flists = $this->ftp_lists($ftp_srcd) or die("<p><font color='#FF0000'>エラー</font>: コピー元のディレクトリが存在しません</p>");
            foreach($ftp_flists as $ftp_srcfile){
                $ftp_dstfile = str_replace( $ftp_srcd, $ftp_dstd, $ftp_srcfile );
                
                //※1 Windows対策( Windows -> linuxの場合のみ)
                $ftp_dstfile = str_replace( "\\", "/", $ftp_dstfile);
                
                if (is_file( $ftp_srcfile )){
                    //ファイルの場合、ftp_put
                    ftp_put($conn, $ftp_dstfile, $ftp_srcfile, FTP_BINARY, false) or die("<p><font color='#FF0000'>エラー</font>:FTPアップロード失敗 [$ftp_dstfile]</p>");;
                    echo "<p>upload: $ftp_dstfile </p>";
                } else if(is_dir( $ftp_srcfile )){
                    //ディレクトリの場合、ftp_mkdir
                    ini_set('display_errors', 'Off'); //既にディレクトリが存在する場合も警告を非表示にする。
                    ftp_mkdir($conn, $ftp_dstfile);   //↑よって、エラーはあえてトラップしない。(失敗してもファイルアップロード時にコケる)
                    ini_set('display_errors', 'On');
                    echo "<p>makedir: $ftp_dstfile </p>";
                }
            }

            //FTPクローズ
            ftp_close($conn);
            echo "<p>==== FTP 完了 ====</p>";
        }
        //実行ボタン表示
        ?>
            <form action="" method="post">
                <p class="submit"><input type="submit" name="SubmitFTP" class="button-primary" value="FTP実行" /></p>
            </form>
        <?php   
    }

    //再帰関数 コピー元のディレクトリからファイルリストを作成
    private function ftp_lists($dir){
        
        $retval=false;
        if( is_dir($dir) )
        {
            $list = array();
            $files = scandir($dir);
            foreach($files as $file){
                if($file == '.' || $file == '..'){
                    continue;
                } else if (is_file($dir . $file)){
                    $list[] = $dir . $file;
                } else if( is_dir($dir . $file) ) {
                    $list[] = $dir .$file;
                    $list = array_merge($list, $this->ftp_lists($dir . $file .  DIRECTORY_SEPARATOR));
                }
            }
            $retval = $list;
        }
        return $retval;
    }

}

$simpleFtpUpload = new SimpleFtpUpload;



?>
Print Friendly, PDF & Email