Question

Comment puis-je redirection 301 pages privées, plutôt que 404 eux? Si un poste est privé, WordPress il filtre dans la requête SQL, donc il n'y a pas de variables $ post pour travailler avec.

Je voudrais que ce code au travail, mais ne fait pas:

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;
}

Je ne sais pas où cela est établi plus tôt que wp, autre que le fait que je sais que c'est un problème de rôle d'utilisateur. Si je pouvais mettre un non-utilisateur connecté pour avoir cette capacité, il serait probablement résoudre le problème:

$publicReader -> add_cap('read_private_posts');

Le problème avec add_cap est que seuls les utilisateurs connectés ont des capacités.

Était-ce utile?

La solution

Désolé les gars, j'ai trouvé ma réponse:

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;
}

Messages / Les pages sont retirés des sitemaps, mais la page encore sur le site afin qu'il puisse obtenir 301'd.

Autres conseils

Tout d'abord, je suis d'accord avec la réponse de @ fencepost. Cependant, je ne pouvais pas résister à l'affichage d'une solution, nous voici donc!

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

Mise à jour :. Code révisé à utiliser le filtre the_posts au lieu de posts_results (qui se déclenche avant de les autorisations contrôles WordPress, et ainsi $posts n'a pas été 'vidé' encore)

Il me semble que vous ne devriez pas retourner 404 ou 301 - vous devez retourner soit 401 (non autorisée / authentification requise, si vous n'acceptera aucune authentification offerte) ou 403 (Rejeté, alias Je sais ce que vous » re demander et vous ne pouvez pas l'avoir).

Il y a un plugin abandonné privé Page Interdite qui pourrait être intéressant de regarder à titre indicatif, mais à un simple coup d'œil, il semble vouloir convertir 404 en 403 qui semble être une mauvaise idée. Malheureusement, alors qu'il ya eu une variété de discussions sur les options (voir https://core.trac.wordpress.org / achats de billets / 10551 et connexes) l'étape des correctifs a progressivement déplacé vers « version ultérieure ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top