it-swarm.com.de

Benutzerdefinierte Posttyp-Permalinks mit 404-Werten

Ich habe Probleme beim Einrichten von Permalinks für einen benutzerdefinierten Beitragstyp. Unten ist der Code aus meiner Init-Funktion:

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;

Grundsätzlich versuche ich, Permalinks auf meine eigene Art einzurichten, weil ich einen benutzerdefinierten Taxonomiebegriff vor dem Post-Titel anhängen möchte.

Anstelle von: topic/whatever

benutze: general-forum/sub-forum/whatever

Dies ist die Funktion, die den Link ändert, was in Ordnung zu sein scheint:

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

Die geänderte URL wird also einwandfrei angezeigt. Das einzige Problem ist, dass ich eine 404-Fehlermeldung erhalte :) Was mache ich falsch in meinem Init-Code?

LE: die 'Forum'-Taxonomie:

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

Mein Plugin Custom Post Permalinks erledigt so etwas für Sie:

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

Wenn Sie lieber Ihre eigene Lösung verwenden möchten, benötige ich weitere Informationen, z. B. den Registrierungscode für die Foren-Taxonomie.

Nur raten, ich denke, der reguläre Ausdruck für ein Forum sieht identisch aus mit dem regulären Ausdruck für ein Thema für die Rewrite-Engine.

BEARBEITEN

Wenn Sie Ihren Code betrachten, sieht es so aus, als würden Sie 3.1 verwenden. Das $args['rewrite']['hierarchical']-Bit für Taxonomien war nicht in 3.0 enthalten. Grundsätzlich ändert dieses Argument den regulären Ausdruck für das %forum%-Tag von ([^/]) in (.+?). Dies bedeutet, dass die Umschreibe-Engine von WordPress zuerst eine Übereinstimmung für diesen regulären Ausdruck erhält:

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

Was für so etwas wie /generic-forum/specific-forum/specific-topic wie folgt aussieht:

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

Um zu testen, ob dies wirklich die Ursache für den Fehler 404 ist, ändern Sie die Umschreibeargs der Taxonomie so, dass ['rewrite']['hierarchical'] entweder nicht oder auf false festgelegt ist, leeren Sie die Umschreiberegeln und ändern Sie die Themenlinkfunktion, um dem Link keine übergeordneten Elemente hinzuzufügen. Testen Sie dann, ob die neuen Links funktionieren.

Wenn dies die Ursache für die Probleme ist, gibt es verschiedene Möglichkeiten, dies zu beheben. Am einfachsten wäre es, dem Permastrukt ein wenig einfachen Text hinzuzufügen: %forum%/topic/%topic%. Das würde dir Links wie diesen geben: /general-forum/sub-forum/topic/whatever. Eine andere Möglichkeit wäre, ein weiteres Umschreib-Tag wie das folgende hinzuzufügen:

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

ändern Sie dann die Permastruktur in "% forum% /% post_type_topic% /% topic%".

1
John P Bloch