add_rewrite_ruleのヘルプが必要


55

解決


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

私はこれを見つけたもう少しexplainatoryです。しかし、それは機能していません:

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が別のスレッドで提案した、私が試した別のソリューションを次に示します。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
Janのソリューションをテストしました。しかし、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;
}

誰かが私がこの問題を解決するのを手伝うことができたならば、私はそれを本当に感謝します。


これは、あなたがここで尋ねた最初の質問と非常によく似ています。それ以来状況は変わったので、私の答えはもう有効ではありませんか?URLにデザイナーIDが必要ない場合は、「スラッグ」を自分でIDに変換する必要があります。WordPressはこれを行うことができません。デザイナーはまだ外部オブジェクトですか?
1月ファブリ

@Jan Fabryはい、これを投稿した後、それを発見しました(忘れていました)。今、私はあなたの提案をよりよく理解しています。更新されたコードはこちらをご覧ください。私のデザイナーはまだカスタムDBのエントリです。POST insteed og GETを使用して渡すことは可能bidですか?
スティーブン

リンクをコピーして他の人に送信しても、POSTリクエストを使用しても問題はありません。スラッグを一意にし、そこからデータを検索するのは問題ですか?
ヤンファブリ

@Jan Fabry:どういう意味slugですか?`Designerデータの取得は、使用するbidよりもはるかに簡単ですdesigner
スティーブン

回答:


87

書き換えルールの背景

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

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

書き換えルールを追加するには多くの方法があり、1つのルールのみを追加する場合は、を使用してこれを行うことができますadd_rewrite_rule()。投稿、ページ、タクソノミーなどのルールは複数のルールになるため、、、...などの高レベル関数で作成されますがadd_rewrite_tag()add_permastruct()ここにある単純なケースでは必要ありません。

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

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

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

あなたが与えた例に基づいて構築しましょう。あなたはBatlak og SelvigナンバーID(bid)のデザイナーブランドを持っています9。URLにはこのIDは不要で、名前のみが必要です。私たちは、(スペースや特殊文字なし)名前のURLに優しいバージョンを呼び出すスラグBatlak-og-Selvig

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

それでは、私たちが今学んできたことは、我々はパターンのために書き換えルールを追加したいということです/designers/次まで何でも続く/、およびその保存「何」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()しました。関数が彼にとって機能しないように思われたためです。


2
@Steven:pagename表示する(データベースに記録する)WordPressページのスラッグです。このページはdesigners.php、WP管理領域でテンプレートファイルを使用することを示すことができます。同じテンプレートを複数のページに使用できるため、テンプレート名ではなくページスラッグを指定します。この場合、WordPressは何をしたいのかわかりません。
ヤンファブリ

1
@Steven:フックの設定方法を複雑にしすぎていると思います。add_rewrite_rules()関数を削除して、add_filter()/add_action()直接呼び出します。これがテーマファイルにある場合は、を削除しflush_rewrite_rules()、permalinks設定ページにアクセスして、ルールをフラッシュします(または、ルールを追加しwpse5413_init()て後で削除します)。そして、私のプラグインは現在の書き換えルールを表示します。これは、コードがHTMLでURLを記述する方法ではなく、着信URLの処理方法を変更するだけであることに注意してください。
ヤンファブリ

1
@Steven:保存ボタンを押す必要さえないと思います。パーマリンクのページを開くだけでもフラッシュします。繰り返しになりますが、これはWordPressが/designers/designer-slug/URL を受け入れる機能を追加するだけです。HTMLでこれらのURLを記述する場所を自分で変更する必要があります。/designers/Batlak-og-Selvig/自分で行ってテストします。それが機能する場合、これらのURLを生成するすべての場所を見つけ、新しい構造を使用するように変更します。
ヤンファブリ

1
ああ、今私は理解し始めていると思う。書き換えルールによって、ブラウザのURLフィールドでURLが表示される方法が変わると思いました。しかし、どのような手段であることは、私が実際に出力にURLを持っているということですwww.mysite.com/batlat-og-selvig/9と、これはへの「翻訳」される/?designer=Batlak-og-Selvig&bid=9
スティーブン・

1
@Steven:はい、確かに:書き換えルールは着信リンクを処理し、(いくつかの選択された場合のみ)コードで生成されたリンクに影響を与えません。
ヤンファブリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.