web-dev-qa-db-ja.com

Urlを介してプラグインファイルにアクセスできるようにする

私のWordPressプラグインには、ブログに関するいくつかの統計情報を生成して単純なテキストファイルとして出力するphpファイルがあります。 WordPressの機能にアクセスするために、ファイルの先頭にこれを追加しました。

define('WP_USE_THEMES', false);
require(dirname(__FILE__) . '/../../../wp-blog-header.php');

実際のURLはwp-content/pluginsディレクトリにあり、それをNice and shortという名前のものに置き換えてください。

http://example.com/wp-content/plugin/data-fetcher/list-data.php

-> rewrite to http://example.com/list-data

これを.htaccessに追加しました:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^list-data$ wp-content/plugins/data-fetcher/list-data.php [L]
</IfModule>

問題:短いURLにアクセスすると、ページに移動する前に301 Moved Permanentlyリダイレクトが表示されます。これは、wp-content/plugins/...というURLがブラウザに表示されることを意味します。

私はWordPressがどういうわけかこれを始めているのではないかと思います。書き換え規則は、画像やプレーンなphpファイル(つまりWPinclude/requireなし)ではうまくいきます。

私の仮定は正しいですか? WordPressがリダイレクトを送信しないようにするにはどうすればよいですか?

6
Mark

マーク、

私はそれを言うのは嫌いですが、あなたはこれについて間違ったやり方をしています。あなたのプラグインのPHPファイルはneverのように直接アクセスされるべきです。代わりに、それらは他のすべてのものと同じようにWordPress内からロードされるべきです。

これがあなたがたどることができるいくつかの代替パスです:

あなたの統計を表示する管理ページを作成します

これは、認証されたユーザーだけがWordPress内からアクセスできるページです。正しいAPIを使用すると、このページは非常にきれいに見え、必要な場合でも単純な統計が表示されます。最初はWordPressの内部にあるので、wp-blog-header.phpを直接読み込む必要なしにWP AP​​I全体にすでにアクセスできます。

既存のシステムを使いますが、WordPressで書き換えを登録します

.htaccessファイルを直接変更しないでください。このファイルは、新しいプラグインを追加したり、パーマリンク構造を変更したりすると変更できます。つまり、カスタマイズ内容が失われることになります。代わりに、WordPress自身の中で関数呼び出しをすることによってカスタム書き換えを作成することができます。

add_action( 'init', 'my_rewrite' );
function my_rewrite() {
    global $wp_rewrite;

    add_rewrite_rule('list-data/$', WP_PLUGIN_URL . '/data-fetcher/list-data.php', 'top');
    $wp_rewrite->flush_rules(true);  // This should really be done in a plugin activation
}

これにより、カスタムルールがWordPressの書き換えルールの先頭に追加され、WordPressが正規表現に対して一致する他のリダイレクトはスキップされます。

このような単純な書き換えをプラグインに実装する方法の良い例として、かわいいログインURLのリダイレクトに関するOzhのチュートリアルを調べてください。

6
EAMann

あなたのURLにアクセスしたときにWordPressの中にカスタム変数を設定することもできます。その後、この変数を後で確認し、存在する場合は、必要なことをすべて実行できます。

この例では、変数としてwpse6891_statsを使用します。

// Register a URL that will set this variable to true
add_action( 'init', 'wpse6891_init' );
function wpse6891_init() {
    add_rewrite_rule( '^stats$', 'index.php?wpse6891_stats=true', 'top' );
}

// But WordPress has a whitelist of variables it allows, so we must put it on that list
add_action( 'query_vars', 'wpse6891_query_vars' );
function wpse6891_query_vars( $query_vars )
{
    $query_vars[] = 'wpse6891_stats';
    return $query_vars;
}

// If this is done, we can access it later
// This example checks very early in the process:
// if the variable is set, we include our page and stop execution after it
add_action( 'parse_request', 'wpse6891_parse_request' );
function wpse6891_parse_request( &$wp )
{
    if ( array_key_exists( 'wpse6891_stats', $wp->query_vars ) ) {
        include( dirname( __FILE__ ) . '/stats.php' );
        exit();
    }
}

get_query_var( 'wpse6891_stats' )を使って後でチェックすることもできます。

9
Jan Fabry