2015-04-05 52 views
1

TL; DRWordPress的add_rewrite_rule和正則表達式正向前查找

  1. 是積極的向前看符號在WordPress add_rewrite_rule功能也有效的正則表達式?我有一個詳細的下面,似乎並沒有工作,雖然似乎有效。
  2. 是否有可能重寫一個WordPress自定義帖子類型的帖子slu so讓多個帖子可以擁有相同的帖子名稱,但是可以根據其分配的類別進行區分?

的設置:

  • 安裝WordPress
  • 3頁 - '富', '酒吧' 和 '巴茲'
  • 3類 - '富', '酒吧'和 '巴茲'
  • 定製後型 - 'qux'
  • 帖子在 'qux' 被分配第1類 - 要麼 '富', '酒吧' 或 '巴茲'
  • 一旦分配類別,自定義後塞應讀「/ [類別]/[自定義後名稱] /,看來是類似名稱的頁面的子

的問題

在「qux」中分配給不同類別的帖子可以具有相同的名稱,例如可以將'norf'[1]分配給'foo'並將'norf'[2]分配給'bar'。

顯然,WordPress不允許重複頁面slu so,所以我添加了與類別修飾符同名的帖子(例如'norf-fo'(發佈'norf'分配給'foo')和'norf- br'(發佈'norf'分配給'bar'))。這給了我前端的'/ foo/norf-fo /'和'/ bar/norf-br /'。我的問題是如何使用WordPress的重寫API來獲得'/ foo/norf /'和'/ bar/norf /'?

我的解決方案到目前爲止

我設法通過在編輯器中正確顯示的網址如下:

function replace_link($link, $post = 0) { 
    if ($post->post_type == 'qux' && in_category(array('foo', 'bar', 'baz'))) { 

     $terms = get_the_terms($post->ID, 'category'); 

     if ($terms && ! is_wp_error($terms)) : 
     $links = array(); 
     foreach ($terms as $term) { 
      $links[] = $term->name; 
     } 
     $links = str_replace(' ', '-', $links); 
     endif; 

     if (in_array("foo", $links)) { 
      return home_url('foo/'. str_replace('-fo', '', $post->post_name) .'/'); 
     } 
     if (in_array("bar", $links)) { 
      return home_url('bar/' . str_replace('-br', '', $post->post_name) .'/'); 
     } 
     if (in_array("baz", $links)) { 
      return home_url('baz/'. str_replace('-bz', '', $post->post_name) .'/'); 
     } 

    } else { 
     return $link; 
    } 
} 

add_filter('post_type_link', 'replace_link', 1, 3); 

這工作得很好,但我的理解是,這是隻是一個表面上的變化(如果我錯了,請糾正我)。然後我用以下重寫規則:

function custom_rewrite_rule_fo() { 
    add_rewrite_rule('foo\/(.+?)(?=-fo)','index.php?latest_work=$matches[1]','top'); 
} 
add_action('init', 'custom_rewrite_rule_fo', 10, 0); 

function custom_rewrite_rule_br() { 
    add_rewrite_rule('bar\/(.+?)(?=-br)','index.php?latest_work=$matches[1]','top'); 
} 
add_action('init', 'custom_rewrite_rule_br', 10, 0); 

function custom_rewrite_rule_bz() { 
    add_rewrite_rule('baz\/(.+?)(?=-bz)','index.php?latest_work=$matches[1]','top'); 
} 
add_action('init', 'custom_rewrite_rule_bz', 10, 0); 

我已經測試了各種在線測試儀的正則表達式,它似乎工作(見https://regex101.com/r/tL1iV4/1)。

然而,WordPress並沒有在瀏覽頁面時回到'/ qux/norf-fo /'和'/ qux/norf-br /'等等。我得出結論,這是因爲WordPress的正則表達式不支持我使用的積極lookahead。

我認爲這完全取決於我的可憐的正則表達式技能,但我已經嘗試了很多很多的組合,並且似乎沒有得到任何地方......任何幫助非常感謝! :)

回答

-1

找到一個更簡單的解決方案,滿足我所有的URL需求...

取而代之的是1個自定義帖子類型的'qux',我選擇了3個自定義帖子類型 - 'foo','bar'和'baz'。 3個自定義帖子類型存檔頁面中的每一個都代替了相同名稱的舊靜態頁面。

一旦新CPT成立,我用https://wordpress.org/plugins/post-type-switcher/根據他們指定的類別將帖子從'qux'移動到各自的新CPT中。

如果任何人有我在頁面頂部的原始問題的答案,我仍然好奇! :)