自作WordPress プラグイン「Simple FTP Upload」
プラグイン「Simply Staic」で生成した静的HTMLを本番環境へFTPアップロードするプラグインを探したのですが、良い物が無かったので自作しちゃいました。汎用性を持たせて、アップロード元ディレクトリとアップロード先サーバーを自由に設定できるようにしています。
ちなみに、方向は、「Linux -> Linux 」もしくは「Windows -> Linux 」にのみ対応しています。
使い方
- 以下のURLからZIPファイルをダウンロードしてください。
http://tool.hippo-lab.com/0002-wp-plugin-simply-ftp2/simple_ftp_upload.zip
(ダウンロードが怖い方はソースコードからインストールしてください。本頁末尾に記載しておきます。) - 「プラグイン」>「新規追加」>「プラグインのアップロード」>「ファイルの選択」と操作し、ダウンロードしたZIPファイルを選択。最後に「今すぐインストール」のボタンを押します。
- インストールすると「有効化」ボタンが現れるのでクリックしてください。
- 「SimpleFTP」>「設定」を選択しFTP情報を設定してください。
※なおディレクトリ指定は、必ず最後に「/」もしくは「\」を入れてください。
しょぼくてスマソ(;^ω^) - 「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;
?>