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

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


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

评论

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

你是对的。客户端给我的印象是,他甚至不希望任何无法访问的人知道该页面的存在,抛出401表示该页面存在但被禁止。但是,改为抛出401会很容易。

#1 楼

通过在标题中使用以下代码,我能够显示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);功能要快得多)。如果您关注网页排名,还应该在robots.txt中放置一个Disallow规则,以表明它不是公共资源。

– mopsyd
18 Mar 15 '18 2:12



#2 楼

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

打开404.php文件并将这些行添加到文件顶部:

/**
 * Template Name: 404 Page
 */


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

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


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

评论


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

–杨E
2011年8月4日在7:02

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

–杨E
2011年8月4日在7:24

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

– mopsyd
18-3-15在2:05



#3 楼

我有一个类似的要求,即不允许用户根据用户所处的角色来访问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();


#4 楼

您可以将此代码写入实际使用的主题目录(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
17年5月5日在15:18

不要重定向404。位置:xxx设置了301标头,该标头告诉爬虫实际上存在有效资源,并在爬虫确定不存在有效资源时终止您的排名。

– mopsyd
18 Mar 15 '18 2:10