パーマリンクを変更した際に
1.元のスラッグを「%post_name%」にしていて
2.タイトルを日本語で長くつける傾向があり
3.はてブのようなURLを改変されるサービスからのアクセスを維持したい
というとても限定的な方向けの情報です。
ADs
たとえば、以下のようなURLの記事を作成していたとします。
この記事がはてブされた場合、ブックマークのページは以下のURLになります。
末尾数文字が削られる点に注目して下さい。
※URLが正確に合計何文字まで許容されるかはよく分かりませんでした。マルチバイトも考慮していい感じに調整しているようです。
このブクマページから自ページへアクセスすると、以下のURLでアクセスすることになります。
WordPressの場合、この削られたURLでも正規のページへリダイレクトしてくれる「redirect_canonical」という機能がありますのでこの時点では元記事にアクセスすることができます。
カノニカルリダイレクトについて
WordPressのおせっかいな404自動リダイレクトを止める
正しくないページへリダイレクトされるおそれもあるので、一長一短がある機能です。
しかしパーマリンクを変更して元記事が以下のURLになった場合、前述の削られたURLが404となってしまいます。
これを、「http://example.com/男子高校生で売れっ子ライトノベル作家をしているけれど年下のクラスメイトで声優の女の子に」でもアクセスできるようにするという試みです。
やることはカノニカルリダイレクトと同じく、URLからスラッグの部分を取得し、そのスラッグと部分一致する記事を検索してそこにリダイレクトさせます。
1.URLの最後の「/」以降を取得(パーマリンク設定を「%post_name%」や「%category%/%post_name%」にしていれば、これがスラッグになっているはず)
2.そのスラッグをLIKEで検索
3.得られた記事IDからパーマリンクを取得し、リダイレクトする
という手順です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function redirect_404(){ if(is_404()){ global $wpdb; //URLの/以降を取得 $url = $_SERVER["REQUEST_URI"]; $url = explode('/',$url); $url = end($url); //スラッグを部分一致で検索 $sql = " SELECT ID,post_name FROM $wpdb->posts WHERE post_name LIKE %s "; //投稿IDが得られるのでURLを取得し、リダイレクト $post_result = $wpdb->get_results($wpdb->prepare($sql,'%'.$url.'%')); if($post_result){ wp_safe_redirect(get_permalink($post_result[0]->ID),301); } } } add_action('template_redirect', 'redirect_404'); |
LIKEでの検索のため、URLから取得したスラッグが被る記事があると正しくない記事へリダイレクトされるおそれがあります。
http://example.com/男子高校生で売れっ子ライトノベル作家をしているけれど年下のクラスメイトで声優の女の子に首を絞められている
http://example.com/【続】男子高校生で売れっ子ライトノベル作家をしているけれど年下のクラスメイトで声優の女の子に青春をコーディネートされることに
という2記事があった場合、どちらが正しいか判定できない。
似たようなタイトルで記事を書いている場合は注意が必要です。
このラノベは実在します。
ADs
コメントはまだありません。