web-dev-qa-db-ja.com

Add_rewrite_ruleとが必要です

_ソリューション_


私はUpdate 3を使っていて、それがうまくいった。私が誤解したのは、書き換え規則によってdesigners/?designer=some-designer&bid=9/designers/some-designerに変更されると私が信じていたことです。しかし、もちろんそれは逆です。


私はいくつかの研究をしてきましたが、私は add_rewrite_rule() の使い方があまり得られません。

この投稿 は私が必要としているものにかなり近いですが、私は本当にそんなに多くのコードが必要ですか?

私の現在のリンクはこれです:
http://www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9
欲しいのはこれです
http://www.norwegianfashion.no/designers/Batlak-og-Selvig/

  1. add_rewrite_rule()はどうやって使うのですか?
  2. デザイナーID(入札)を渡す必要があります。 URLに表示されていないのにre.writeルールを使用している場合、どうすればそれができますか?

更新1

私はこれを見つけました これはもう少し説明的です。しかし、うまくいきません。

function add_rewrite_rules( $wp_rewrite ) 
{
    $new_rules = array(
        '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='.
        $wp_rewrite->preg_index(1).'&bid='.
        $wp_rewrite->preg_index(2)
    );
       // Always add your rules to the top, to make sure your rules have priority
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action('generate_rewrite_rules', 'add_rewrite_rules');

function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}
add_filter('query_vars', 'query_vars')

更新2

これは私が試したもう一つの解決策です、それは別のスレッドでの Jan Fabry suggesten です。これを自分のfunctions.phpに入れましたが、効果はありません。

add_action('generate_rewrite_rules', 'add_rewrite_rules');
add_filter('query_vars', 'query_vars');

/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function add_rewrite_rules( $wp_rewrite ) 
{
    add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top');
    flush_rewrite_rules(false);
}


function query_vars($public_query_vars) {

    $public_query_vars[] = "designer";
    $public_query_vars[] = "bid";
    return $public_query_vars;
}

更新3
ここでいくつかの例を見つけました しかし、これはどちらもうまくいきません:(

add_filter('rewrite_rules_array','wp_insertMyRewriteRules');
add_filter('query_vars','wp_insertMyRewriteQueryVars');
add_filter('init','flushRules');  

// Remember to flush_rules() when adding rules
function flushRules(){
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// Adding a new rule
function wp_insertMyRewriteRules($rules)
{
    $newrules = array();
    $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]';
    return $newrules + $rules;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars)
{
    array_Push($vars, 'designer');
    return $vars;
}

Update 4 私もこの解決策を試しましたが、それでも成功しません。

add_filter('search_rewrite_rules', 'designers_createRewriteRules');

function designers_createRewriteRules($rewrite) {
global $wp_rewrite;

// add rewrite tokens
$designer_token = '%designers%';
$wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers=');

$bid_token = '%bid%';
$wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid=');

$keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token";
$keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);

return ( $rewrite + $keywords_rewrite );

}

更新5
私の書き換え規則は追加されていないようです。次のような新しいルールを実行した後に実行すると、print_r($wp_rewrite)には、私の新しいリライトルールは含まれません。

アップデート6
1月の解決策をテストしました。しかしURLは変わりません:(

/* Initiation script for NF template
------------------------------------------------------------------------------*/   
add_action('after_setup_theme','norwegianfashion_setup');

if ( ! function_exists( 'norwegianfashion_setup' ) ):

  function norwegianfashion_setup() { 
    /* Here I do a lot of stuff */

    // SEO friendly URL for desigenrs
    add_action( 'init', 'wpa5413_init' );
    add_filter( 'query_vars', 'wpa5413_query_vars' );
  }

endif;


/* Custom re-write rules for desigenrs
------------------------------------------------------------------------------*/
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        'designers/([^/]+)/?',
        'index.php?pagename=designers&designer=$matches[1]',
        'top' );
}

function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer';
    return $query_vars;
}

誰かがこの問題を解決するのを手伝ってくれたら 本当に ありがたいです。

54
Steven

書き換えルールの背景

WP Rewriteシステムは複雑に見えますが、実際にはその仕組みを理解するのはそれほど難しくありません。 pretty URL(/designers/)を、非プリティ(/index.php?pagename=designers)であるかのように解析するために使用されます。基本的な考え方は、rewrite rulesのリストがあり、着信URLに一致する正規表現であり、それらを他のURLに書き換えます。ほとんどの場合、index.phpにいくつかのクエリ変数が含まれます。これらの変数は、URLに一致した正規表現の一部に設定されます。ルールは上から下に評価されるため、2つのルールが一致する場合、最初のルールが「勝ち」ます。

これらの書き換えルールはflush_rewrite_rules()を呼び出すことでデータベースに保存されますが、これらのルールの生成と書き込みは負荷の高い操作であるため、すべてのinitで実行しないでください。代わりに、ルールを変更するときにのみそれを行います:おそらくプラグインのアクティベーション(register_activation_hook()を使用)、またはPermalinks設定ページにアクセスして手動で(- 行うのが難しいため)これはテーマのアクティブ化時に自動的に )。 ルールをフラッシュしない場合、add_rewrite_rule()を呼び出しても効果はありません。ルールをフラッシュした後でも、initごとにadd_rewrite_rule()を呼び出しても問題ありません。

書き換えルールを追加する方法は多数あります。ルールを1つだけ追加する場合は、add_rewrite_rule()を使用して追加できます。投稿、ページ、分類法などのルールは複数のルールになるため、add_rewrite_tag()add_permastruct()、...などの高レベル関数で作成されますが、これらは単純な場合には必要ありませんここにあります。

フィルタもいくつかあるため、generate_rewrite_rulesまたはgenerate_rewrite_rules_arrayフックを使用してルールを追加することもできます。これらを使用すると、完全なルールを非常に詳細に制御できますが、ルールを1つだけ追加する場合は、add_rewrite_rule()で十分です。

現在の書き換えルールを分析できる小さなプラグイン を作成し、(もちろん)何かを変更しようとするときに使用することをお勧めします。

URLから追加情報を取得する

あなたが与えた例に基づいて構築しましょう。デザイナーIDブランドBatlak og Selvigがあり、番号ID(bid9があります。 URLにはこのIDは不要で、名前のみが必要です。 URLフレンドリバージョンの名前(スペースまたは特殊文字なし)を slugBatlak-og-Selvigと呼びます。

一般に、URLには、ページに表示するコンテンツを識別するためのすべての情報を含める必要があります。 CookieまたはPOSTリクエストを使用して、表示したい実際のデザイナーIDを保存できますが、リンクを共有している場合、メール、Facebook、Twitter経由で送信するか、単に読むだけでリンクが壊れます電話で大声で。 URLで数値IDを使用したくない場合は、スラッグが一意であることを確認する必要があります。最初にスラッグに基づいてIDのルックアップを行い、以前と同じように続行します。

したがって、今学んだことは、パターンの書き換えルールを追加することです"/designers/の後に次の/"までを追加し、それを保存します"anything"designer_slugクエリ変数内。あなたの場合、スラッグdesignersを含むページを一般的なページコンテンツとして使用したいと思うので、WordPressにもそれを伝えます。

add_action( 'init', 'wpa5413_init' );
function wpa5413_init()
{
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        'designers/([^/]+)/?',
        // The resulting internal URL: `index.php` because we still use WordPress
        // `pagename` because we use this WordPress page
        // `designer_slug` because we assign the first captured regex part to this variable
        'index.php?pagename=designers&designer_slug=$matches[1]',
        // This is a rather specific URL, so we add it to the top of the list
        // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win"
        'top' );
}

あとは、WordPressにdesigner_slugをクエリ変数に保持するように指示するだけで、後でアクセスできます。 WordPressは、許可されたクエリ変数のホワイトリストを使用して、URLを介して投稿クエリのすべてのパラメーターを変更できないようにします。このリストにないものはすべて無視されます。 query_varsフックにフックして、追加の変数を追加するだけです。

add_filter( 'query_vars', 'wpa5413_query_vars' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = 'designer_slug';
    return $query_vars;
}

ご覧のとおり、この回答は基本的に 私の以前の回答 と同じですが、ルールをコードでフラッシュせず(したがって、プラグインの代わりにテーマのfunctions.phpで使用できます)、あなたの最初の質問に答えてから(そしてそのために)書き換え規則について多くのことを学んだので、もう少し確実性と説明があります。

チャットルームディスカッション

この質問の最終的な問題を解決しました チャットルームで 。最後に、Stevenはgenerate_rewrite_rulesフックを使用しました。これは、add_rewrite_rule()関数が彼にとって機能しなかったためです。

87
Jan Fabry