如何通过自定义变量正确重写URL

时间:2011-08-22 作者:Adeerlike

我一直在尝试重写店铺uri,现在我得到的是以下代码:

add_filter(\'rewrite_rules_array\',\'wp_insertMyRewriteRules\');
add_filter(\'query_vars\',\'wp_insertMyRewriteQueryVars\');
add_filter(\'wp_loaded\',\'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[\'shop/brand/(brand)/?$\'] = \'shop.php?brand=$matches[1]\' ; 
     //$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
     return $newrules + $rules ;
}

// Adding the bid var so that WP recognizes it
function wp_insertMyRewriteQueryVars($vars) {
    array_push($vars, \'brand\');
    return $vars;
}
但无论我做什么,我都无法让它发挥作用。我正在使用Monkeyman Rewrite Analyzer插件查看活动ap重写,它告诉我该品牌“不是公开的,不会保存”。而且,它改变了我的店铺。php to shop\\u php。。。

shop/brand/(brand)/?$    shop_php?brand: (brand)
为什么这么乱?我试图修改。htaccess尽可能少;还有,因为我想把这个放在主题里。

3 个回复
SO网友:chrisguitarguy

因此,首先,不要在每次加载页面时刷新重写规则。最好只激活一次插件。

步骤1:添加重写规则:

add_action( \'init\', \'wpse26555_add_rewrite\' );
function wpse26555_add_rewrite()
{
    // You should probably rewrite to index.php instead of shop.php?
    add_rewrite_rule( \'/shop/brand/([^/]+)/?$\', \'index.php?brand=$matches[1]\', \'top\' );
}
步骤2:添加查询变量

add_filter( \'query_vars\', \'wpse26555_add_vars\' );
function wpse26555_add_vars( $vars )
{
    $vars[] = \'brand\';
    return $vars;
}
然后在插件激活时刷新(因为类似的内容可能应该在插件文件中)。

<?php    
// Somewhere in your plugin\'s main file    
register_activation_hook( __FILE__, \'wpse26555_activation\' );
function wpse26555_activation()
{
        // Add the rule first
        wpse26555_add_rewrite();
        // Then flush rewrite rules
        flush_rewrite_rules();
}
然后在前端可以执行以下操作:

if( $brand = get_query_var( \'brand\' ) )
{
    // Do stuff with $brand here

}
也许更好的策略是将品牌改写为特定页面?或者品牌可能是某种自定义分类法?

你必须测试上面的代码,这是我不知道的,但它应该可以工作,或者至少可以让你开始

SO网友:Adeerlike

谢谢你冗长的回复。问题是,我不是在这里制作插件,我只是在尝试与插件交互。这是一个商店插件[theCartPress],我围绕它做了自己的设计,并创建了一个商店。php页面,用于自定义此类帖子类型[tcp\\U产品]。

我确实会将所有此类帖子重新路由到正确的文件,但我也希望能够按品牌显示它们。我有一些\\u可以进去做什么?brand=我的品牌,但我想使用wordpress永久链接。实际上我有一个自定义的分类法。这是我在获取后使用的:

 if (($_GET[\'brand\'] == \'owl\') || !isset($_GET[\'brand\'])) {
    $brand = \'owl\';
  } else {
    $brand = $_GET[\'brand\'];
  }
  $args = array( \'post_type\' => \'tcp_product\', \'posts_per_page\' => 30, \'tax_query\' => array(
    array(\'taxonomy\' => \'tcp_product_supplier\', \'field\' => \'slug\', \'terms\' => $brand)));

$loop = new WP_Query( $args );
很抱歉mods使用了回复帖子,但无法重新格式化评论。。

SO网友:eballeste

最重要的答案是可行的,但有一种更合适、更正式的方式来完成这些类型的重写。。。

例如,以下代码将注册自定义查询变量,并从同一操作中注册重写规则:

function include_cpt_rewrites(){
  add_rewrite_tag(\'%brand%\', \'([a-zA-Z0-9-]+)\');

  add_rewrite_rule(\'^shop/brand/([^/]+)/?$\', \'index.php?brand=$matches[1]\', \'top\');
}
add_action(\'init\', \'include_cpt_rewrites\');
刷新永久链接的最后一步可以从WP admin手动完成,而不是通过转到settings/permalinks 然后继续save changes.

add_rewrite_tags / add_rewrite_rule

结束

相关推荐

GET_SHORTCODE_regex()只与第一个短码匹配

法典中有an example 使用get\\u shortcode\\u regex()检查是否在给定页面上调用了短代码:$pattern = get_shortcode_regex(); preg_match(\'/\'.$pattern.\'/s\', $posts[0]->post_content, $matches); if (is_array($matches) && $matches[2] == \'YOURSHORTCODE\') { /