Fügen Sie den Umschreibendpunkt der Autorenseite + Paginierung hinzu

Ich möchte der Autorenseite einen neuen Endpunkt hinzufügen, sodass die URL wie folgt aussieht:

http://example.com/writer/username/articles

Bisher habe ich:

  • Die Autorenbasis wurde geändert
  • Regel zum erneuten Schreiben hinzugefügt
  • Richten Sie die Abfrage_vars ein
  • Der Endpunkt wurde hinzugefügt
  • Benutzte template_redirect, um meine Vorlage zu verwenden

Ergebnis: 404 Seite nicht gefunden (auch nach dem Löschen der Umschreibungsregeln). Ich kann nicht herausfinden, wo das Problem liegt. Außerdem möchte ich dem Endpunkt Paginierung hinzufügen. Unten ist mein Code:

Die Autorenbasis geändert:

function foo_change_author_base() { global $wp_rewrite; $wp_rewrite->author_base = 'writer'; } add_filter( 'init', 'foo_change_author_base', 0 ); 

Regel zum Umschreiben hinzugefügt:

 function foo_rewrite_rule() { add_rewrite_rule( 'writer/([^/]+)/articles(/(.*))?/?$', 'index.php?author_name=$matches[1]&articles=$matches[3]', 'top' ); } add_action( 'init', 'foo_rewrite_rule' ); 

Setup query_vars:

 function foo_add_vars($vars) { $vars[] = 'articles'; return $vars; } add_filter('query_vars', 'foo_add_vars'); 

Der Endpunkt wurde hinzugefügt:

 function foo_add_endpoint() { global $wp_rewrite; add_rewrite_endpoint( 'articles', EP_AUTHORS | EP_PAGES ); } add_action( 'init', 'foo_add_endpoint'); 

Und meine Vorlage hinzugefügt:

 function foo_rewrite_template() { global $wp_query; if ( array_key_exists( 'articles', $wp_query->query_vars ) ) { include (get_template_directory_uri() . '/articles.php'); exit; } } add_action( 'template_redirect', 'foo_rewrite_template' ); 

Solutions Collecting From Web of "Fügen Sie den Umschreibendpunkt der Autorenseite + Paginierung hinzu"

Dein Code sollte funktionieren. Die Linie:

 include (get_template_directory_uri() . '/articles.php'); 

Muss in der Serverkonfiguration allow_url_include = 1 haben, weil Sie versuchen, eine Datei über http einzubinden. Kannst du das überprüfen?

Sie müssen auch wissen, dass template_redirect für eine echte Weiterleitung verwendet werden soll, ein include() kann hier unerwünschte Auswirkungen haben. Ich denke, was Sie wirklich wollen, ist template_include:

 add_filter('template_include', 'my_template_include'); function my_template_include( $template ) { global $wp->query; if ( array_key_exists( 'articles', $wp_query->query_vars ) ) { return get_template_directory() . '/articles.php'; } return $template; } 

Also hier ist mein Code:

 function foo_change_author_base() { global $wp_rewrite; $wp_rewrite->author_base = 'writer'; } add_filter( 'init', 'foo_change_author_base', 0 ); function foo_rewrite_rule() { add_rewrite_rule( 'writer/([^/]+)/articles/page/([0-9]{1,})/?$', 'index.php?author_name=$matches[1]&articles=1&paged=$matches[2]', 'top' ); //If you don't want the last trailing slash change the las /?$ to just $ add_rewrite_rule( 'writer/([^/]+)/articles/?$', 'index.php?author_name=$matches[1]&articles=1', 'top' ); } add_action( 'init', 'foo_rewrite_rule' ); function foo_add_vars($vars) { $vars[] = 'articles'; return $vars; } add_filter('query_vars', 'foo_add_vars'); function foo_add_endpoint() { add_rewrite_endpoint( 'articles', EP_AUTHORS ); } //add_action( 'init', 'foo_add_endpoint'); // Commented out // Edit: add_rewrite_endpoint is not needed when using add_rewrite_rule // auto-add the articles endpoint to author links function foo_author_link_filter( $link, $author_id, $author_nicename ) { return user_trailingslashit($link) . 'articles/'; } add_filter( 'author_link', 'foo_author_link_filter', 20, 3); add_filter('template_include', 'foo_template_include'); function foo_template_include( $template ) { global $wp_query; //You may need some other checks if ( array_key_exists( 'articles', $wp_query->query_vars ) ) { return get_template_directory() . '/articles.php'; } return $template; } 

Gehen Sie jetzt zu Ihrer Website /writer/author_name/articles/

Wenn Sie den Endpunkt hinzufügen, müssen Sie die Regel zum erneuten Schreiben nicht hinzufügen. Wenn Sie jedoch mit dem Paging umgehen möchten, verwenden Sie besser die Rewrite-Regel. Wirklich 2 Rewrite-Regeln, auf Seite eins für nicht ausgelagert.

Danach ist Ihre Artikelabfrage var nicht dazu bestimmt, etwas zu enthalten, das nur existiert oder nicht. Aus diesem Grund können Sie es einfach auf 1 setzen, wenn es existiert.

Dann fügen Sie einfach einen Filter auf Vorlage ein, wie @cybnet in seiner Antwort vorschlagen.

Der gesamte Code sollte so aussehen:

 function foo_change_author_base() { global $wp_rewrite; $wp_rewrite->author_base = 'writer'; } add_filter( 'init', 'foo_change_author_base', 0 ); function foo_add_vars($vars) { $vars[] = 'articles'; return $vars; } add_filter('query_vars', 'foo_add_vars'); function foo_rewrite_rule() { add_rewrite_rule( 'writer/([^/]+)/articles/page/([^/]*)$', 'index.php?author_name=$matches[1]&articles=1&paged=$matches[2]', 'top' ); add_rewrite_rule( 'writer/([^/]+)/articles(.*)$', 'index.php?author_name=$matches[1]&articles=1', 'top' ); } add_action( 'init', 'foo_rewrite_rule' ); function foo_rewrite_template( $template ) { if ( ! is_author() ) return $template; global $wp_query; if ( $wp_query->get('articles') ) return ( get_template_directory(). '/articles.php'); return $template; } add_filter( 'template_include', 'foo_rewrite_template' ); // add a filter to author link, so 'get_author_posts_url' return the customized url function foo_author_link_filter( $link, $author_id, $author_nicename ) { return user_trailingslashit($link) . 'articles/'; } add_filter( 'author_link', 'foo_author_link_filter', 20, 3); 

Das funktioniert gut mit Paginierung. Denken Sie nur daran, die Permalink-Einstellungen erneut zu speichern.


Unter einem Druckbildschirm aus meiner Testumgebung, wo ich diesen Code teste:

Bildbeschreibung hier eingeben