it-swarm.com.de

Wie kann ich meine WordPress-Shortlink-Struktur in link-template.php ohne Plugin anpassen?

Im Moment sieht meine Shortlink-Struktur ungefähr so ​​aus:

example.com/?p=451

Ich würde es vorziehen, so auszusehen:

example.com/abc123

Irgendwelche Ideen, wie ich den Code ändern kann, um genau dies zu tun?

2
Matt

Okay, also, wie in meinem Kommentar an Sie erwähnt: Das Ändern von Core-Dateien ist keine gute Idee. Aber hier ist eine Plugin-Lösung.

Zuerst werden wir unsere eigenen Umschreiberegeln erstellen, die s/123 (ersetzen Sie 123 durch eine Beitrags-ID) in index.php?short=123 umschreiben. Wir müssen auch die WordPress-Abfragevariablen filtern, damit wir sie später verwenden können.

<?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;
}

Der Aufruf von add_rewrite_rule lautet "rewite s gefolgt von einem Schrägstrich und einer Zeichenfolge aus einer oder mehreren Ziffern zu index.php?short=the_string_of_digits".

Dann können wir uns in die Vorlagenumleitung einhängen und sehen, ob unsere Abfragevariable vorhanden ist. Wenn ja, werden wir versuchen, einen Permalink daraus zu machen. Wenn dies fehlschlägt, werden wir einen 404-Fehler auslösen. Andernfalls verwenden wir "wp_redirect", um Leute zum eigentlichen Beitrag zu schicken.

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

Schließlich schließen wir uns get_shortlink an, um zu ändern, wie unser rel = "shortlink" im Abschnitt <head> der Site und an anderer Stelle angezeigt wird. Diese neue Shortlink-Struktur wird die oben beschriebene Umschreiberegel widerspiegeln.

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

Als Plugin: https://Gist.github.com/1179555

4
chrisguitarguy

Abgesehen von der Antwort von @ ChristopherDavis können Sie dies auch auf PHP unabhängige Weise unter Verwendung von .htaccess tun. Fügen Sie einfach diese Regel hinzu:

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

Alternative ohne mod_rewrite mit mod_alias :

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

Das einzige Problem ist, dass hier zwei Weiterleitungen auftreten (anstelle von 1) - (zum Beispiel), wenn der Benutzer http://example.com/s/121/ besucht und vom Webserver zu http://example.com/index.php?p=121/ und dann von WordPress zum eigentlichen Permalink des Posts weitergeleitet wird.

Der Vorteil ist, das bricht nie! Plugins können möglicherweise fehlerhaft sein, dies ist jedoch nicht der Fall.

PS: Ich verwende dieses (kurze Linkstruktur wäre http://example.com/-121, wobei 121 die Post-ID ist):

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