2016年3月7日月曜日

ブログの引越し!(゚∀゚)キタコレ!!

ブログが引越しというか部署ごとにやっていたブログが統合されました。
今後は下記URLの方で記事を書いていきます( ´∀`)bグッ!

■新URL
http://k-1blog.com/

宜しくお願いします(`・ω・´)ゞビシッ!!

2015年3月4日水曜日

WordPressに自作プラグインを作成して記事を自動投稿する

前回、PHPファイルを実行して記事とアイキャッチ画像を更新しましたが、今回はこれをWordPress上に自作プラグインとして作成し、実行したいと思います。

作成したプラグインのファイルは/wordpress/wp-content/pluginsに保存してください。

まず、作成するプラグインのPHPファイルの先頭に以下のコメントを記述します。
/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/

次に管理メニューを追加します。
 add_action('admin_menu', 'add_pages');
function add_pages() {
    add_menu_page(
        '記事投稿設定', //HTMLタイトルテキスト
        '記事投稿設定', //管理画面のメニュー上での表示名
        'level_8', //このメニューページを閲覧・使用するために最低限必要なユーザーレベルまたはユーザーの種類と権限
        __FILE__, //メニューページのコンテンツを表示するPHPファイル
        'option_page' //メニューページにコンテンツを表示する関数
    );
}
















現れました。
これだけでは有効化しても何もできないので、オプション画面を記述していきます。
ボタンがクリックされたら記事を投稿できるようにしました。
function option_page(){

    //投稿実行ボタン押下で記事を1つ投稿
    if( isset($_POST['post_flag']) ){
        registPostArticle();
    }
    echo << EOD
        

記事投稿設定


EOD; }

あとは前回と同じです。
/******************************************
 * 記事を投稿する
 *******************************************/
function registPostArticle(){

    $_SERVER = array(
            'HTTP_HOST' => 'your_site_domain',
            'REQUEST_URL' => '../'
            );

    require_once( '../wp-load.php');

    //投稿用パラメーター
    $hPostInfo = array(
            'post_title' => 'テストタイトル',
            'post_content' => 'テスト本文',
            'post_status' => 'publish'
            );

    //投稿実行
    $nInsertId = wp_insert_post($hPostInfo);

    if( $nInsertId ){

        registPostThumbnailImages( $nInsertId );

    }else{
        echo( "UPLOAD FILE FAILED \n"  );
    }
}

/*******************************************************************
 * アイキャッチ画像(サムネイル)を投稿記事に紐付けてアップロードする
 ********************************************************************/
function registPostThumbnailImages( $nInsertId ){

    //アイキャッチ画像情報
    $sImageUrl = 'http://food.foto.ne.jp/img/thumb_kd.jpg';
    $sFileName = basename($sImageUrl);
    $sFileType = wp_check_filetype($sFileName, null);

    //画像保存ディレクトリに画像情報を保存する
    $sUploadDir = wp_upload_dir();
    $sData = file_get_contents($sImageUrl);
    $sUploadImageName = $sUploadDir['path'] . "/" . $sFileName;
    $fpc = file_put_contents( $sUploadImageName, $sData );

    //画像を保存できたらメディアライブラリで再生成する
    if( $fpc ){

        //アイキャッチ設定
        $hAttachment = array(
                'post_mime_type' => $sFileType['type'],
                'post_title' => sanitize_file_name($sFileName),
                'post_content' => '',                'post_status' => 'inherit',
                );

        $file = $sUploadDir['path'] . '/' . $sFileName;

        //アイキャッチ画像を挿入
        $nAttachId = wp_insert_attachment( $hAttachment, $file, $nInsertId );
        require_once( ABSPATH . 'wp-admin/includes/image.php');

        //画像添付ファイルのメタデータを作成する
        $hAttachData = wp_generate_attachment_metadata( $nAttachId, $file );

        //画像ファイルを再作成する
        wp_update_attachment_metadata( $nAttachId, $hAttachData );

        //サムネイル生成
        set_post_thumbnail( $nInsertId, $nAttachId );

        echo( "POST COMPLATE \n" );

    }else{
        echo( "POST FAILED \n" );
    }

}














オプション画面が表示されました。
ボタンをクリックして記事を投稿してみます。























わかりにくいですが、投稿に成功しています。


2015年3月3日火曜日

PHPからWordPressに記事を投稿する

PHPファイルを実行してWordPressに記事を投稿する方法について。

wp-load.phpでWordPress関数を呼び出し
→投稿オブジェクトを作成
→wp_insert_postで投稿
という流れになります。

指定できる投稿オブジェクトは以下の通り。
$post = array(
  'ID' => [ <投稿 ID> ] // 既存の投稿を更新する場合。
  'menu_order' => [ <順序値> ] // 追加する投稿が固定ページの場合、ページの並び順を番号で指定できます。
  'comment_status' => [ 'closed' | 'open' ] // 'closed' はコメントを閉じます。
  'ping_status' => [ 'closed' | 'open' ] // 'closed' はピンバック/トラックバックをオフにします。
  'pinged' => [ ? ] // ピンバック済。
  'post_author' => [  ] // 作成者のユーザー ID。
  'post_category' => [ array(<カテゴリー ID>, <...>) ] // カテゴリーを追加。
  'post_content' => [ <投稿の本文> ] // 投稿の全文。
  'post_date' => [ Y-m-d H:i:s ] // 投稿の作成日時。
  'post_date_gmt' => [ Y-m-d H:i:s ] // 投稿の作成日時(GMT)。
  'post_excerpt' => [ <抜粋> ] // 投稿の抜粋。
  'post_name' => [ <スラッグ名> ] // 投稿スラッグ。
  'post_parent' => [ <投稿 ID> ] // 親投稿の ID。
  'post_password' => [ <投稿パスワード> ] // 投稿の閲覧時にパスワードが必要になります。
  'post_status' => [ 'draft' | 'publish' | 'pending'| 'future' ] // 公開ステータス。 
  'post_title' => [ <タイトル> ] // 投稿のタイトル。
  'post_type' => [ 'post' | 'page' ] // 投稿タイプ名。
  'tags_input' => [ '<タグ>, <タグ>, <...>' ] // 投稿タグ。
); 

http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_insert_post

というわけでサンプルを作成します。
# vi php-post-test.php
ini_set('display_errors', true);

function find_wordpress_base_path(){
    $dir = dirname(__FILE__);
    do {
        if( file_exists( $dir."/wp-config.php" ) ){
            return $dir;
        }
    } while( $dir = realpath("$dir/..") );
    return null;
}

define( 'BASE_PATH', find_wordpress_base_path()."/" );
require_once( BASE_PATH.'wp-load.php');

$post_value = array(
    'post_title' => 'テストタイトル',
    'post_content' => 'テスト本文',
    'post_status' => 'publish'
);

wp_insert_post($post_value);

echo("post complate \n");

で実行
# php php-post.php
ログインできませんでした
なんかでましたorz
前回、サイトにBasic認証をかけていたのが問題のようで、とりあえずBasic認証を外して実行するとうまくいきました。







さらに投稿記事にサムネイル画像(アイキャッチ画像)を紐付けたいとします。
流れ的には ①画像のアップロード
→②メディアライブラリに画像を再生成
→③記事にアイキャッチ画像を添付
となります。

//①画像のアップロード
$sImageUrl = 画像のパス;
$sFileName = basename($sImageUrl);
$sFileType = wp_check_filetype($sFileName, null);

//画像保存ディレクトリに画像情報を保存する
$sUploadDir = wp_upload_dir();
$sData = file_get_contents($sImageUrl);
$sUploadImageName = $sUploadDir['path'] . "/" . $sFileName;
$fpc = file_put_contents( $sUploadImageName, $sData );

if( $fpc ){

    //②画像を保存できたらメディアライブラリで再生成する
    $hAttachment = array(
        'post_mime_type' => $sFileType['type'],
        'post_title' => sanitize_file_name($sFileName),
        'post_content' => '',
        'post_status' => 'inherit',
    );

    if( wp_mkdir_p($upload_dir['path']) ){
        $file = $sUploadDir['path'] . '/' . $sFileName;
    }else{
        $file = $sUploadDir['basedir'] . '/' . $sFileName;
    }
    //アイキャッチ画像を記事に紐付ける
    $nAttachId = wp_insert_attachment( $hAttachment, $file, $nInsertId );
    require_once( ABSPATH . 'wp-admin/includes/image.php');

    //画像添付ファイルのメタデータを作成する
    $hAttachData = wp_generate_attachment_metadata( $nAttachId, $file );

    //画像ファイルを再作成する
    wp_update_attachment_metadata( $nAttachId, $hAttachData );

    //③サムネイル生成
    set_post_thumbnail( $nInsertId, $nAttachId );

    echo( "POST COMPLATE \n" );
    }else{
        echo( "POST FAILED \n" );
    }
}else{
    echo( "UPLOAD FILE FAILED \n"  );
}

これを実行すると




























記事に紐づきました。
以上です。

2015年2月26日木曜日

WordPressのセキュリティ対策(2)

【4.SSL化】
サイトをSSL化することでパスワードの漏洩など防ぐことができます。
また、常時SSL化することでSEO効果があるそうです。
https://don2.net/sem/ssl-seo/

試しに自己証明書を作成してサイト全体をhttps接続にしたいと思います。

①OpenSSLのインストール
OpenSSLをダウンロードし解凍します。
# cd /usr/local/src/

# wget http://www.openssl.org/source/openssl-1.0.2.tar.gz

# tar xzf openssl-1.0.2.tar.gz


解凍したフォルダに移動し、インストールしていきます。
# cd openssl-1.0.2

# ./config

# make

# make install


これでOpenSSL自体のインストールが完了しました。

②自己証明書の作成
次に、専用のディレクトリを作成して自己証明書を発行していきます。
# mkdir /var/lib/ssl

# cd /var/lib/ssl


秘密鍵を作成します。
# openssl genrsa -out private.key -aes256 1024

Generating RSA private key, 1024 bit long modulus

........................++++++

................++++++

e is 65537 (0x10001)

Enter pass phrase for private.key:パスフレーズ

Verifying - Enter pass phrase for private.key:パスフレーズ


genrsa:RSA形式の秘密鍵を作成する
-aes128:128ビットのAES方式で暗号化する
1024:1024バイトの鍵を作成する

公開鍵を作成します。
# openssl req -new -key private.key -out server.csr

Enter pass phrase for private.key:パスフレーズ

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:JP

State or Province Name (full name) []:Tokyo

Locality Name (eg, city) [Default City]:Shinjuku

Organization Name (eg, company) [Default Company Ltd]:社名など

Organizational Unit Name (eg, section) []:所属部署など

Common Name (eg, your name or your server's hostname) []:ドメイン

Email Address []:スルー

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:スルー

An optional company name []:スルー


req:CSRファイルを作成する
-new:新規にCSRを作成する
-key 秘密鍵ファイル:秘密鍵のファイル名を指定する

デジタル証明書を作成します。
# openssl x509 -in server.csr -days 3650 -req -signkey private.key -out server.crt

x509:X509形式のデジタル証明書を作成する
-in CSRファイル:CSRファイル名を指定する
-days 日数:証明書の有効期限を指定する
-req:入力ファイルがCSRファイルであることを指定する
-signkey 秘密鍵ファイル:秘密鍵ファイルを指定する

③mod_sslの設定
ApacheでSSL暗号化通信を実行するにはmod_sslモジュールが必要です。

mod_sslモジュールがインストールされているか確認します。

# yum list installed mod_ssl

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64 error was

14: problem making ssl connection

 * base: ftp.iij.ad.jp

 * centosplus: ftp.iij.ad.jp

 * elrepo: ftp.ne.jp

 * epel: ftp.riken.jp

 * extras: ftp.iij.ad.jp

 * rpmforge: mirror.fairway.ne.jp

 * updates: ftp.jaist.ac.jp

Error: No matching Packages to list


インストールされていないようなので、インストールします。
# yum list install mod_ssl

インストールが完了すると/etc/httpd/conf.dにssl.confが生成されます。
秘密鍵とデジタル証明書を指定します。
# cd /etc/httpd/conf.d

# vi ssl.conf

SSLCertificateFile /var/lib/ssl/server.crt

SSLCertificateKeyFile /var/lib/ssl/private.key

Apacheを再起動します。
# /etc/init.d/httpd restart

④WordPress HTTPSの設定
最後にプラグインを使用してサイト全体をSSL化します。
WordPressの管理画面から「WordPress HTTPS」をインストールし、左メニューからHTTPSをクリックします。





















サイト全体をSSL化したいので
1.Force SSL Administration 管理画面をSSL設定
2.Force SSL Exclusively 個別ページにSSL設定
それぞれにチェックします。
3.URL Filtersで「/」を入力しルート以下でSSL通信を行うように設定します。

保存したらサイトを確認してみます。














オレオレ警告が出ていますが、SSL接続できていることが確認できました。
以上です。

2015年2月25日水曜日

WordPressのセキュリティ対策(1)

【1.Basic認証】
開発段階などで、WordPressをクローラーにインデックスされたくない場合、サイト全体にBasic認証を設定することでそれを回避できます。

プラグイン-新規追加よりBasic Authentication Settingをインストールし、プラグインを有効化します。


















設定-一般の下のほうに、BASIC認証のパスワードを設定する箇所があるので、記述して保存します。


















サイトにアクセスするとBasic認証が実行されているのがわかります。
非常に簡単にBasic認証を実装することができました。






















【2.Digest認証】
管理画面(/wp-admin/)にはDigest認証を導入したいと思います。
Digest認証を導入することで、ログインを含めて2段階認証となりセキュリティを高めることができます。
BASIC認証との主な違いは、BASIC認証が入力したIDパスワードを平文で通信するのに対し、Digest認証は暗号化して通信するのでネットワークの盗聴などに強いという点です。

プラグインが見当たらなかったため、実装していきます。

以下では/var/www/wordpress/wp-adminにアクセス制限をかけたいとします。

Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)に以下の設定を追加します。

<Directory "/var/www/wordpress/wp-admin">

  AuthType Digest

  AuthName "Secret Zone"

  AuthDigestDomain /wp-admin/

  AuthUserFile /etc/httpd/.htdigest

  Require user secret

</Directory>


htdigestコマンドでsecretユーザーとパスワードを設定します。

# htdigest -c /etc/httpd/.htdigest 'Secret Zone' secret

Adding password for secret in realm Secret Zone.

New password:

Re-type new password:


Apacheを再起動します。

# /etc/init.d/httpd restart


管理画面にアクセスするとDigest認証が実行されているのがわかります。




















【3.ログイン試行回数の制限】
wp-login.phpへの総当り攻撃を回避するため、Simple Login Lockdownを使用することでログインの試行回数の制限ができます。

1.と同様にプラグインをインストールし、有効化します。

一般-表示設定より設定します。
下記の例では5回のログイン失敗で60分のログイン禁止という設定になります。
















LinuxへのWordPressのインストール(2)

LAMP環境ができたのでWordPressの設定に入ります。

【1.データベースとユーザー作成】
WordPressで使うデータベースとユーザーをMySQLに作成します。
# mysql -u root -p

Enter password:

mysql> create database wp;

Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wp.* to wp@localhost identified by 'Kl-admin';

Query OK, 0 rows affected (0.00 sec)

【2.WordPressのインストール】
wgetで最新版をダウンロードします。
# cd /tmp

# wget http://ja.wordpress.org/wordpress-4.1.1-ja.tar.gz

--2015-02-25 16:15:09--  http://ja.wordpress.org/wordpress-4.1.1-ja.tar.gz

ja.wordpress.org をDNSに問いあわせています... 66.155.40.250, 66.155.40.249

ja.wordpress.org|66.155.40.250|:80 に接続しています... 接続しました。

HTTP による接続要求を送信しました、応答を待っています... 200 OK

長さ: 6634579 (6.3M) [application/octet-stream]

`wordpress-4.1.1-ja.tar.gz' に保存中



100%[========================================================>] 6,634,579    925K/s 時間 7.2s



2015-02-25 16:15:16 (900 KB/s) - `wordpress-4.1.1-ja.tar.gz' へ保存完了 [6634579/6634579]


ダウンロードしたファイルを解凍して、Apacheが読み込めるようにします。
tar zxvf wordpress-4.1.1-ja.tar.gz

wordpress/

wordpress/wp-mail.php

wordpress/wp-load.php

wordpress/wp-content/

wordpress/wp-content/themes/

~中略~

wordpress/wp-admin/options-reading.php

wordpress/wp-admin/press-this.php

wordpress/readme.html

d

# cp -r wordpress /var/www/

# chown -R apache.apache /var/www/wordpress

DocmentRootに関する設定を行い、設定内容を反映させます。
DocumentRoot "/var/www/wordpress" ← DocumentRootをWordPressのディレクトリに変更
<Directory "/var/www/wordpress"> ← DocumentRootと同じディレクトリに変更
     AllowOverride All ← .htaccessによるディレクティブの上書きを許可
</Directory>

# /etc/init.d/httpd restart

ここまでの設定でWordPressのダウンロードが完了しているので、あとはブラウザからインストールしていけばOKです。
が、






















なんかエラーでました。

# rpm -q php-mysql

パッケージ php-mysql はインストールされていません。


接続モジュールを入れ忘れていました。
というわけで入れなおしてApacheを再起動します。

# yum install php-mysql

# rpm -q php-mysql

php-mysql-5.3.3-40.el6_6.x86_64

# /etc/init.d/httpd restart






















今度はうまくいきました。
1.で作成したDB情報を入力します。






















インストールプロセスにしたがって必要項目を入力していきます。





















インストールが成功しました!


















以上です。

LinuxへのWordPressのインストール(1)

WordPress導入の手順をまとめておきます。
まずはWordPressを動かすのに必要なLAMP環境を構築します。

【1.Apacheのインストール・設定】
インストール実行
# yum -y install httpd

HTTPポート(80番ポート)を開放して外部からの接続を許可します。
# vi /etc/sysconfig/iptables

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -s 122.208.42.218/32 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT ←ココ!

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

-A OUTPUT -o lo -j ACCEPT


ファイヤーウォールの設定を反映します。
# /etc/init.d/iptables restart

iptables: ファイアウォールルールを消去中:                  [  OK  ]

iptables: チェインをポリシー ACCEPT へ設定中mangle filter n[  OK  ]

iptables: モジュールを取り外し中:                          [  OK  ]

iptables: ファイアウォールルールを適用中:                  [  OK  ]


Apacheを起動します。
# /etc/init.d/httpd start

httpd を起動中:  [  OK  ]



サーバー起動時にApacheを起動しておくよう設定します。

# chkconfig httpd on


【2.MySQLのインストール・設定】
インストール実行
# yum -y install mysql-server

MySQLを起動します。
# /etc/rc.d/init.d/mysqld start

MySQL データベースを初期化中:  Installing MySQL system tables...

OK

Filling help tables...

OK



To start mysqld at boot time you have to copy

support-files/mysql.server to the right place for your system



PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !

To do so, start the server, then issue the following commands:



/usr/bin/mysqladmin -u root password 'new-password'

/usr/bin/mysqladmin -u root -h v5364.vir.kagoya.net password 'new-password'



Alternatively you can run:

/usr/bin/mysql_secure_installation



which will also give you the option of removing the test

databases and anonymous user created by default.  This is

strongly recommended for production servers.



See the manual for more instructions.



You can start the MySQL daemon with:

cd /usr ; /usr/bin/mysqld_safe &



You can test the MySQL daemon with mysql-test-run.pl

cd /usr/mysql-test ; perl mysql-test-run.pl



Please report any problems with the /usr/bin/mysqlbug script!



                                                           [  OK  ]

mysqld を起動中:                                           [  OK  ]


サーバー起動時にMySQLを起動しておくよう設定します。
# chkconfig mysqld on


【3.PHPのインストール・設定】
インストール実行
# yum -y install php

タイムゾーンの設定を行います。
# vi /etc/php.ini

; Defines the default timezone used by the date functions

; http://www.php.net/manual/en/datetime.configuration.php

#ini.date.timezone
date.timezone = "Asia/Tokyo"

一旦、サンプルスクリプトを書いて表示してみます。
# cd /var/www/html/

# vi index.php



<?php

  phpinfo();

?>





















ApacheとPHPが動いていることは確認できました。
次回はいよいよWordPressの設定に入ります。