需要有关添加_重写_规则的帮助

时间:2010-12-15 作者:Steven

SOLUTION


I\'ve gone with Update 3 and have got it working. What I had misunderstood, was that I believed that a rewrite rule would change designers/?designer=some-designer&bid=9 to /designers/some-designer. But it is of course the other way around.

<我一直在做一些研究,但我不太明白如何使用add_rewrite_rule().

This post 非常接近我所需要的,但我真的需要那么多代码吗?

我当前的链接是:
http://www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9<我想要的是这个http://www.norwegianfashion.no/designers/Batlak-og-Selvig/

如何使用add_rewrite_rule()? Update 1

I found this 这更能说明问题。但它不起作用:

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\')
Update 2

这是我尝试过的另一个解决方案Jan Fabry suggesten 在另一个线程中。我把它放在我的函数中。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;
}
Update 3
Ifound a few examples here 也但这也行不通:(

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 );
}

Update 5
似乎没有添加我的重写规则。制定新规则后执行以下操作:print_r($wp_rewrite), 不包括我的新重写规则。

Update 6<我测试了简的溶液。但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;
}
我会的really 如果有人能帮我解决这个问题,我将不胜感激。

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

关于重写规则的一些背景知识WP重写系统看起来很复杂,但实际上它的工作原理并不难理解。它用于解析URL(/designers/) 好像他们不漂亮(/index.php?pagename=designers). 基本思想是,您有一个重写规则列表,正则表达式可以匹配传入URL,并将其重写为其他URL,主要以index.php 使用一些查询变量。这些变量被设置为正则表达式中与URL匹配的部分。这些规则是自上而下评估的,因此如果两条规则可能匹配,第一条规则“获胜”。

这些重写规则通过调用flush_rewrite_rules(), 但是,因为生成和编写这些规则是一项昂贵的操作,所以您不应该在每个init. 相反,您只在更改规则时才这样做:可能是在插件激活时(使用register_activation_hook()), 或通过访问Permalinks设置页面手动执行(because it\'s hard to do this automatically on theme activation). If you don\'t flush the rules, calling add_rewrite_rule() has no effect. It is no problem to call add_rewrite_rule() on every init, even after you flushed the rules.

有很多方法可以添加重写规则,如果只想添加一条规则,可以使用add_rewrite_rule(). 因为帖子、页面、分类法的规则。。。生成多个规则,这些规则是使用高级函数创建的,如add_rewrite_tag(), add_permastruct(), ... 但我们这里的简单案例并不需要这些。

还有一些过滤器,因此您也可以使用generate_rewrite_rulesgenerate_rewrite_rules_array 挂钩。这些让你可以非常详细地控制整个规则,add_rewrite_rule() 如果只想添加一条规则,就足够了。

我创建了a little plugin that allows you to analyze the current rewrite rules, 当然,我建议你在尝试改变任何事情时使用它。

从URL获取额外信息让我们以您给出的示例为基础。你拥有设计师品牌Batlak og Selvig, 带数字ID(bid) 9. URL中不需要此ID,只需要名称。我们将该名称的URL友好版本(无空格或特殊字符)称为slug: Batlak-og-Selvig.

通常,URL应该包含所有信息,以标识您要在页面上显示的内容。您可以使用cookie或POST请求来存储您想要显示的实际设计师ID,但如果有人通过邮件、Facebook、Twitter发送链接,或只是通过电话大声读出链接,则会出现问题。如果不想在URL中使用数字ID,则应确保slug是唯一的:然后首先根据slug查找ID,然后继续之前的操作。

因此,我们现在学到的是,我们想为模式添加一个重写规则。”/designers/ 然后是下一个/“,并将“任何内容”保存在designer_slug 查询变量。在你的情况下,我相信你也希望使用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修改posts查询的每个参数。不在此列表中的所有内容都将被忽略。只需勾入query_vars 钩住并添加额外变量:

add_filter( \'query_vars\', \'wpa5413_query_vars\' );
function wpa5413_query_vars( $query_vars )
{
    $query_vars[] = \'designer_slug\';
    return $query_vars;
}
正如你所看到的,这个答案基本上与my previous answer, 但是没有在代码中刷新规则(因此您可以在主题中使用它functions.php 而不是一个插件),并且有更多的确定性和解释性,因为我从回答你的第一个问题开始就学到了很多关于重写规则的知识。

聊天室讨论

我们解决了这个问题的最终问题in the chat room. 最后,史蒂文使用了generate_rewrite_rules 钩子,因为add_rewrite_rule() 这个功能似乎对他不起作用。

结束

相关推荐