WordPress 使用 add_rewrite_rule 方法建立一個新的 route
在許多的網頁框架當中要建立一個 route 並不是一件困難的事情,可是在 WordPress 當中並不是很直覺,這牽扯到了 WordPress 的運行機制。那麼你會說 permalink
不能夠滿足你的需求嗎?就程式面來說確實不夠彈性,對我來說。
例如:一個 url 要顯示滿足條件的文章內容,條件來自於 acf 欄位的值,以permalink
確實沒法辦到,所以就自己寫程式解決。
程式碼
要自己開一個客製化外掛,還是寫在子版型內都可以,只要 hook
有被呼叫到就可以了。
function bonze_add_rewrite_rule()
{
$categories = ['classrooms', 'people', 'projects', 'reports', 'videos'];
foreach ($categories as $category) {
add_rewrite_rule("^({$category})/(\d+)", 'index.php?category=' . $category . '&old_id=$matches[2]', 'top');
}
}
function bonze_query_vars($vars)
{
$vars[] = 'category';
$vars[] = 'old_id';
return $vars;
}
function bonze_redirect()
{
$category = get_query_var('category');
$old_id = get_query_var('old_id');
if ($category !== '' && $old_id !== '') {
$args = array(
'category_name' => $category,
'post_type' => 'post',
'meta_key' => 'old_id',
'meta_value' => $old_id,
);
$posts = get_posts($args);
if ($posts && $url = get_permalink($posts[0]->ID)) {
wp_redirect($url, 301);
exit;
}
}
}
add_action('init', 'bonze_add_rewrite_rule');
add_filter('query_vars', 'bonze_query_vars');
add_action('template_redirect', 'bonze_redirect');
add_rewrite_rule
比較要注意的是,正則表達式符合的參數必須用 ()
抓取,不然是 matche 不到的。
以上程式碼是在協助搬家 301 轉址功能,大家可以參考看看。