web-dev-qa-db-fra.com

Mettre à jour le fragment d'URL en une URL canonique permanente

Mes permaliens sont au format domain.com/post-id/post-slug

Je remarque que c'est un excellent choix pour les permaliens, car je peux partager des articles avec une URL courte telle que domain.com/123

Mais quand je vais à cette courte URL, ne devrait-il pas rediriger pour afficher l'URL complète, car dans la barre d'adresse, sa seule indication domain.com/123

N'importe quel réglage pour mettre à jour l'URL vers le réel, sans charge supplémentaire ni serveur.

UPDATE: Mon exigence n'est pas d'obtenir un lien court. Convertissez plutôt un fragment d'URL en URL complète.

Par exemple: si je tape domain.com/123/wrong-slug, il est corrigé en domain.com/123/correct-slug mais si je tape domain.com/123, il n'est pas corrigé en domain.com/123/post-slug

4
Debajyoti Das

Pourquoi?

Je pense que la raison pour laquelle

a) domain.com/123

n'est pas redirigé vers

b) domain.com/123/post-slug

avec les paramètres /%post_id%/%postname%/ permaliens, c’est que la règle correspondante est:

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

Vous pouvez obtenir ces informations à partir de l’objet global $wp.

Il y a d'autres informations utiles dans $wpdisponible après l'action wp:

Exemple (post): 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

Exemple (post): 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

Exemple (page): 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

Exemple de redirection:

Voici un exemple comment rediriger de a) vers b) en utilisant les informations de l'objet global $wp:

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

c'est-à-dire que nous redirigeons lorsque la requête de page n'est pas définie et que la requête est numérique.

ps: je veux juste mentionner que ceci utilise l'action wp, qui est déclenchée assez tard, mais avant l'action template_redirect, permettant la redirection possible.

J'ai aussi essayé de trouver un exemple qui n'utilise pas la variable $_SERVER ;-)

J'espère que cela t'aides.

3
birgire

Le raccourci d’une publication WordPress est défini par défaut sur domain.com/?p=30 et non sur l’ID situé après le domaine. Si vous aimez un lien permanent vers l'ID en tant que lien court pour chaque message, cela est-il possible via un plugin.

La source suivante est un exemple.

add_filter('get_shortlink', 'fb_custom_shortlink_filter');
function fb_custom_shortlink_filter() {
    global $post;

    return get_site_url() . '/fb/' . $post->ID;
}

enter image description here

Mais si vous voulez utiliser la page au début avec cette nouvelle URL courte, la réécriture est importante. Ci-dessous une solution pour php et un rehaussement du htaccess.

Ajoutez la source dans un plugin et ajoutez-la au système frontal ou ajoutez-la dans le fichier de thème index.php. La source vérifie la valeur token à partir de l'URL. Ceci n’est possible que si vous améliorez l’URL via mor_rewrite dans le module .htaccess, voir ci-dessous.

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' )

La réécriture à l'intérieur du .htaccess

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

Vous pouvez utiliser le htaccess rule suivant pour rediriger domain.com/post-id vers domain.com/post-id/post-slug.

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

Placez cette règle au-dessus des règles par défaut de WordPress.

1
palPalani

C'est le plus proche que j'ai eu. Cela fait que les URLs ressemblent à ce que vous vouliez: 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;
}

Ajoutez ceci n'importe où (par exemple, dans functions.php), allez dans Paramètres > Permaliens puis Enregistrer .


Le seulissueavec cette approche est que l'utilisateur reste sur domain.com/123 et ne sera pas redirigé vers la version canonique (domain.com/123/post-name). Ce n'est pas vraiment un problème car vous avez déjà un lien canonical dans le <head> du site Web, donc ce n'est pas un problème pour les moteurs de recherche. Cela pourrait en fait être considéré comme un avantage, car l'utilisateur n'a pas à attendre une redirection.


L'alternative consisterait simplement à utiliser des liens tels que domain.com/?p=123. Ils ne sont plus que 3 caractères et ne rajoutent aucune charge sur le serveur - ils fonctionnent déjà.


Au final, pourquoi mêmeavez-vous besoin deurls courtes? Twitter raccourcit automatiquement toutes les URL, je ne vois pas la nécessité de le faire de nos jours, elles nuisent à la lisibilité des URL.

1
bfred.it