WordPressの管理画面でプラグインを使わずに画像をアップロードするFormを作成

Wordpressでプラグインを使わずに画像をアップロードするフォームを作ります。

media-lib-uploader.jsの作成

任意の場所にmedia-lib-uploader.jsを作成してください。

media-lib-uploader.jsでWordpressのメディアAPIを利用できるようにする

media-lib-uploader.jsにおいてWordpressのメディアAPIが使用できるようにします。

functions.phpに以下のコードを実装してください。

 function my_enqueue_media_lib_uploader() {
  wp_enqueue_media();
   
   wp_register_script( 'media-lib-uploader-js', '/path/to/media-lib-uploader.js');
	 wp_enqueue_script( 'media-lib-uploader-js' );
 }
 add_action('admin_enqueue_scripts', 'my_enqueue_media_lib_uploader');

管理画面にFormを描画させる

functions.phpに以下のコードを実装してください。


function add_custom_column() {
   
    add_meta_box(
        'image',
        '画像を登録',
        'on_image',
        'image',
        'side',
        'high'
    );
}
add_action('admin_menu','add_custom_column');

function on_image($post){
  //すでに画像がアップロードされている場合は表示させる
  $image = get_post_meta($post->ID,'image',true);

  $vals = array(
    '<form  method="POST">',
    '<p>',
    '<label>カスタム画像</label><br>',
    sprintf('<input class="image-url normal" type="text" value="%s" name="image" />',$image),
    sprintf('<img src="%s" width="50" height="50" class="image">',$image),
    '<input class="upload-button" type="button" class="button" value="Upload Image" />',
    '</p>'
    '<input type="submit" value="Submit" />',
    '</form>'
  );
  foreach($vals as $val){
    echo $val;
  }

}

upload-buttonクラスを持つボタンをクリックした時のイベントを実装

media-lib-uploader.jsに以下のコードを実装します。



var $ = jQuery;
$(document).ready(function(){

    var mediaUploader;
    $('.upload-button').click(function(e) {
      e.preventDefault();

      if (mediaUploader) {
        mediaUploader.open();
        return;
      }

      mediaUploader = wp.media.frames.file_frame = wp.media({
        title: 'Choose Image',
        button: {
          text: 'Choose Image'
        }, multiple: false });


        mediaUploader.on('select', function() {
          attachment = mediaUploader.state().get('selection').first().toJSON();
          $('.image-url').val(attachment.url);
          $('.image-path').attr('src',attachment.url);
        });

        mediaUploader.open();
      });
})

記事を更新するタイミングでアップロードした画像を保存する

最後に記事を更新するタイミングでアップロードしたタイミングで画像を保存します。

functions.phpに以下のコードを実装してください。

add_action('save_post','save_image');
function save_image(){
  if(!get_post()){
    return;
  }
  $id = get_post() -> ID;

  if(isset($_POST['image'])) {
    $image = $_POST['image'];
    update_post_meta( $id, 'image', $image);
  }

}


boto3でEC2のインスタンスを起動/再起動する

boto3のインストール

pipでboto3をインストールします。

pip install boto3

認証周りの準備

~/.aws/credentialsに以下のようにアクセスキー、シークレットアクセスキーをセットします。今回はdefaultのプロファイルを使用して認証します。

[custom]
aws_access_key_id =  xxx
aws_secret_access_key = xxx

次に~/.aws/configにregionをセットします。

[default]
region=ap-northeast-1

プログラムを作成

EC2のインスタンスIDを引数にとって起動・停止させるプログラムを作成します。

import boto3
def start(ami):
    try:
        print('ec2 > start')
        ec2 = boto3.resource('ec2')
        instance = ec2.Instance(ami)
        instance.start()
    except Exception as err:
        print(err)


def stop(ami):
    try:
        print('ec2 > stop')
        ec2 = boto3.resource('ec2')
        instance = ec2.Instance(ami)
        instance.stop()
    except Exception as err:
        print(err)

node.jsで定期的にスクリプトを実行するにはpm2が便利

定期的にスクリプトを実行するには定期的にタスクを実行させるnode-cronとプロセス管理ツールのpm2でスクリプトをデーモン化することによって実現できます。

例えば、毎日午前6時にgood morningを表示するだけのcron.jsを作成してみます。

インストール

まずはpm2とnode-cronをインストールします。

npm install pm2 -g 
npm install node-cron 

cron.jsを作成

定期的に実行するcron.jsを作成します。cronの詳しい表記はこのリンクが参考になります。

let cron = require('node-cron');
cron.schedule('0 0 6 * * *', () => {
  //定期的に実行する
  console.log('good morning');
});

scheduleの第一引数でスクリプトが実行される時刻を指定しています。左から秒、分、時、日、月、曜日となっています。アスタリスクは任意の時間を表しています。
第二引数のコールバックに処理内容を記述します。

pm2を使ってデーモン化

プロセスをデーモン化するのはとっても簡単です。

pm2 start cron.js

でデーモン化できます。また、プロセスを停止させるには

pm2 stop cron.js

を実行します。
logを表示させたい場合は

pm2 logs cron

を実行します。

[Postgresql] ローカルマシンから外部サーバー(Ubuntu)のDBに接続する

外部のIPアドレスからDBにアクセスできるようにするため、PostgreSQLサーバーの環境設定ファイルとなっている 外部サーバーのetc/postgresql/9.3/main/postgresql.confのlisten_address= …の箇所を

listen_addresses = '*'
に書き換えます。

次にPostgreSQL サーバーへの接続制限、認証方法に関する設定を行うための設定ファイルである、 /etc/postgresql/9.3/main/pg_hba.confに下記を追加します。

host all all ローカルマシンのIPアドレス/24 trust
自分のIPアドレスはwhat is my ipでGoogle検索をすると取得できます。

ちなみにすべてのホストからの外部DBへのアクセスを許可する場合は

host    all         all         0.0.0.0/0 md5
とします。