web-dev-qa-db-fra.com

Comment faire 301 messages privés plutôt que 404?

Comment 301 rediriger des pages privées plutôt que 404? Si une publication est privée, WordPress la filtre dans la requête SQL afin qu'il n'y ait pas de variable $ post avec laquelle travailler.

J'aimerais que ce code fonctionne, mais ne le 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 défini avant wp, mis à part le fait que je sais que c'est un problème de rôle d'utilisateur. Si je pouvais configurer cette fonctionnalité pour un utilisateur non connecté, le problème serait probablement résolu:

$publicReader -> add_cap('read_private_posts');

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

3
Dan Gayle

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

Les articles/pages sont supprimés des sitemaps, mais la page apparaît toujours sur le site pour pouvoir en obtenir 301.

4
Dan Gayle

Tout d'abord, je serais d'accord avec la réponse de @ fencepost. Cependant, je n'ai pas pu m'empêcher de poster une solution, alors nous voici!

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

Update : Code modifié pour utiliser le filtre the_posts au lieu de posts_results (qui se déclenche avant que WordPress ne vérifie les autorisations, et donc $posts n'a pas encore été "vidé").

2
TheDeadMedic

Il me semble que vous ne devriez pas renvoyer 404 ou 301, mais 401 (non autorisé/authentification requise, mais vous n'accepterez aucune authentification proposée) ou 403 (rejeté, autrement dit, je sais ce que vous demandez. et vous ne pouvez pas l'avoir).

Il y a un plugin abandonné Page privée interdite qui mérite peut-être d'être guidé, même si, à première vue, il semble vouloir convertir 404 en 403, ce qui semble être une mauvaise idée. Malheureusement, malgré les nombreuses discussions sur les options (voir https://core.trac.wordpress.org/ticket/10551 and related), le jalon pour les correctifs est progressivement passé à "Version future".

1
fencepost