0

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

例如,我需要:

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

重写为:

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

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

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'];

不返回主要代码...

4

2 回答 2

1

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

'devprograms/([A-Z]{4})/?$' => 'index.php?page_id=16&major=' . $wp_rewrite->preg_index(1)
于 2012-10-12T16:24:33.670 回答
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/ 但即使页面名称查询变量来自确实存在相同的 URL 重写。

所以我继续...

这是新的 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/programs?major=BUSN

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

谢谢,托马斯

于 2012-10-12T18:58:27.443 回答