Comment 301 messages privés plutôt que 404?
-
16-10-2019 - |
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.
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 ».