web-dev-qa-db-fra.com

Comment personnaliser ma structure de liens courts WordPress dans link-template.php sans plugin?

Actuellement, ma structure de lien court ressemble à ceci:

example.com/?p=451

Je préférerais qu'il ressemble plus à ceci:

exemple.com/abc123

Des idées comment je peux changer le code pour faire juste ceci?

2
Matt

D'accord, comme mentionné dans mon commentaire, la modification des fichiers de base n'est pas une bonne idée. Mais voici une solution de plugin.

Premièrement, nous allons créer nos propres règles de réécriture qui réécrivent s/123 (remplacez 123 par un identifiant de publication) en index.php?short=123. Nous devrons également filtrer les variables de requête WordPress afin de pouvoir les utiliser plus tard.

<?php
add_action( 'init', 'wpse26869_add_rewrites' );
function wpse26869_add_rewrites()
{
    add_rewrite_rule( '^s/(\d+)$', 'index.php?short=$matches[1]', 'top' );
}

add_filter( 'query_vars', 'wpse26869_query_vars', 10, 1 );
function wpse26869_query_vars( $vars )
{
    $vars[] = 'short';
    return $vars;
}

L’appel add_rewrite_rule indique "siffler s, suivi d’une barre oblique et d’une chaîne de un ou plusieurs chiffres correspondant à index.php?short=the_string_of_digits.

Ensuite, nous pouvons nous connecter à la redirection de modèle et voir si notre variable de requête est là. Si c'est le cas, nous allons essayer d'obtenir un lien permanent. Si cela échoue, une erreur 404 est générée. Sinon, nous utiliserons `wp_redirect 'pour envoyer des personnes à la publication réelle.

<?php
add_action( 'template_redirect', 'wpse26869_shortlink_redirect' );
function wpse26869_shortlink_redirect()
{
    // bail if this isn't a short link
    if( ! get_query_var( 'short' ) ) return;
    global $wp_query;

    $id = absint( get_query_var( 'short' ) );
    if( ! $id )
    {
        $wp_query->is_404 = true;
        return;
    }

    $link = get_permalink( $id );
    if( ! $link )
    {
        $wp_query->is_404 = true;
        return;
    }

    wp_redirect( esc_url( $link ), 301 );
    exit();
}

Enfin, nous accrochons en get_shortlink pour changer la manière dont notre rel = "shortlink" apparaît dans la section <head> du site, et ailleurs. Cette nouvelle structure de lien court reflétera la règle de réécriture que nous avons écrite ci-dessus.

<?php
add_filter( 'get_shortlink', 'wpse26869_get_shortlink', 10, 3 );
function wpse26869_get_shortlink( $link, $id, $context )
{
    if( 'query' == $context && is_single() )
    {
        $id = get_queried_object_id();
    }
    return home_url( 's/' . $id );
}

En tant que plugin: https://Gist.github.com/1179555

4
chrisguitarguy

En plus de la réponse de @ ChristopherDavis, vous pouvez aussi le faire de manière PHP indépendante, en utilisant .htaccess. Ajoutez simplement cette règle:

RewriteEngine On
RewriteRule ^s/(\d+)$ index.php?p=$1 [L]

Alternative sans mod_rewrite, en utilisant mod_alias :

RedirectMatch Permanent ^/s/(\d+)$ /?p=$1

Le seul problème est que deux redirections se produisent ici (au lieu de 1) - (par exemple) si l'utilisateur visite http://example.com/s/121/ il est redirigé par le serveur Web vers http://example.com/index.php?p=121/, puis par WordPress vers le permalien réel de la publication.

L'avantage est que cela ne casse jamais! Les plugins peuvent casser, mais ce n'est pas le cas.

PS: J'utilise ceci (la structure de lien courte serait http://example.com/-121 où 121 est l'identifiant de publication):

RewriteEngine On
RewriteRule ^-(\d+)$ index.php?p=$1 [L]
0
its_me