Проблемы с постоянными ссылками и перезаписью URL для пользовательского типа записи

17 июл. 2011 г., 17:39:59
Просмотры: 17.3K
Голосов: 10

Столкнулся с следующей проблемой:

У меня есть:

  • 1 пользовательский тип записи под названием cpt_community
  • 1 пользовательская таксономия под названием tax_community

Если я устанавливаю 'rewrite' => true при регистрации CPT, то постоянные ссылки на запись этого типа выглядят как http://<домен>/cpt_community/test_item/, и я получаю ошибку 404 при переходе по ним.

Если я устанавливаю 'rewrite' => false, то постоянные ссылки принимают вид http://<домен>/?cpt_community=test_item/, и это работает нормально.

Очевидно, я делаю что-то не так - вопрос в том, что именно?

[Обновление]

  • После каждого изменения я сбрасываю правила перезаписи, переходя в Настройки → Постоянные ссылки (и сохраняя)
  • После того как я оставил все как есть на час, все начало работать правильно - почему такая задержка?

Код

Регистрация CPT

function community_post_type() {
  $labels = array('name'  => 'Сообщество');

   $args = array(
      'labels' => $labels,
      'public' => true,
      'publicly_queryable' => true,
      'show_ui' => true,
      'show_in_menu' => true,
      'query_var' => true,
      'rewrite' => false,
      'capability_type' => 'post',
      'has_archive' => true,
      'hierarchical' => false,
      'menu_position' => null,
      'has_archive' => true,
      'supports' => array('title','editor','excerpt','custom-fields','comments','revisions','thumbnail','author','page-attributes')
   ); 

  register_post_type('cpt_community', $args);
}  
add_action( 'init', 'community_post_type' );

Регистрация пользовательской таксономии

function community_tax_type() {
  register_taxonomy(
    'tax_community',
    'cpt_community',
     array( 'hierarchical' => false,
       'label' => 'Тип контента сообщества',
       'show_ui' => true,'query_var' => true,
       'rewrite' => true,
       'singular_label' => 'Тип контента сообщества',
       'capabilities' => array('assign_terms' => 'edit_community_tags')
       )
   );
   // разрешаем ролям добавлять термины таксономии к CPT сообщества
   $roles = array("subscriber","contributor","author","editor","administrator");

   foreach ($roles as $role_name) {
     $role = get_role($role_name);
     $role->add_cap("edit_community_tags");
   }   
}
add_action( 'init', 'community_tax_type' );
4
Комментарии

Вы сначала сбросили правила перезаписи, посетив страницу постоянных ссылок и сохранив изменения?

Milo Milo
17 июл. 2011 г. 18:26:29

@milo - да. Интересно, что после того как я отошел на час и вернулся, "человеко-понятные" постоянные ссылки заработали - обновлю вопрос и уточню его как "почему была задержка"

anu anu
17 июл. 2011 г. 18:33:15

Вы используете плагин кэширования? Работает ли быстрее при отключении всех остальных плагинов? (Просто проверяю очевидные возможные причины)

Jan Fabry Jan Fabry
19 июл. 2011 г. 00:21:37

@jan - нет плагина кэширования. Проблема в том, что я не могу воспроизвести это поведение - это произошло пару раз и затем исчезало, но без каких-либо конкретных действий (насколько я могу судить), которые бы действительно это исправляли.

anu anu
19 июл. 2011 г. 16:42:18
Все ответы на вопрос 2
1

Используйте функцию flush_rewrite_rules() для установки новых правил перезаписи, но не в хуке init, а только при активации плагина или темы! Подробнее в моей статье: http://wpengineer.com/2044/custom-post-type-and-permalink/

global $wp_rewrite;
$wp_rewrite->flush_rules();

Сбрасывайте правила только при активации (и деактивации). Не делайте этого в других хуках.

register_activation_hook()
18 июл. 2011 г. 22:49:25
Комментарии

Вы также можете перейти в "Настройки => Постоянные ссылки" и просто нажать "Сохранить", не меняя никаких параметров. В этом случае постоянные ссылки также будут перегенерированы.

Ken Ken
19 нояб. 2020 г. 15:46:04
1

Просто перейдите в Настройки>Постоянные ссылки, чтобы обновить правила. Код не требуется. Вам не нужно обновлять структуру, просто открытие этой страницы администрирования сделает свое дело

6 нояб. 2011 г. 16:39:00
Комментарии

но тогда вам придется посещать эту страницу каждый раз при возникновении ошибки. Использование функции flush_rewrite_rules(); означает, что правила перезаписи сбрасываются без необходимости взаимодействия.

Alex Older Alex Older
26 мар. 2012 г. 16:41:46