WordPressで非公開(private)にした投稿はリダイレクトしないようにする

wordpress_redirectionWordPressでホームページを作成しているときの覚書。

環境: PHP 7.0.15, WordPress 4.7.2

「お問い合わせ」ページから送信した内容を非公開の投稿として保存していた。

そして気付いた。

http://hoge.com/?p=20

とPost IDを付けると

http://hoge.com/鈴木太郎/

に変換(リダイレクト)される。

これはパーマリンクの設定を「/%postname%/」にしておいて、氏名とかを記事のタイトルとして保存した場合に発生する。

Contact Form 7を使っていれば発生しない(と思う)。

 

少なくとも検索エンジンにキャッシュされると困るのでリダイレクトしないように設定した。

このp=20がなかった(is_404)時に鈴木太郎に変換している関数は
/wp-includes/canonical.phpのredirect_canonical()

下記のようにpost_typeで判定してる箇所(117行あたり)があったので

$post_type_obj = get_post_type_object($redirect_post->post_type);
if ( $post_type_obj->public && 'auto-draft' != $redirect_post->post_status ) {
    $redirect_url = get_permalink($redirect_post);
    $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );
}

「post」タイプは公開しないので、全てリダイレクトしないようにフックを仕込む

function my_registered_post_type($post_type) {
    global $wp_post_types;

    if ($post_type == 'post' ||
        $post_type == 'attachment') {
        if (isset($wp_post_types[$post_type]->public)) {
            $wp_post_types[$post_type]->public = is_user_logged_in();
        }
    }
}
add_action('registered_post_type', 'my_registered_post_type');

プレビューで使うかもしれないので、ログインしているユーザーには許可するようにしてある。

WordPressをフレームワーク的に使うことが多いので気付いて良かった。


(2021/04/05 追記) 
このhookを仕込むとamp pluginと相性がよくないので、再度調べてみたらpostnameに変換されないように修正されていた。


< Related Posts >