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 轉址功能,大家可以參考看看。