如何获得301个私人帖子而不是404个?
-
16-10-2019 - |
题
我如何301重定向私人页面,而不是404页?如果帖子是私有的,则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的问题在于,只有登录的用户具有功能。
解决方案
对不起,我找到了我的答案:
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。
其他提示
首先,我必须同意 @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
还没有被“清空”)。
在我看来,您不应该返回404或301-您应该返回401(未经授权 /身份验证,尽管您不接受提供的任何身份验证)或403(被拒绝,又名我知道您的要求而且你不能拥有它)。
有一个废弃的插件 禁止私人页面 这可能值得寻求指导,尽管偶然地看着404转换为403,这似乎是一个坏主意。不幸的是,尽管有各种各样的讨论(请参阅 https://core.trac.wordpress.org/ticket/10551 并相关)修复的里程碑已逐渐转向“未来发布”。