【wordpress】プラグインのクラス化

概要

wordpressプラグインをクラス化する場合に必要な情報です。

プラグインのクラス化

コンストラクタでhookを登録し、処理を実装します。

class XXX_Plugin
{
    // hookを登録します
    public function __construct() {
    }
}
new XXX_Plugin();

action hookへ関数を登録する場合には、呪文が必要になります。

array( $this, メソッド名 )

【参考】 関数リファレンス/add action - WordPress Codex 日本語版

メソッド呼び出しには$thisを付ける必要があります。

【参考】 WordPressプラグインをクラス定義する方法 | Developers.IO

定数の使い方

クラス化しない場合には、defineを使って定数を宣言します。この定数名はグローバルなので名前の生得に気を付ける必要がありました。クラス化するとクラス変数になるため、名前の衝突は気にしなくて済みます。

定数にはクラス変数としてアクセスする必要があります。

class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

【参考】 PHP: オブジェクト定数 - Manual

プラグインの有効化/無効化/削除で処理を実行する

それぞれのhookを実装します。

  • register_activation_hook
  • register_deactivation_hook
  • register_uninstall_hook

【参考】 WordPress でプラグインを無効化したときにオプションを消すには

これらのイベントでデータベースの作成・削除を行うことが多いと思います。

【参考】 WordPressのプラグインでデータベースを作成・削除・アップデートする方法

データベース作成が失敗した場合には、SQLコマンドの大文字化をしてみるよ良いかもしれません。

【参考】 WordPress の dbDelta() でテーブルが作成されない

uninstall_hookは、インスタンスがなくなっているのでstaticメソッドとして実装する必要があります。

【参考】 register_uninstall_hook でのクラスメソッド呼び出し – セルティスラボ

Windows 10/VirtualBox/Vagrantでvagrant upに失敗する件

概要

昨年(2015)夏に、Windows10にアップデートして以来、ずっとvagrant upできずにいましたが、以下の記事の方法でやっとできるようになりました。感謝です。 Pocket: Windows 10 + VirtualBox 5.0 + Vagrant 1.7.4 + VCCW 2.18.0 でのエラー回避

詳細

VirtualBoxをネットワークタイプを指定してインストールすると、vagrant upできるようになりました。

VirtualBox-5.0.10-104061-Win.exe  -msiparams NETWORKTYPE=NDIS5

現在は、Windows10 + VirtualBox(5.0.14) + vagrant(1.8.1)でvagrant upできています。

VirtualBoxのNDIS6ドライバ?がWindows10に対応していないということなのかな?

関連情報

【wordpress】検証環境構築方法

概要

本番環境のデータを使ってwordpress検証環境を作成してみました。

本環境と同じホストに検証環境を作成する場合、DB設定を間違えるとたいへんな事故(データの紛失)が起こる可能性があります。くれぐれもご注意ください。

最初は、ローカル環境で試してみてください。

方針

以下の検証環境を構築します。DB名だけでなく、ユーザ名、パスワードも変えている方が安全です。

本番環境 検証環境
URL http://wordpress.com http://test.wordpress.com
パス /var/www/wordpress /var/www/test.wordpress
DB名 wp test_wp

手順

ドメイン・ゾーンを編集します

test.wordpress.comを追加します。

バックアップを作成します

mysql

ユーザーは、権限があるユーザーであればroot以外でもOKです。

mysqldump -u root -p wp > xxx.dump
wordpress

同一ホストであればコピーできます。

# cp -rp /var/www/wordpress /var/www/test.wordpress
# chown -R apache:apache /var/www/html/test.wordpress

編集します

mysql

DBの中にある、http://wordpress.comを変更後のhttp://test.wordpress.comに変換します。

$ sed -e 's/http:\/\/wordpress.com/http:\/\/test.wordpress.com/g' xxx.dump < yyy.dump

検証環境用のDBを作成し、データをimportします。

$ mysql -u root -p
mysql> create database wp3 default character set utf8;
mysql> grant all privileges on test_wp.* to ユーザー名@localhost identified by 'パスワード';
mysql> exit;
$ mysql -u root -p test_wp < yyy.dump
wordpress

wp-config.phpのDBに関する設定を検証環境のものに変更します。 安全(secure)な名前/パスワードを設定してください。

define('DB_NAME', 'test_wp');

/** MySQL database username */
define('DB_USER', 'aaaa');

/** MySQL database password */
define('DB_PASSWORD', 'bob');

apacheの設定を変更します

/etc/httpd/conf/httpd.confを修正します。

検証環境には一般に公開しないので、Basic認証を設定していた方が良いと思います。

Basic認証のパスワード作成方法は、Webにたくさん存在します。たとえば、 Webサーバ構築〜Apacheインストール・Basic認証 - Qiitaを参照してください。

<VirtualHost *:80>
    DocumentRoot /var/www/test.wordpress
    DirectoryIndex index.php
    Options -Indexes
    ServerName test.workdpress.com

    <Directory /var/www/test.wordpress>
        AllowOverride All
        AuthUserFile /var/www/.htpasswd
        AuthName "Enter your ID and password."
        AuthType Basic
        require valid-user

        <fModule mod_rewrite.c>
            RewriteEngine On
            RewriteRule ^index\.php$ - [L]
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule . index.php [L]
        </IfModule>
    </Directory>
</VirtualHost>

apacheを起動します。

$ sudo service httpd reload

wordpress:ユーザー一覧取得

ユーザー一覧取得

検索条件を配列にセットして、検索を実行します。

    $args = array (
        'role' => 'reporter',
        'order' => 'ASC',
        'orderby' => 'display_name',
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key'     => 'キー名',
                'value'   => 値,
                'compare' => '='
            )
        )
    );
    $wp_user_query = new WP_User_Query( $args );
    $users = $wp_user_query->get_results();
    foreach ( $users as $user ) {
        echo "<p>" . esc_html( $user->user_email ) . "</p>";
    }

関連資料

メールサーバーのSPF登録しました

概要

gmailアドレス宛に送信したメールがスパムメールになりやすいということで、SPFレコードを登録しました。

SPFとは

SPF (Sender Policy Framework)とは、 電子メールの送信元ドメインが詐称されていないかを検査するための仕組みのようです。

日本ネットワークインフォメーションの説明がわかりやすいです。

SPFレコード登録

DNSレコードに以下のデータを追加します。

エントリ名@
タイプTXT
データv=spf1 ip4:XXX.XXX.XXX.XXX(ipアドレス) ~all

SPFレコード確認

Mac OS Xだと以下のコマンドで確認できます。

$ dig メールサーバ txt

dmarcian - SPF Surveyorでも確認できます。

関連情報

SSL証明書の整合性チェック

秘密鍵SSL証明書の整合性エラー

SSL証明書をインストールする場合、サーバー証明書秘密鍵が合わない場合、以下のエラーメッセージが出力されます。注)ここでは、メールサーバーはpostfix/dovecotで構築しています。

SSL証明書秘密鍵を設定します。
# vi /etc/dovecot/conf.d/10-ssl.conf

dovecot:設定を再読込します。
# /etc/init.d/dovecot reload

ログをチェックします。
# tail /var/log/dovecot/dovecot.log
...
Feb 11 10:42:41 imap-login: Fatal: Can't load private ssl_key: Key is for a diff
erent cert than ssl_cert
...

整合性チェック

SSL証明書を取得している時点では以下のファイルを持っているはずです。この中の前半2ファイルは、SSL証明書の申請者が作成します。server.csrファイルに基づき、サーバー証明書と中間証明書を発行してくれます。

ここを参考に、秘密鍵サーバー証明書の整合性をチェックします。

$ openssl x509 -noout -modulus -in 証明書ファイル | md5sum
$ openssl rsa -noout -modulus -in 秘密鍵ファイル | md5sum

メールサーバーのSSL化は無事に完了しました。

原因

整合性エラーが発生したのは、メールで送信された証明書のコピペミスでした。今回使った、アルファSSLは、証明書をメール本文に埋め込んでいます。コピペを失敗するのもアレですが、添付ファイルとして送信くれていたら...と思います。

整合性チェック方法を学ぶことが出来たのでよしとします。

参考資料

Tensor flow:reactivekk社のデモを動かしてみました

概要

前回は、GoogleTensorflowを試してみました。今回は、はじめてのテンサーフローワークショップに参加しました - Qiitaテンサーフローワークショップの題材となった、reactivekk社が公開しているデモを動かしてみました。ipython notebookを使って、結果をブラウザ上に出力するデモです。計算モデルが可視化されるすぐれものです。

MacOSX Yosemiteで実行しています。

tensor flow実行環境を構築します

python環境を構築します

pythonはHomebrewを使ってインストールしました。

$ brew install python
$ python -V
Python 2.7.10

python用パッケージマネージャーをインストールします。

$ sudo easy_install pip
$ pip --version
pip 7.1.2 from /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)

tensor flow実行環境を準備します

virtualenvを使います。virtualenvは以下の特長を持っています。詳しくは、Amazon.co.jp: Pythonプロフェッショナルプログラミング第2版を参照してください。

  • OSの管理権限を持っていなくてもPythonライブラリをvirtualenv内だけに自由にインストール出来ます。
  • 目的別にライブラリをインストールするので不要なライブラリに邪魔されることがありません。
  • 使わなくなったらディレクトリごと削除できます。
  • activate/deactivateコマンドでvirtualenv環境ON/OFFを切り替えることができます。

MacOSX Yosemiteから、一部のディレクトリにファイルを書き込むことができなくなったため、virtualenvを使った方が問題が発生する可能性が少ないです。

適当なディレクトリにvirtualenvを作成して、activateします。

$ cd work/python
$ virtualenv tensorflow
$ source tensorflow/bin/activate
(tensorflow)[~/work/python]$

tensorflowをインストールします。

(tensorflow)[~/work/python]$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

reactivekk社のデモ実行環境を構築します

python notebookが動く環境を構築します。

jupyterをインストールしないと、ImportError: No module named notebook.notebookappというエラーがでます。詳しくは、 pip install jupyterを参照してください。

$ pip install ipython
$ pip install numpy matplotlib
$ pip install jupyter

python notebookを実行します。ブラウザ上にページが開きます。

(tensorflow)[~/work/python]$ ipython notebook
[I 06:19:41.965 NotebookApp] Serving notebooks from local directory: /Users/unokun/work/python
[I 06:19:41.965 NotebookApp] 0 active kernels
[I 06:19:41.965 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I 06:19:41.966 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

f:id:unokun3:20160202065314p:plain

reactivekk社のデモを実行します

モジュールをダウンロードします

適当なディレクトリにモジュールを取得します。

$ git clone https://github.com/reactivekk/tensorflow-getting-started.git

モジュールをアップロードします

python bookで実行している画面でuploadボタンを押下し、ダウンロードしたファイル(TensorFlow Mnist.ipynb)をアップロードします。以下が出力されれば成功です。

f:id:unokun3:20160202065324p:plain

おまけ

pipでインストールしたモジュール一覧は以下のコマンドで調べることができます。

(tensorflow)[~/work/python]$ pip freeze
appnope==0.1.0
backports-abc==0.4
backports.ssl-match-hostname==3.5.0.1
certifi==2015.11.20.1
cycler==0.9.0
decorator==4.0.6
functools32==3.2.3.post2
gnureadline==6.3.3
ipykernel==4.2.2
ipython==4.0.3
ipython-genutils==0.1.0
ipywidgets==4.1.1
Jinja2==2.8
jsonschema==2.5.1
jupyter==1.0.0
jupyter-client==4.1.1
jupyter-console==4.1.0
jupyter-core==4.0.6
MarkupSafe==0.23
matplotlib==1.5.1
mistune==0.7.1
nbconvert==4.1.0
nbformat==4.0.1
notebook==4.1.0
numpy==1.10.4
path.py==8.1.2
pexpect==4.0.1
pickleshare==0.6
ptyprocess==0.5
Pygments==2.1
pyparsing==2.0.7
python-dateutil==2.4.2
pytz==2015.7
pyzmq==15.2.0
qtconsole==4.1.1
simplegeneric==0.8.1
singledispatch==3.4.0.3
six==1.10.0
tensorflow==0.5.0
terminado==0.6
tornado==4.3
traitlets==4.1.0
wheel==0.24.0

関連資料