问题描述
当遇到 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。