如何重写wordpress URL以将第一个子目录用作查询字符串?

时间:2012-10-12 15:56:23

标签: php wordpress plugins url-rewriting

如果类别与程序代码匹配,我需要URL中的第一个子目录重写为查询的URL,即:4个大写字符,如AUBU

例如,我需要:

http://www.georgiancollege.ca/devprograms/AUBU/

重写为:

http://www.georgiancollege.ca/devprograms/index.php?page_id=16&major=AUBU

但我不希望它影响当前的网址,例如

http://www.georgiancollege.ca/devprograms/a-to-z/

不应该重写为:

http://www.georgiancollege.ca/devprograms/index.php?page_id=16&major=a-to-z

到目前为止,我所拥有的内容根本不起作用。 (基于:http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/

function eg_add_rewrite_rules() {
global $wp_rewrite;

$new_rules = array(
    '(.+)/?$' => 'index.php?page_id=16&major=' . $wp_rewrite->preg_index(1)
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'eg_add_rewrite_rules' );

更新:上面的代码现在重定向到正确的页面,但在那个页面上我无法读取查询字符串,可能是因为URL重写查询字符串不在最后一页...

所以使用,

$program = $_GET['major'];

不返回主要代码...

2 个答案:

答案 0 :(得分:1)

看起来像Apache网址重写的黑客攻击。我会用Mod_Rewrite来解决这个问题。 至于你的代码,你匹配的是一个不够具体的正则表达式。你只想匹配4个大写字母?也许试试这个:

'devprograms/([A-Z]{4})/?$' => 'index.php?page_id=16&major=' . $wp_rewrite->preg_index(1)

答案 1 :(得分:0)

感谢您的投入。

我不得不使用“解决方案”解决方案,因为它似乎并不想工作。

我尝试使用$ wp_query-> query_vars来获取查询字符串数据而不是$ _GET或$ _POST,如下所示:

if(isset($wp_query->query_vars['major'])) {
    $program = urldecode($wp_query->query_vars['major']);
}

正如在http://www.rlmseo.com/blog/passing-get-query-string-parameters-in-wordpress-url/上所建议的那样,但是'major'的query_var保持不存在,即使存在来自相同URL重写的页面名称查询变量。

所以我继续......

以下是新的网址重写:

function add_rewrite_rules($aRules) {
  $aNewRules = array('([A-Z]{4})/outline/?$' => 'index.php?pagename=programs&major=$matches[1]');
  $aNewRules2 = array('([A-Z]{4})/?$' => 'index.php?pagename=programs&major=$matches[1]');
  $aRules = $aNewRules + $aNewRules2 + $aRules;
  return $aRules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

由于我的URL重写仍然只是以更漂亮的方式保存URL中的程序代码,我只是抓住REQUEST_URI并解析程序代码,如下所示:

$parts = explode('/',$_SERVER['REQUEST_URI']);
if (isset($_GET['major'])) {
  $program = $_GET['major']; 
} elseif ($parts[1] == 'devprograms') {
  $program = $parts[2];
} else {
  $program = get_the_title();
}

这解释了链接样式/ devprograms / BUSN和/ devprograms / program?major = BUSN

唯一的缺点就是我不能在安装时使用4个字母的名称,例如'test'或'page',因为它们将被重写到程序页面,并以'test'或'page'作为程序代码,这不是实际的程序。这是一个在命名页面时很容易解决的问题。

谢谢, 托马斯