web-dev-qa-db-fra.com

Permaliens de type poste personnalisés donnant 404s

Je ne parviens pas à configurer des permaliens pour un type de publication personnalisé. Ci-dessous le code de ma fonction init:

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;

Fondamentalement, j'essaie de configurer les permaliens à ma guise car je souhaite ajouter un terme de taxonomie personnalisé avant le titre du message.

Au lieu de: topic/whatever

utiliser: general-forum/sub-forum/whatever

C'est la fonction qui change le lien, ce qui semble fonctionner correctement:

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);
}

Donc, l'URL modifiée est affichée correctement, le seul problème est que je reçois une erreur 404 :) Qu'est-ce que je fais mal dans mon code init?

LE: la taxonomie du "forum":

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',
  )
);
1
onetrickpony

Mon plugin Custom Post Permalinks fait ce genre de chose pour vous:

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

Si vous préférez utiliser votre propre solution, il me faudra un peu plus d'informations, telles que le code d'enregistrement de la taxonomie des forums.

Juste deviner, je pense que la regex pour un forum a le même aspect que la regex pour un sujet du moteur de réécriture.

MODIFIER

En regardant votre code, on dirait que vous utilisez 3.1. Le bit $args['rewrite']['hierarchical'] pour les taxonomies n'était pas dans la version 3.0. En gros, cet argument modifie l'expression régulière pour la balise %forum% de ([^/]) à (.+?). Cela signifie que le moteur de réécriture de WordPress obtient d'abord une correspondance pour cette expression régulière:

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

Ce qui, pour quelque chose comme /generic-forum/specific-forum/specific-topic, analysera ceci:

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

Pour vérifier si c'est vraiment ce qui cause le code 404, modifiez les arguments de réécriture de la taxonomie afin que ['rewrite']['hierarchical'] soit soit non défini, soit défini sur false, purgez les règles de réécriture et modifiez votre fonction de lien de sujet pour ne pas ajouter de parents au lien; Puis testez pour voir si les nouveaux liens fonctionnent.

Si cela est la cause des problèmes, il existe deux manières de résoudre ce problème. Le plus simple consisterait à ajouter un peu de texte brut à la permastruct, comme ceci: %forum%/topic/%topic%. Cela vous donnerait des liens comme ceci: /general-forum/sub-forum/topic/whatever. Une autre solution serait d’ajouter une autre balise de réécriture comme celle-ci:

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

puis changez le permastruct en '% forum% /% post_type_topic% /% topic%'.

1
John P Bloch