将受限页面重定向到404


21

如果当前登录的用户没有查看页面的正确权限,是否可以显示404页面?我正在寻找一种PHP方法,例如

if( !current_user_can('administrator') ) { show_404(); exit(); }

我曾考虑过使用重定向,但我想保持网址不变。


如果您拒绝访问某个现有页面的用户,则404是错误的错误代码。401或403更有意义。
moopet

1
你是对的。客户端给我的印象是,他甚至不希望任何无法访问的人知道该页面的存在,抛出401表示该页面存在但被禁止。尽管如此,改为抛出401将是一个容易的更改。
Evan Yeung,

Answers:


50

通过在标题中使用以下代码,我能够显示404错误。

<?php
  global $wp_query;
  $wp_query->set_404();
  status_header( 404 );
  get_template_part( 404 ); exit();
?>

分解
$wp_query->set_404()::告诉wp_query这是一个404,这会更改标题
status_header():发送HTTP 404标头
get_template_part():显示404模板


这是一个很好的答案,但是http_status_code(404);在设置模板之前,我还会使用以确保标题正确(这比wordpress status_header( 404 );函数要快得多)。如果您担心网页排名,还应该Disallow在robots.txt中放置一条规则,以表明它不是公共资源。
mopsyd

2

为什么不创建一个显示错误消息的页面,然后将用户重定向到该页面?这是实现此目的的简单方法:

打开404.php文件,并将以下行添加到文件顶部:

/**
 * Template Name: 404 Page
 */

创建带有404 Page模板的页面。然后重定向用户:

if ( !current_user_can('administrator') ) {
    $404_page = get_permalink( $404_page_id );
    wp_redirect( $404_page );
    exit();
}

您应该为404请求使用页面的原因是:在WP 404页面中实际上是一个不存在的页面,WP必须在返回404页面之前搜索其所有内容,这是对资源的浪费。使用预配置的页面可以帮助您更快地运行博客。


我已经考虑过使用它。但是我发现有两个缺点,那就是必须创建和维护两个404模板(页面和实际)。客户端必须创建一个404页面。我想保持网址不变。例如,如果我转到example.com/restricted,则不会将我重定向到... / 404 /
Evan Yeung

实际上我只是意识到404.php是模板。我的错。
Evan Yeung,

不,如果您希望获得任何页面排名,那将是一个非常糟糕的主意。搜索引擎只会将返回404或任何4xx范围标头的页面视为查看器错误,并且会愉快地为返回200页面的所有内容编制索引。如果您进行重定向,则会告诉爬网程序未找到的页面是有效页面,它将严重破坏您的页面排名。当您获得404页面时,您真正需要做的就是do http_response_code(404); exit();。如果需要页面,请get_template_part( 404 );在退出前使用。这也比任何wordpress功能要快得多。
mopsyd

0

您可以将此代码写到实际使用的主题目录(wp-content / themes /..../ 404.php)中的文件404.php中:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".get_bloginfo('url'));
exit();
?>

此代码必须从文件开头开始(之前没有任何字符)

链接到原始内容:如何将404页面重定向到WordPress中的主页


OP实际上正在为不符合特定条件的用户寻找一种显示404的方式,例如“如果用户A不具有'can_edit'功能,则显示404页面。”
phatskat

不要重定向404。Location: xxx设置301标头,该标头告诉抓取工具实际上存在有效资源,并在确定没有可用资源时终止您的排名。
mopsyd

0

我有一个类似的要求,即我不应该让用户根据用户所处的角色来访问author.php页面。我注册了template_redirect操作以进行检查并甚至在加载实际页面之前也重定向到404页面。

注册:

add_action( 'template_redirect', [ $this, 'handle_inactive_users']);

处理程序:

public function handle_inactive_users() {
    global $wp_query;
    if ( $wp_query->is_author() ) {
        $user = $wp_query->get_queried_object();
        if ( is_a( $user, \WP_User::class ) && $user->has_cap( 'inactive' ) ) {
            $wp_query->set_404();
            status_header( 404 );
            get_template_part( 404 );
            exit();
        }
    }
}

如果您选择仅在模板部分的中间使用以下代码段,则该页面可能已经部分呈现,并且您实际上并未重定向到404页面。所以最好在template_redirect行动中做到这一点-

$wp_query->set_404();
status_header( 404 );
get_template_part( 404 );
exit();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.