Обычное правило переписывания архива пользовательского типа

Есть похожие вопросы, но я не нашел хорошего ответа. У меня есть специальный тип сообщений «enews», зарегистрированный следующим образом:

[...] 'hierarchical' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'enews'), [...] 

Практически все ссылки работают нормально:

/en/enews/ -> ОК. переходит в общий архив post_type. «en» – это язык.

/en/enews/2012/post-slug -> Почти нормально (или почти неправильно ..). Переход к единственному post_type, но это происходит путем автоматического перенаправления на /en/enews/post-slug

/en/enews/2012/ – >>> НЕПРАВИЛЬНО. Страница не найдена. Поэтому я написал следующее:

 add_action('generate_rewrite_rules', 'add_rewrite_rules'); function add_rewrite_rules($wp_rewrite){ if(is_admin()) return; $new_rules['(it|en|fr|es|de)/enews/([0-9]{4})?$'] = 'index.php?post_type=enews&lang=$matches[1]&year=$matches[2]'; $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; }// end add rewrite urls 

Я сбросил все правила, как с помощью кода, так и вручную из admin. Страница еще не найдена. В настоящее время использование polylang pro, но оно не должно давать проблем. Я также проверил $wp_rewrite->rules , они выглядят нормально, мои новые правила правильно написаны перед всеми остальными.

Что я делаю не так?

В основном, дело в том, что если я посмотрю на wp_query query vars под /en/enews/2012/ , я нахожу это:

 array(67) { ["page"]=> int(0) ["lang"]=> string(2) "en" ["enews"]=> string(4) "2012" ["post_type"]=> string(5) "enews" ["name"]=> string(4) "2012" ["year"]=> int(0) 

Поэтому он неправильно читает «enews», «name» и «year». Все не так.

РЕДАКТИРОВАТЬ:

Я нашел странное решение, но все же я не могу понять, почему он должен работать так.

Если я добавлю правило под init (и убрав ранее добавленное в /en/enews/2012/ generate_rewrite_rules), /en/enews/2012/ будет работать:

 add_action('init', 'add_custom_rewrites'); function add_custom_rewrites(){ add_rewrite_rule( 'enews/([0-9]{4})/?$', 'index.php?post_type=enews&year=$matches[1]', 'top' ); } 

В любом случае, /en/enews/2012/post-slug все равно будет перенаправлен на /en/enews/post-slug

НО, если я добавлю

$new_rules['(it|en|fr|es|de)/enews/([0-9]{4})/(.+)/?$'] = 'index.php?post_type=enews&lang=$matches[1]&year=$matches[2]&name=$matches[3]';

для действия «generate_rewrite_rules» выше, то /en/enews/post-slug будет работать правильно.

Поэтому, видимо, мне нужно правило под «init» для архива на год и правило под «generate_rewrite_rules» для единственного URL-адреса. Зачем???

Solutions Collecting From Web of "Обычное правило переписывания архива пользовательского типа"