web-dev-qa-db-ja.com

URLスニペットを正規のパーマリンクURLに更新

私のパーマリンクはdomain.com/post-id/post-slugの形式です

domain.com/123のような短いURLで記事を共有できるので、これはパーマリンクには最適の選択です。

しかし、私がこの短いURLに行くと、完全なURLを表示するようにリダイレクトしないのであれば、アドレスバーに表示されるのはdomain.com/123だけなので

追加の負荷やサーバーを使用せずに、URLを実際のURLに更新するための設定。

UPDATE:私の要件は、ショートリンクを取得しないことです。 URLフラグメントを完全なURLに変換するのではなく。

例えば:私がdomain.com/123/wrong-slugと入力した場合、それはdomain.com/123/correct-slugに修正されますが、domain.com/123と入力した場合はdomain.com/123/post-slugに修正されません

4
Debajyoti Das

どうして?

その理由だと思う

a) domain.com/123

にリダイレクトされません

b) domain.com/123/post-slug

/%post_id%/%postname%/パーマリンク設定では、マッチしたルールは次のようになります。

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

その情報はグローバルな$wpオブジェクトから取得できます。

wpアクションの後に利用可能な$wpの他の有用な情報があります。

例(投稿):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

リダイレクトの例:

情報を使用してa)からb)にリダイレクトする方法の例を示します。グローバル$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();
    }
});

つまり、ページクエリ変数が設定されておらず、リクエストが数値の場合はリダイレクトします。

ps:これはwpアクションを使用していることに言及したいのですが、これはかなり遅く、しかしtemplate_redirectアクションの前に発生します。リダイレクトを可能にします。

また、$_SERVER変数を使用していない例を考えてみました。

お役に立てれば。

3
birgire

WordPress投稿のショートリンクはデフォルトのdomain.com/?p=30にあり、ドメインの後のIdにはありません。あなたが各投稿のためのショートリンクとしてIDへのパーマリンクを好めば、それからプラグインを介してこれが可能です。

フォローソースは一例です。

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

しかし、あなたがこの新しい短いURLでフロントエンドのページを使うつもりなら、書き直すことが重要です。以下はphpの解決策とhtaccessの機能強化です。

ソースをプラグインに追加してフロントエンドに追加するか、テーマファイルindex.phpに追加します。ソースはURLからの値tokenをチェックします。これは可能です、あなたが.htaccessのmor_rewriteモジュールを通してURLを強化するならば、下記を見てください。

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

.htaccess内の書き換え

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

htaccess ruledomain.com/post-idにリダイレクトするには、次のdomain.com/post-id/post-slugを使用できます。

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

この規則をWordPressのデフォルトの規則の上に置きます。

1
palPalani

これは私が得た最も近いです。それはあなたが欲しいもののようなURLを作ります: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;
}

これをどこにでも(例えばfunctions.phpで)追加してください、設定>パーマリンク次に保存します。


このアプローチの唯一の問題は、ユーザーがdomain.com/123のままになり、正規版(domain.com/123/post-name)にリダイレクトされないことです。あなたがすでにウェブサイトの<head>canonicalリンクを持っているので、それはそれほど問題ではありません、それでそれは検索エンジンにとって問題ではありません。ユーザーはリダイレクトを待つ必要がないため、実際には利点と見なすことができます。


別の方法はdomain.com/?p=123のようなリンクを使うことです。それらはたった3文字の長さであり、サーバーに負荷を加えることはありません - それらはすでに機能しています。


最後に、なぜあなたは短いURLさえ必要ですかTwitterは自動的にすべてのURLを短くします、私はそうします今日それをする必要性を見ないで、それらはURLの可読性を単に損ないます。

1
bfred.it