web-dev-qa-db-ja.com

404ではなく301の非公開投稿をするにはどうすればいいですか?

プライベートページをリダイレクトするのではなく、どのようにして301プライベートページをリダイレクトするのですか。投稿が非公開の場合、WordPressはそれをSQLクエリで除外します。そのため、使用する$ post変数はありません。

このコードを機能させたいのですが、うまくいきません。

add_action('wp','redirect_stuffs', 0);
function redirect_stuffs(){
global $post;
    if ( $post->post_status == "private" && !is_admin() ):
        wp_redirect("http://dangayle.com/",301);
        exit();
    endif;
}

私はそれがユーザーロールの問題であることを知っているという事実を除いて、それがwpより前に設定されている場所を知りません。ログインしていないユーザーにその機能を持たせることができれば、おそらく問題は解決するでしょう。

$publicReader -> add_cap('read_private_posts');

Add_capの問題は、ログインしているユーザーだけが機能を持つことです。

3
Dan Gayle

すみません、私は私の答えを見つけました:

add_action('wp','redirect_stuffs', 0);
function redirect_stuffs(){
global $wpdb; 
    if ($wpdb->last_result[0]->post_status == "private" && !is_admin() ):
        wp_redirect( home_url(), 301 );
        exit();
    endif;
}

投稿/ページはサイトマップから削除されますが、ページは301'dになることができるようにまだサイトに表示されます。

4
Dan Gayle

まず、@ fencepostの答えに同意する必要があります。しかし、私は解決策を投稿することに抵抗することはできませんでしたので、ここに私たちはいます!

function __intercept_private_page( $posts, &$wp_query )
{
    // remove filter now, so that on subsequent post querying we don't get involved!
    remove_filter( 'the_posts', '__intercept_private_page', 5, 2 );

    if ( !( $wp_query->is_page && empty($posts) ) )
        return $posts; // bail, not page with no results

    // if you want to explicitly check it *is* private, use the code block below:   
    /*
        if ( !empty( $wp_query->query['page_id'] ) )
            $page = get_page( $wp_query->query['page_id'] );
        else
            $page = get_page_by_path( $wp_query->query['pagename'] );

        if ( $page && $page->post_status == 'private' ) {
            // redirect
        }
    */

    // otherwise assume that if the request was for a page, and no page was found, it was private
    wp_redirect( home_url(), 301 );
    exit;
}
is_admin() || add_filter( 'the_posts', '__intercept_private_page', 5, 2 );

更新the_postsの代わりにposts_resultsフィルタを使うようにコードを修正しました(これはWordPressが権限をチェックする前に起動するので、$postsはまだ '空に'されていません)。

2
TheDeadMedic

404か301のどちらかを返すべきではないように思えます - 401(あなたはどんな認証も受け入れませんが、許可されていない/認証が必要です)または403(拒否されます。そしてあなたはそれを持つことはできません。

見捨てられたプラグイン Private Page Forbidden がありますが、一見すると404を403に変換する必要があるようです。悪い考えのように。残念ながら、さまざまなオプションについての議論がありました( https://core.trac.wordpress.org/ticket/10551 および関連記事を参照)修正のため、徐々に「将来のリリース」に移行しました。

1
fencepost