Meine Permalinks haben das Format domain.com/post-id/post-slug
Ich stelle fest, dass dies eine gute Wahl für Permalinks ist, da ich Artikel mit einer kurzen URL wie domain.com/123
teilen kann.
Aber wenn ich zu dieser kurzen URL gehe, sollte sie nicht umleiten, um die vollständige URL anzuzeigen, da in der Adressleiste nur der domain.com/123
angezeigt wird.
Beliebige Einstellung, um die URL auf den aktuellen Stand zu bringen, ohne dass eine zusätzliche Belastung oder Belastung des Servers erforderlich ist.
UPDATE: Ich benötige keinen Shortlink. Eher, um ein URL-Fragment in die vollständige URL zu konvertieren.
Zum Beispiel: Wenn ich domain.com/123/wrong-slug
eingebe, wird es zu domain.com/123/correct-slug
korrigiert, aber wenn ich domain.com/123
eingebe, wird es nicht zu domain.com/123/post-slug
korrigiert
Ich denke der Grund warum
a) domain.com/123
wird nicht zurück an umgeleitet
b) domain.com/123/post-slug
bei den Einstellungen für /%post_id%/%postname%/
permalinks lautet die übereinstimmende Regel wie folgt:
[matched_rule] => ([0-9]+)(/[0-9]+)?/?$
Sie können diese Informationen aus dem globalen Objekt $wp
abrufen.
Es gibt weitere nützliche Informationen in $wp
, die nach der Aktion wp
verfügbar sind:
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
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
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
Im Folgenden finden Sie ein Beispiel für die Weiterleitung von a) nach b) mithilfe von Informationen aus dem globalen $wp
-Objekt:
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();
}
});
wir leiten um, wenn die Seitenabfragevariable nicht gesetzt ist und die Anfrage numerisch ist.
ps: Ich möchte nur erwähnen, dass dies die Aktion wp
verwendet, die ziemlich spät ausgelöst wird, aber vor der Aktion template_redirect
, wodurch die Weiterleitung möglich wird.
Ich habe auch versucht, ein Beispiel zu finden, bei dem die Variable $_SERVER
nicht verwendet wird ;-)
Hoffe das hilft.
Der Shortlink eines WordPress-Posts lautet standardmäßig domain.com/?p=30
, nicht die ID nach der Domain. Wenn Sie für jeden Beitrag einen Permalink zur ID als Shortlink 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;
}
Aber wenn Sie die Seite im Frontend mit dieser neuen Kurz-URL nutzen wollen, ist ein Umschreiben wichtig. Nachfolgend eine Lösung für PHP und eine Erweiterung des htaccess.
Fügen Sie die Quelle in ein Plugin ein und fügen Sie diese in das Front-End ein oder fügen Sie die Themendatei index.php
hinzu. Die Quelle überprüft den Wert token
aus der URL. Dies ist nur möglich, wenn Sie die URL über das Modul mor_rewrite in der Datei .htaccess 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 Umschreiben im .htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php?token=$1 [QSA,L]
Sie können den folgenden htaccess rule
verwenden, um domain.com/post-id
zu domain.com/post-id/post-slug
umzuleiten.
RedirectMatch 301 ^/(\d+)$ http://domain.com/?p=$1
Setzen Sie diese Regel über die Standardregeln von WordPress.
Das ist der nächste, den ich bekommen habe. Damit funktionieren URLs wie gewünscht: 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 irgendwo hinzu (z. B. in functions.php
), gehen Sie zu Einstellungen > Permalinks und dann zu Speichern .
Das einzigeProblembei diesem Ansatz ist, dass der Benutzer auf domain.com/123
bleibt und nicht zur kanonischen Version (domain.com/123/post-name
) umgeleitet wird. Es ist nicht wirklich ein Problem, da Sie bereits einen canonical
-Link im <head>
der Website haben, sodass es kein Problem für Suchmaschinen ist. Dies kann als Vorteil angesehen werden, da der Benutzer nicht auf eine Umleitung warten muss.
Die Alternative wäre nur die Verwendung von Links wie domain.com/?p=123
. Sie sind nur 3 Zeichen länger und belasten den Server nicht - sie funktionieren bereits.
Am Ende warum brauchst du überhauptkurze URLs? Twitter verkürzt automatisch alle URLs, ich sehe keine Notwendigkeit, dies heutzutage zu tun, sie beeinträchtigen nur die Lesbarkeit von URLs.