问题描述

当遇到 404 错误时,可以使用 404.php 模板文件来呈现自定义错误消息。这在 Template Hierarchy 文章中有记录。

我的目标是为 401,403 和 500 错误创建自定义错误页面。我已经尝试在我的主题的目录中创建 401.php,403.php 和 500.php 文件,但这不起作用。

如何在 WordPress 中创建自定义 401,403 和 500 错误页面?

最佳解决方案

错误页面通过.HTACCESS 提供,如果您使用 Apache,您将使用 ErrorDocument 指令,并向其添加状态和 URL 。

所以在.htaccess 文件中看起来像这样:

ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500

您可以使用下面的功能。这将为您自动添加所需的 HTACCESS 文件,也可以手动添加。

1. 添加页面:

然后,您需要进入您的仪表板,并像任何正常页面 (‘Dashboard’> ‘Pages’> ‘New’) 创建页面。他们可以标题你想要什么,只要确保 slug 与下面的功能相同 (Slug:error-401,error-403,error-404,error-500) 。此外,您可以使用页面模板来创建这些特定页面所需的任何布局和样式。按照 WordPress Codex 说明进行操作。

2. 添加功能:

// Create Custom Error Pages in WordPress using HTACCESS
function royal_custom_error_pages() {

    // Get HTACCESS path & dynamic website url
    $htaccess_file = '.htaccess';
    $website_url = get_bloginfo('url').'/';

    // Check & prevent writing error pages more than once
    $check_file = file_get_contents($htaccess_file);
    $this_string = '# BEGIN WordPress Error Pages';

    if( strpos( $check_file, $this_string ) === false) {

    // Setup Error page locations dynamically
    $error_pages .= PHP_EOL. PHP_EOL . '# BEGIN WordPress Error Pages'. PHP_EOL. PHP_EOL;
    $error_pages .= 'ErrorDocument 401 '.$website_url.'error-401'.PHP_EOL;
    $error_pages .= 'ErrorDocument 403 '.$website_url.'error-403'.PHP_EOL;
    $error_pages .= 'ErrorDocument 404 '.$website_url.'error-404'.PHP_EOL;
    $error_pages .= 'ErrorDocument 500 '.$website_url.'error-500'.PHP_EOL;
    $error_pages .= PHP_EOL. '# END WordPress Error Pages'. PHP_EOL;

    // Write the error page locations to HTACCESS
    $htaccess = fopen( $htaccess_file, 'a+');
    fwrite( $htaccess, $error_pages );
    fclose($htaccess);

    }
}

add_action('init','royal_custom_error_pages'); // This will run the function everytime, not ideal!

// register_activation_hook( __FILE__, 'royal_custom_error_pages' ); // Using a plugin, runs only once!

NB!上述功能注释

移动网站或更改网址结构时

使用上述功能记住的事情是尽管在将它们写入 HTACCESS 文件之前,会检查 ErrorDocument 指令是否存在,但是如果您更改或移动博客以反映更新的页面位置,那么它将不会重写 ErrorDocument 指令。您将需要先删除 HTACCESS 文件中现有的 ErrorDocument 指令,然后重新运行此函数以创建新的指令。

正确的钩子只有一次才能开启功能

另外需要注意的是这个功能,使用 init 操作会在每次你的页面加载时运行,这是非常不必要和浪费的,所以我建议将其添加到插件中,并使用 register_activation_hook,因此它只会在插件激活时触发一次

文件权限

此外,当使用上述功能时,您的.htaccess 是可写的,因此请确保它具有正确的文件权限,如 CHMOD777 。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。