Aktualisieren Sie den URL-Snippet in die URL von Canonical Permalink

Meine Permalinks sind im Format domain.com/post-id/post-slug

Ich domain.com/123 fest, dass dies eine gute Wahl für Permalinks ist, da ich Artikel mit einer kurzen URL wie domain.com/123

Aber wenn ich zu dieser kurzen URL gehe, sollte sie nicht redirect, um die vollständige URL anzuzeigen, weil sie in der Adressleiste nur domain.com/123

Jede Einstellung, um die URL auf den tatsächlichen zu aktualisieren, ohne zusätzliche Last oder den Server zu setzen.

UPDATE : Meine Anforderung ist nicht, einen Kurzlink zu bekommen. Stattdessen ein URL-Fragment in die vollständige URL konvertieren.

Zum Beispiel: Wenn ich domain.com/123/wrong-slug es auf domain.com/123/correct-slug korrigiert, aber wenn ich domain.com/123 es nicht auf domain.com/123/post-slug korrigiert. domain.com/123/post-slug

Solutions Collecting From Web of "Aktualisieren Sie den URL-Snippet in die URL von Canonical Permalink"

Warum?

Ich denke der Grund warum

 a) domain.com/123 

wird nicht zurück zu weitergeleitet

 b) domain.com/123/post-slug 

Mit den Einstellungen /%post_id%/%postname%/ permalinks lautet die übereinstimmende Regel:

 [matched_rule] => ([0-9]+)(/[0-9]+)?/?$ 

Sie können diese Informationen vom globalen $wp Objekt $wp .

Es gibt weitere nützliche Informationen in $wp die nach der Aktion $wp verfügbar sind:

Beispiel (Beitrag): domain.com/123/post-slug/

 [query_vars] => Array ( [p] => 123 [page] => [name] => post-slug ) [query_string] => p=123&name=post-slug [request] => 123/post-slug [matched_rule] => ([0-9]+)/([^/]+)(/[0-9]+)?/?$ [matched_query] => p=123&name=post-slug&page= [did_permalink] => 1 

Beispiel (Beitrag): domain.com/123/ :

 [query_vars] => Array ( [p] => 123 [page] => ) [query_string] => p=123 [request] => 123 [matched_rule] => ([0-9]+)(/[0-9]+)?/?$ [matched_query] => p=123&page= [did_permalink] => 1 

Beispiel (Seite): domain.com/hello-world/ :

 [query_vars] => Array ( [page] => [pagename] => hello-world ) [query_string] => pagename=hello-world [request] => hello-world [matched_rule] => (.?.+?)(/[0-9]+)?/?$ [matched_query] => pagename=hello-world&page= [did_permalink] => 1 

Umleitungsbeispiel:

Hier ist ein Beispiel, wie man von a) nach b) mit Informationen aus dem globalen $wp Objekt umleitet:

 add_action( 'wp', function(){ global $wp; if( is_numeric( $wp->request ) && empty( $wp->query_vars['page'] ) ) { wp_redirect( get_permalink( absint( $wp->request ) ), 301 ); exit(); } }); 

Das heißt, wir leiten um, wenn das Seitenabfragevariable nicht gesetzt ist und die Anfrage numerisch ist.

ps: Ich möchte nur erwähnen, dass dies die wp Aktion verwendet, die ziemlich spät ausgetriggers wird, aber vor der template_redirect Aktion, die das Redirect ermöglicht.

Ich habe auch versucht, ein Beispiel zu finden, das die Variable $_SERVER nicht verwendet $_SERVER

Hoffe das hilft.

Der domain.com/?p=30 eines WordPress-Beitrags befindet sich standardmäßig auf domain.com/?p=30 , nicht die domain.com/?p=30 nach der Domain. Wenn Sie einen Permalink zur ID als Kurzlink für jeden Beitrag wünschen, dann ist dies über ein Plugin möglich.

Die folgende Quelle ist ein Beispiel.

 add_filter('get_shortlink', 'fb_custom_shortlink_filter'); function fb_custom_shortlink_filter() { global $post; return get_site_url() . '/fb/' . $post->ID; } 

Bildbeschreibung hier eingeben

Aber wenn Sie die Seite im Frontend mit dieser neuen kurzen URL verwenden, ist ein Umschreiben wichtig. Unten eine Lösung für PHP und eine Erweiterung im htaccess.

Fügen Sie die Quelle in einem Plugin hinzu und fügen Sie diese dem Frontend hinzu oder fügen Sie die Theme-Datei index.php . Die Quelle überprüft das Wert- token von der URL. Dies ist nur möglich, wenn Sie die URL über das mor_rewrite-Modul in der .htaccess-Datei erweitern, siehe unten.

 if ( ! empty( $_GET['token'] ) ) { $id = strip_tags( $_GET['token'] ); if ( is_numeric( $id ) ) { header( $_SERVER['SERVER_PROTOCOL'].' 301 Moved Permanently' ); header( 'Location: ' . get_site_url() . '?p=' . $id ); exit(); } } header( $_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found' ); header( 'Status:404' ); die( '404 Not Found' ) 

Das Neuschreiben im .htaccess

  RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) index.php?token=$1 [QSA,L] 

Das ist das nächste, was ich habe. Es macht URLs, wie Sie arbeiten wollten: domain.com/123

 // refresh/flush permalinks in the dashboard if this is changed in any way add_filter( 'generate_rewrite_rules', 'create_post_id_url' ); function create_post_id_url( $wp_rewrite ) { $feed_rules = array( '(\d+)' => 'index.php?p='.$wp_rewrite->preg_index(1) ); $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules; } 

Fügen Sie dies überall hinzu (zB in functions.php ), gehen Sie zu Einstellungen > Permalinks und dann Speichern .


Das einzige Problem bei diesem Ansatz ist, dass der Benutzer auf domain.com/123 und nicht zur kanonischen Version ( domain.com/123/post-name ) weitergeleitet wird. Es ist nicht wirklich ein Problem, da Sie bereits einen canonical Link im der Website haben, also ist das kein Problem für Suchmaschinen. Es könnte tatsächlich als Vorteil angesehen werden, da der Benutzer nicht auf eine Weiterleitung warten muss.


Die Alternative wäre, nur Links wie domain.com/?p=123 . Sie sind nur 3 Zeichen länger und fügen dem Server keine Last hinzu – sie funktionieren bereits.


Warum brauchst du am Ende sogar kurze URLs? Twitter verkürzt automatisch alle URLs, das sehe ich heute nicht mehr, sie beeinträchtigen nur die Lesbarkeit von URLs.

Sie können die folgende htaccess rule um domain.com/post-id auf domain.com/post-id/post-slug .

 RedirectMatch 301 ^/(\d+)$ http://domain.com/?p=$1 

Setzen Sie diese Regel über die Standardregeln von WordPress.