web-dev-qa-db-ja.com

WordPressのカスタムURLマスキングではないリダイレクトの書き換え

次のコードがプラグインにあります。これは、url /stores/directory/foorbar/へのリクエストを受け取り、GET変数としてfoobarを渡すためのものです。

function pcrr_rewrite_rules($a) {
    $k = array('stores/directory/([^/]+)/?$' => 'index.php?pagename=directory&pod_store_id=$matches[1]');
    return $k + $a;
}
add_filter('rewrite_rules_array', 'pcrr_rewrite_rules');

# Flush existing rules and rewrite
function pcrr_activate() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
register_activation_hook(__FILE__, 'pcrr_activate');

予想される動作は、/stores/directory/foobar/へのリクエストが代わりにindex.php?...をロードすることです。ただし、リクエストが処理されている間は、リクエストはマスクされるのではなくURLにリダイレクトされます。たとえば、/stores/directory/foobar/への要求は/stores/directory/にリダイレクトされます。

この動作を修正する方法について何か考えはありますか。

乾杯!

2
Lachlan McD.

Quick'n'dirtyクラスで以下のことを行います(パーマリンクのために管理者設定で手動でフラッシュする必要があります):

<?php
/**
 * Add query args & vars & redirect stuff somewhere else
 * Could be extended to support arrays of query args on input
 * @package Rewrite Class
 * @author F.J.Kaiser
 */
class wpseAddRewriteRules
{
    var $file_name;
    var $query_arg;
    var $query_var;

    function __construct( file_name, query_arg, query_var )
    {
        $this->file_name    = $file_name;
        $this->query_arg    = $query_arg;
        $this->query_var    = $query_var;

        add_action( 'wp_loaded', array( &$this, 'add_rewrite_rule') );
        add_filter( 'query_vars', array( &$this, 'add_query_vars') );
        add_action( 'parse_request', array( &$this, 'parse_request') );
    }


    function add_rewrite_rule()
    {
        add_rewrite_rule( 
             "{$this->file_name}.php$"
            ,"index.php?{$this->query_arg}={$this->query_var}"
            ,'top' 
        );
    }


    function add_query_vars( $query_vars )
    {
        $query_vars[] = $this->query_arg;
        return $query_vars;
    }


    function parse_request( &$wp )
    {
        if ( array_key_exists( $this->query_arg, $wp->query_vars ) ) {
            include plugin_dir_path( __FILE__ )."{$this->file_name}.php";
            exit();
        }
        return;
    }
}

注:私の頭脳の裏側に書かれているだけなので、何にも保証はありません。タイプミスなどはそこに隠れているかもしれません

1
kaiser