Ich möchte der Autorenseite einen neuen Endpunkt hinzufügen, sodass die URL wie folgt aussieht:
http://example.com/writer/username/articles
- Übergeben einer fest codierten Seite / Post-ID an "get_post"
- Beiträge, die nicht in index.php angezeigt werden
- Kann ich einen Teil des Posts in einer externen Datei speichern und gleichzeitig beitreten, um Redundanz in der Tabelle wp_posts zu vermeiden?
- Einschließlich Text am Ende jedes Posts
- Ist es möglich, dem Benutzer die Möglichkeit zu geben, zwischen zwei einzelnen Vorlagendateien zu wählen, um sie in einem Beitrag zu verwenden?
- Ausgabepuffer-Problem mit einzelner Post-Ansicht
Bisher habe ich:
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' );
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: