XPressME Integration Kit

フォーラム

Re: WP Super Cacheのプラグイン導入時のXPressMEハック

#3000
toemon
キーマスター

uemeraさん、ようこそ。

読みにくいコードを追っかけていただき、ありがとうございます。

まず

/include/add_xpress_process.php

13行目付近

$_SERVER['REQUEST_METHOD'] = 'POST';

をコメントアウトしました。

の部分ですが、

このコードの上部にある拙いコメントにあるように、

XOOPSのイベント通知(プライベートメッセージ)、それも公開予約している記事が公開になったときの処理の為に、追加しています。

具体的には

WordPressは予約投稿があった場合、ユーザがサイトを訪れた際に、公開日時をチェックして、必要であれば公開するという手順を踏んでいます。

ここで、WordPressが記事を公開した時のイベントをフックして、XOOPSのイベント通知をコールする訳ですが、(これを行わないと、多くのXOOPSモジュールのように、予約投稿をしても、イベント通知は投稿をポストした時点で行われてしまいます。)

XOOPSのほうはというと、XOOPSのデータベース接続にはDatabaseSafe、とDatabaseProxyがあって、

$_SERVER != ‘POST’のときは、DatabaseProxyで接続されます。

ここで、DatabaseProxyの場合は SELECT文しか通さず、INSERTやUPDATEなどのデータベース書き込み操作が禁止されます。

つまり、プライベートメッセージをDBに書き込み出来ないという事態が発生します。

で、苦肉の策が、$_SERVER = ‘POST’;の追加というわけです。

強いて、やるとすれば

<code>$_SERVER['REQUEST_METHOD'] = 'POST';<br />
<br />
require_once $xoops_config->xoops_mainfile_path; //It is necessary to execute it for the user attestation before wp-settings.php.</code>

の部分を

<code>$request_method =  (isset($_SERVER['REQUEST_METHOD'])) ? $_SERVER['REQUEST_METHOD'] : '';<br />
$_SERVER['REQUEST_METHOD'] = 'POST';<br />
require_once $xoops_config->xoops_mainfile_path; //It is necessary to execute it for the user attestation before wp-settings.php.<br />
$_SERVER['REQUEST_METHOD'] = $request_method;</code>

とすることで、XOOPS側をだまし打ちできるかも知れません。

イベント通知の方は当方で確認いたしますので、

WP Super Cacheのほうはuemeraさんのほうで確認いただけないでしょうか?

クッキーのほうは、要するにクッキー名の頭にモジュール名を使用すると、モジュールの命名によっては

WP Super Cacheの

preg_match( “/^wp-postpass|^wordpress|^comment_author_/”, $key )の判断に引っかかる場合があるので、一致させないための、プレフィックスを追加する必要がある、という解釈で宜しいでしょうか?

そういう意味では、include/set_cash_cookie_path.phpにある

USER_COOKIE

PASS_COOKIE

AUTH_COOKIE

SECURE_AUTH_COOKIE

LOGGED_IN_COOKIE

TEST_COOKIE

などのdefineも対象になりそうなのですが、

set_cash_cookie_path.phpでdefineしない素のwordpress では、wp-setting.phpの432行目あたりからの設定で

クッキーの先頭にwordpressが設定されているのにも関わらず引っかからないということは、対象外と考えてよいということでしょうか?