web-dev-qa-db-ja.com

どのように私はプラグインなしでlink-template.phpの私のWordPressのショートリンク構造をカスタマイズするのですか?

今のところ私のショートリンク構造は次のようになっています。

example.com/?p=451

私はそれがこのように見えることを好むでしょう:

example.com/abc123

これを行うためにコードを変更する方法を教えてください。

2
Matt

さて、それで、あなたへの私のコメントで述べたように:コアファイルを変更することはお勧めできません。しかし、これがプラグインソリューションです。

まず、s/123(123を投稿IDに置き換えます)をindex.php?short=123に書き換える独自の書き換え規則を作成します。また、後で使用できるように、WordPressのクエリ変数もフィルタリングする必要があります。

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

add_rewrite_rule呼び出しは、「sに続けてスラッシュと1桁以上の文字列を続けてindex.php?short=the_string_of_digitsにします。

それからテンプレートリダイレクトにフックして、クエリ変数がそこにあるかどうかを確認できます。もしそうなら、私たちはそれからパーマリンクを取得しようとします。それでも失敗した場合は、404エラーをスローします。さもなければ、私たちは人々を実際の投稿に送るために `wp_redirect 'を使います。

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

最後に、rel = "shortlink"がサイトのget_shortlinkセクションなどに表示される方法を変更するために<head>にフックします。この新しいショートリンク構造は、上で書いた書き換え規則を反映します。

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

プラグインとして: https://Gist.github.com/1179555

4
chrisguitarguy

@ ChristopherDavisの回答とは別に、.htaccessを使ってPHP独立した方法でそれを行うこともできます。このルールを追加するだけです:

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

mod_rewrite を使用して、mod_aliasなしの代替方法

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

唯一の問題は、ここで2つのリダイレクトが発生することです(1の代わりに) - (例えば)ユーザーがhttp://example.com/s/121/にアクセスすると、Webサーバーからhttp://example.com/index.php?p=121/にリダイレクトされ、その後WordPressによって投稿の実際のパーマリンクにリダイレクトされます。

利点は、これが壊れることはないということです。プラグインは壊れるかもしれませんが、これはしません。

PS:これを使います (短いリンク構造はhttp://example.com/-121で121はポストIDです):

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

リダイレクト プラグインを使用すると、PHPまたは.htaccessに触れることなくこれを実現するリダイレクトを追加できます。

前提条件

  • リダイレクトプラグインのインストールとセットアップ

リダイレクトの追加

  • [ツール]> [リダイレクト]に移動します
  • 新規追加ボタンをクリックします

リダイレクトパラメーター

  • ソースURL:^/s /(\ d +)$
  • urlオプション(右端に配置):regexを選択
  • ターゲットURL:/ index.php?p = $ 1

この方法には次の利点があります

  • PHPコーディングなし、.htaccess編集なし
  • アクセストラッキング-ダッシュボードからショートリンクリダイレクトをヒットしている人数を確認できます
  • 404ロギング-正規表現を台無しにした場合のトラブルシューティングに役立ちます
  • 柔軟性-必要に応じて、追跡の目的で投稿タイプまたはソース(電子メール、印刷物、メディア、YouTubeなど)に基づいて複数のショートリンクリダイレクトを作成できます。
  • オプションで、大文字と小文字を区別しないルールを作成できます-これは、このURLを手動で入力する人を頼りにしている場合に特に便利です

.htaccessメソッドの@its_meに感謝します。これにより、必要な正確な正規表現が得られました。

0
James Revillini