onetrickpony
  • 0
Гуру

Постоянные ссылки пользовательского типа сообщения, дающие s

  • 0

У меня возникли проблемы с настройкой постоянных ссылок для пользовательского типа сообщений. Ниже приведен код моей функции инициализации:

register_post_type('topic',
  array(
   ...
   'hierarchical' => true,
   'query_var' => true,
   'rewrite' => false,
   ...
  ));

if(get_option('permalink_structure')!= ''):
  global $wp_rewrite;

  $wp_rewrite->add_rewrite_tag('%topic%', '(.+?)', 'topic=');
  $wp_rewrite->add_permastruct('topic', '%forum%/%topic%/', false, EP_PERMALINK);
endif;

По сути, я пытаюсь настроить постоянные ссылки по-своему, потому что хочу добавить пользовательский термин таксономии перед заголовком сообщения.

Вместо:topic/whatever

использовать:general-forum/sub-forum/whatever

Это функция, которая изменяет ссылку, которая работает нормально:

add_filter('post_type_link', 'topic_link', 10, 4);
function topic_link($link, $post){
  if($post->post_type != 'topic') return $link;
  global $wp_post_types;
  $terms = get_the_terms($post->ID, 'forum');
  if(!is_wp_error($terms) && !empty($terms)):
    usort($terms, '_usort_terms_by_id');
    $forums = $terms[0]->slug;
    if(!empty($terms[0]->parent)):
      $parent_item = $terms[0]->parent;
      while(!empty($parent_item)):
        $parent = get_term($parent_item, 'forum');
        if(!is_wp_error($parent) && !empty($parent))
        $forums = $parent->slug.'/'.$forums;
        $parent_item = empty($parent->parent) ? false : $parent->parent;
      endwhile;
    endif;
  endif;
  return str_replace('%forum%', $forums, $link);
}

Таким образом, измененный URL-адрес отображается нормально, единственная проблема в том, что я получаю ошибку 404 🙂 Что я делаю неправильно в своем коде инициализации?

LE: таксономия «форум»:

register_taxonomy(
  'forum',
    array('topic', 'reply'),
    array(
      'public' => true,
      'name' => _a('Forums'),
      'singular_name' => _a('Forum'),
      'show_ui' => true,
      //'show_tagcloud' => true,
      'show_in_nav_menus' => true,
      'hierarchical' => true,

      'labels' => array(
        'name' => _a('Forums'),
        'singular_name' => _a('Forum'),
        'search_items' => _a('Search Forums'),
        'popular_items' => _a('Popular Forums'),
        'all_items' => _a('All Forums'),
        'parent_item' => _a('Parent Forum'),
        'parent_item_colon' => _a('Parent Forum:'),
        'edit_item' => _a('Edit Forum'),
        'update_item' => _a('Update Forum'),
        'add_new_item' => _a('Add New Forum'),
        'new_item_name' => _a('New Forum Name'),
      ),
      'query_var' => true,
      'rewrite' => array('slug' => 'forums', 'with_front' => false, 'hierarchical' => true),
      //'update_count_callback' => 'my_custom_count_callback',
  )
);
Share
  1. Мой плагин Custom Post Permalinks делает для вас такие вещи:

    http://wordpress.org/extend/plugins/custom-post-permalinks

    Если вы предпочитаете использовать свое собственное решение, мне потребуется немного больше информации, например регистрационный код для таксономии форумов.

    Просто предполагаю, что регулярное выражение для форума выглядит идентично регулярному выражению для темы для механизма перезаписи.

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

    Глядя на ваш код, похоже, вы используете 3.1. Немного о $args['rewrite']['hierarchical'] таксономиях не было в 3.0. По сути, этот аргумент изменяет регулярное выражение для %forum% тега с ([^/]) на (.+?) . Это означает, что механизм перезаписи WordPress сначала получает совпадение для этого регулярного выражения:

     @/(.+?)/(.+?)/?$
    

    Который для чего-то вроде /generic-forum/specific-forum/specific-topic, будет анализировать это:

    index.php?forum=generic-forum&topic=specific-forum/specific-topic
    

    Чтобы проверить, действительно ли это вызывает ошибку 404, измените аргументы перезаписи таксономии так, чтобы они ['rewrite']['hierarchical'] либо не были установлены, либо были установлены в значение false, сбросьте правила перезаписи и измените функцию ссылки на тему, чтобы не добавлять родителей к ссылке; Затем проверьте, работают ли новые ссылки.

    Если это является причиной проблем, есть несколько способов исправить это. Проще всего было бы добавить в пермаструктуру немного обычного текста, например: %forum%/topic/%topic% . Это дало бы вам такие ссылки: /general-forum/sub-forum/topic/whatever . Другой способ — добавить еще один тег перезаписи, например:

    $wp_rewrite->add_rewrite_tag( '%post_type_topic%', '(topic)', 'post_type=' );
    

    затем измените постоянную структуру на «%forum%/%post_type_topic%/%topic%».

    • 0

Оставить ответ

You must login to add an answer.