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.
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.
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é").
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".