私はWordPressが奇妙な振る舞いをしたことに気づいた。そこでは自動的に301が投稿のために特定のURL構造をリダイレクトする。
たとえば、私はのための投稿エントリがあります:mysite.com/999/about-us
次に、次のリンクから404が生成されると思います。mysite.com/567891/about-us-1
しかし、WordPressは自動的に/ 999/about-usにリダイレクトします
この特定の種類のリダイレクトを無効にする方法はありますか? WPは最も近い "like"スラッグを探しているようです。私はpostsテーブルにabout-us-1のエントリがないこと、そしてWPをこのように転送させるような修正や何かがないことに注意してください。
標準の301リダイレクトをオフにするこのスニペットを見つけました。
remove_filter('template_redirect','redirect_canonical');
ただし、これは解決策ではありません。サイト上に望ましくないURL構造が作成されるためです。
これはwp-includes/canonical.php
の96行目で呼び出されるredirect_guess_404_permalink()
と関係があるようです。テストのためだけに、redirect_guess_404_permalink()
関数の最初の行にreturn false;
を追加しました。これで、この奇妙な動作が停止したようです。私はちょっとうんざりしていますが、これまでのところ、その中核となるWordPressファイルを編集せずにこれを修正するgoodの方法は見当たりませんコアアップデートがより難しくなり、事故を起こしやすくなります。この振る舞いを短縮するためにredirect_guess_404_permalink
で使用するための優れたフィルター/アクションフックがあったらいいのにと思います。私は良い解決策を見つけたら私は少し突っ込み続けてこの答えを更新します。
編集
私は簡単にテストしてうまくいった修正を見つけたかもしれません。
編集(再度)特定のクエリパラメータをチェックするためのロジック( canonical.php で行われたチェックを複製する)を追加しました。最後の編集ほどテストされていないので、どうやって動くのか教えてください。 100%うまく動かないのであれば、少なくとも正しい方向に導いてくれるはずです(そして canonical.php をチェックしてください)。
add_action('template_redirect', 'remove_404_redirect', 1);
function remove_404_redirect(){
if (is_404()){
$id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id'));
$redirect_url = false;
if ($id && $redirect_post = get_post($id)) {
$post_type_obj = get_post_type_object($redirect_post->post_type);
if ($post_type_obj->public)
$redirect_url = get_permalink($redirect_post);
}
if (!$redirect_url)
remove_filter('template_redirect', 'redirect_canonical');
}
}
ページが最初は404である場合にのみ不要なリダイレクトが発生しているため、これは機能します。したがって、404を確認し、リダイレクトされている場合はリダイレクトフィルタを削除します。わーい!
これはもっと簡単なことです。 query_varsが存在しない場合にのみリダイレクトをオフにします。このようにして、すでにredirect_canonicalにあるロジックを複製する必要なしに、機能を維持することができます。
add_filter('redirect_canonical', 'no_redirect_on_404', 10, 2);
function no_redirect_on_404($redirect_url, $requested_url){
$id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id'),
get_query_var('day'), get_query_var('monthnum'), get_query_var('year'));
if (is_404() && !$id){
return false;
}
return $redirect_url;
}