カテゴリー : WordPress

wp_mail メールを2通送信する怪

wp_mail()を利用した1回のコールで2通送信するという理由の分からない現象が発生、アレコレやっている内に正常に戻った(1通の送信)、という不思議な現象があったので書き留めておきます。

最初はプログラムミスで2度コールされたかと疑って確認しましたが、それはなかったでした。

メール送信する関数を他の機能でもコールしているのでそちらの方を実行したところ、そちらは1通しか送信されませんでした。データの誤りも確認しましたがそれも原因ではないようでした。

PHPのバージョンが5.3.29だったので5.4.35に変更して試してみましたが、やはり2通送信されました(さくらのレンタルサーバ)。

ところでChromeで管理画面からバージョンの切替えを実行すると、何故かログイン画面に移動してしまい、ログインし直してバージョンを確認しても切り替わっていませんでした。たまにこういうことが起こるので、操作はFirefoxから実行しました。

wp_mail()が原因かどうか確認するためmb_send_mail()に変更してみると、同じように2通送信されてしまいました。

そこでhttpデータを確認するためFirefoxのLive HTTP Headersアドオンを利用してキャプチャしてみましたが、同じセッションが2回繰り返されていることはありませんでした。

ところがです。この後の操作からmb_send_mail()も、元に戻したwp_mail()も正常に1通のみ送信するようになりました。

何が原因かは分かりません。こちらの手の届かない部分で発生した現象と考え、先に進むことにしました。

その後…

Chromeから操作すると、また2通送信されてしまいました。そこでFirefoxから操作してみましたが同様でした。再度Live HTTP Headersを操作すると、Firefoxからサイトをアクセスする限り2通送信されることはありませんでした。

 

WordPress サクラインターネットcronでwp-cron実行

WordPressでスケジュールに合わせてメール送信機能を作るにはwp-cron機能を利用しますが、WordPress自身では定時動作ができないため外部からのアクセスが必要になります。

そこで、サクラインターネットのレンタルサーバー上でcrontabを利用して正確な時間で動作するようにするための設定方法を、備忘録として残します。

環境はスタンダード契約、WordPress4.1、PHP5.3 です。

crontabの設定方法

設定は実行日時と実行コマンドを設定すれば良いだけの話なのですが、PHPを実行するコマンドの設定に注意する必要がある。

設定例は次の通り。

/usr/local/bin/php /home/USER_DIRECTORY/FILE_NAME 1> /dev/null

環境変数を設定できるようだが、コマンドを絶対パスで指定すればそれで動作する。出力は「1> /dev/null」でnullデバイスへ。また、「cd /home/USER_DIRECTORY; 」としてコマンドを1行に続けて入力するのもOK。

WordPressの設定

wp-cronとtabcronで検索すると多くの記事が見つかるが、crontabを利用して「wp-cron.php」を呼び出す場合はwp-config.phpで「WP_DISABLE_CRON」を「true」に定義する必要があるようだ。理由は確認していないが、サーバー上のコマンド実行とインターネットからのアクセスが被ると不具合があるのではないかと思う。

なお忘れてはならない大事なことは、「wp_schedule_event」または「wp_schedule_single_event」で忘れずにcron動作するようにスケジューリングしておくこと。

ということでサーバーのコントロールパネル上で指定する実行コマンドは次のようになる。

/user/local/bin/php /home/USER_DIRECTORY/wp-cron.php 1> /dev/null

 

WordPress 4.0 マルチサイトのアップグレードでSSLエラー

最近SSLを設定したサイトで、WordPressのマルチサイト機能を利用したサイトの運用を始めました。

今回SSLサイト上では初めてのアップグレード作業になるので、作業するか躊躇しましたが思い切って実行したところ、「ネットワークの更新」でSSLのチェックでエラーが出てしまいました。

ネットワークの更新ではデータベースが更新されるようですが、詳細な内容は確認していないのでよく知りません。が、取りあえずはアップグレードを正常に終了したいと思いました。

Google先生に問い合わせたところ、同じエラーで既に回避されたScottさんの記事が見つかりました。ありがとう、Scottさん、そしてGoogle。

SSL error when upgrading a WordPress Multisite Network

ネットワークの更新で、マルチサイトではSSLのチェックを実行しないようにするフィルターを設定したファイル「netword-upgrade-ignore-ssl.php」を「wp-content/mu-plugins」ディレクトリに置けばOKです。

ファイルの中身は2行です。

<?php
add_filter('https_ssl_verify', '__return_false');
add_filter('https_local_ssl_verify', '__return_false');

これで自分はアップグレードを終了することができました。

 

マルチサイトでupdate_welcome_user_emailフックが有効にならない件

WordPressでユーザー管理をする際の招待メールの送信、アクティベーションメールの送信などしたい場合、マルチサイトでサイトを構成するとそれらの機能を容易に利用できるようになります。

そうなるとユーザー管理も含めて送信内容を変更して、より業務に近い処理や文面を送信したくなる、という欲が出てきました。

そこでプラグインに機能を組み込みながら実装してみると、招待メールはフックを利用して容易にできました。が、アクティベーションメールを受け取ってユーザー登録と同時にメタデータを保存したり、登録完了メール文を差し替えるためのフック「update_welcome_user_email」に制御が一向に渡ってきません。

最初「admin_init」でフックを登録してましたが、wp-activate.php を見ると、どうも「admin.php」はロードしていないため「init」に変更してみました。ですがこれもダメで、プラグインのコンストラクタに変更しました。しかし、これもダメ。

アクティベーション処理では、どうもプラグインがロードされていないのではないかと疑ってみました。検索してみると、ありました。

wp-activate.php, without explanation, does not load site plugins

どうやら「WP_INSTALLING」定義を取り去るとプラグインがロードできるようになるようです。

ただし、マルチサイトにおいて何のためなのかハッキリしないため、どのような副作用があるか分かりません。

取りあえずこの状態で暫く動かしてみることにしようか思います。

後日譚:アクティベートの際プラグインをロードするように変更

WordPressのプログラムに直接手を加えるとアップデートをする度に書き換えする羽目になるので、避ける方法はないか試してみました。

テーマが幸いロードされるので、functions.phpでプラグインを直接ロードしてしまえば期待通りになるかも知れません。

そこで

if (defined('WP_INSTALLING')) {
    require ABSPATH . 'wp-content/plugins/{directory_name}/{file_name}';
}

とfunctions.phpに登録して試してみたところ、動作しました。WordPressは本当に柔軟性のあるシステムだと思います。

(140828)

メディアアップロードのファイルサイズ変更

この内容は後ほど清書する予定…です。

WordPress のマルチサイトを利用して .zipファイルをメディア機能でアップロードしようとすると、セキュリティエラーが表示されてアップロードできなかった。マルチサイトでなければできるのに。

特権管理者でログインし、管理画面「設定ーネットワーク設定」の「アップロード可能なファイル形式」に「zip」を追加する事でアップロードできるようになった。

アップロードできるサイズも制限があるので10Mに設定した。

さて3Mほどのデータをアップロードをしようとすると、「アップロードは2Mまで」というエラーが表示されて実行できなかった。

どうやらphp.iniの設定によるものらしい。

参考記事:アップロードできるファイルサイズの上限

で、さくらインターネット共有サーバーの場合、管理ページから設定できるとのこと。

参考記事:さくらインターネットのPHPの設定を変える

大変助かりました。ありがとうございました。

さてPHPでのアップロードファイルサイズは、php.iniの設定で「post_max_size」、「upload_max_filesize」、「memory_limit」などが関係するので良く確認して設定した方が良いようだ。

参考ページ:PHP Manual コア php.ini ディレクティブに関する説明 の中段 post_max_size の項

以上、取り急ぎのメモでした。