在 WordPress 中重写 URL:提示和插件
WordPress 的最新更新允许开发人员非常快速地定制他们的个人网站。更新主题区域、替换侧边栏中的小部件,甚至编写您自己的自定义 PHP 代码函数都非常简单。范围很广——一个受欢迎的领域是重写漂亮的 URL 永久链接。
您可以使用几种方法来更新默认的 WordPress 重写系统。在本教程中,我将分享一些示例并演示该过程有多么简单。您需要对 PHP 有所了解才能理解代码中发生的事情,但是复制并粘贴到您自己的模板中非常容易,几乎不需要任何工作。
推荐阅读: 29 个 WordPress 调整以改进帖子和页面
了解 WP_Rewrite
如果您完全熟悉 Apache 服务器上的 mod_rewrite,那么您将了解 WordPress 重写语法。他们的系统仍然建立在.htaccess文件之上,但所有规则都是用 PHP 编码的。这实际上使过程更容易一些,因为我们可以更好地控制编写我们自己的 URL。
我建议浏览$wp_rewrite 类页面,因为它有大量关于该主题的信息。我们甚至可以参考一些小例子,让一切更容易理解。大多数代码可以直接写入主题的functions.php文件中。让我们首先看看 WordPress 中已经包含的默认重写。
$wp_rewrite->rules 的内容
通过将$wp_rewrite
类声明为全局类,我们可以访问所有内部数据。当您附加自己的规则时,这些规则将添加到名称为 的数组中$wp_rewrite->rules
。记住这个变量很重要,因为您可能需要在开发过程中多次引用数据。
1个
2个
3个
4个
5个
6个
|
< div >< code > <? php global $wp_rewrite; print_r($wp_rewrite->rules); ?> </ code ></ div > |
我将这段代码添加到主题的page.php文件中。它将输出大量数据,看起来一团糟。但是,如果您在页面上查看源代码,实际上很容易看出哪些重写规则与哪个文件名相匹配。例如,让我们看一下类别重写的规则:
1个
|
[category/(.+?)/?$] => index.php?category_name= $matches [1] |
括号中左侧的位是我们要查找的 Apache RewriteRule。以/category/部分开头,后跟任何字符串。如果匹配,则服务器知道index.php?category_name=
在最后替换变量时进行引用。
设置自定义永久链接
仅在 $wp_rewrite 类中就有太多内容需要讨论。可以引用许多其他属性,例如$wp_rewrite->category_base
或$wp_rewrite->author_base
用于提取这些页面的默认 URL 结构。但除了提取 WP 的默认设置外,我们还可以构建自己的规则。
重建作者库
当您进入永久链接设置页面时,您可以选择重置类别和标签库。但是,奇怪的是缺少重置作者库的选项。
但是我们可以使用the add_rewrite_rule()
WordPress 的 codex 来集成一些新的设置。在本例中,我将/author/替换为/writer/,但您可以使用任何您喜欢的基础。此外,我还复制了一些作者页面和 RSS 提要的其他重定向。您可以将此代码块添加到主题的 functions.php 文件中。
1个
2个
3个
4个
5个
6个
7
8个
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
add_action( 'init' , 'add_author_rules' ); function add_author_rules() { add_rewrite_rule( "writer/([^/]+)/?" , "index.php?author_name=$matches[1]" , "top" ); add_rewrite_rule( "writer/([^/]+)/page/?([0-9]{1,})/?" , "index.php?author_name=$matches[1]&paged=$matches[2]" , "top" ); add_rewrite_rule( "writer/([^/]+)/(feed|rdf|rss|rss2|atom)/?" , "index.php?author_name=$matches[1]&feed=$matches[2]" , "top" ); add_rewrite_rule( "writer/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?" , "index.php?author_name=$matches[1]&feed=$matches[2]" , "top" ); } |
即使不使用 $wp_rewrite 变量也可以访问此函数。一些开发人员喜欢这种方法,因为它比使用类属性进行硬编码更简单。然而,我也注意到这种方法对于某些 WordPress 安装并不总是可靠。实际上还有第二个选项可以在刷新 .htaccess 后在挂钩上添加这些规则(见下文)。
使用 generate_rewrite_rules 的作者库
为这个方法编写我们将再次需要全局 $wp_rewrite 类。然后我设置了一个名为的新变量$new_rules
,其中包含一个关联数据数组。我下面的示例代码只是重写了基本的作者页面部分。
1个
2个
3个
4个
5个
6个
7
|
function generate_author_rewrite_rules() { global $wp_rewrite ; $new_rules = array ( "writer/([^/]+)/?" => "index.php?author_name=" . $wp_rewrite ->preg_index(1) ); $wp_rewrite ->rules = $new_rules + $wp_rewrite ->rules; } |
但是如果我们想要包含多个页面和 RSS 提要,我们可以加强数组。您可以选择创建一个 PHP 函数来推送可能有点过于复杂的关联数组数据。我们还可以通过逗号分隔数据块,在数组中表现为单独的实体。再次查看我在 functions.php 主题文件中编写的更新代码。
1个
2个
3个
4个
5个
6个
7
8个
9
10
|
function generate_author_rewrite_rules() { global $wp_rewrite ; $new_rules = array ( "writer/([^/]+)/?" => "index.php?author_name=" . $wp_rewrite ->preg_index(1), "writer/([^/]+)/page/?([0-9]{1,})/?" => "index.php?author_name=" . $wp_rewrite ->preg_index(1). "&paged=" . $wp_rewrite ->preg_index(2), "writer/([^/]+)/(feed|rdf|rss|rss2|atom)/?" => "index.php?author_name=" . $wp_rewrite ->preg_index(1). "&feed=" . $wp_rewrite ->preg_index(2), "writer/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?" => "index.php?author_name=" . $wp_rewrite ->preg_index(1). "&feed=" . $wp_rewrite ->preg_index(2) ); $wp_rewrite ->rules = $new_rules + $wp_rewrite ->rules; } |
请记住,在您刷新原始重写规则之前,这些方法都不会起作用。每当您更改这些功能时,您都必须这样做,但之后您的新规则将无限期地坚持下去。
刷新重写规则
每当您对 URL 重写代码进行更新时,这些更改不会立即应用。您必须刷新 .htaccess 重写规则,以便添加新代码。然而,在每个页面 init 上执行此操作非常浪费,因为它会写入数据库并硬刷新 .htaccess 文件。
更好的方法是访问管理面板中的永久链接页面并重新保存更改。这总是调用flush_rewrite_rules所以你永远不必担心前端的用户遇到加载问题。重新保存页面和更新系统中的所有规则只需要一次时间。但如果这不起作用,您可以尝试致电$wp_rewrite->flush_rules();
使用非 WP 规则
在$wp_rewrite
类内部,我们可以访问许多属性。一个更重要的选项是$wp_rewrite->non_wp_rules
收集一组不命中 index.php 文件的重定向。
这实际上在 WordPress 插件开发中最常使用。您可以将特定的自定义 URL 类型(例如/calendar/june-2012/
)推送到您网站的后端 ( /wp-content/plugins/calendarplug/myscript.php
)。但是,除了插件之外,自定义重写规则的关联数组当然还有其他用途。我在下面的上下文中提供了一个很好的例子。
屏蔽你的主题文件
这是我在 WordPress 讨论板上经常看到的一个常见建议。理想情况下,我们希望/wp-content/themes/mytheme/
使用更优雅的 URL 引用文件夹内的一些文件。请注意,这将需要一组不同的 WordPress 重写来更改目录结构。
WordPress 的内部重写系统总是将内容推送到单个路由文件。在默认情况下,我们使用 index.php 以及任何额外的查询字符串数据。但是为了隐藏我们的标准模板目录(/wp-content/themes/mytheme/*
),我们需要显示许多不同的文件。
1个
2个
3个
4个
5个
6个
7
8个
9
10
11
12
13
|
add_action( 'generate_rewrite_rules' , 'themes_dir_add_rewrites' ); function themes_dir_add_rewrites() { $theme_name = next( explode ( '/themes/' , get_stylesheet_directory())); global $wp_rewrite ; $new_non_wp_rules = array ( 'css/(.*)' => 'wp-content/themes/' . $theme_name . '/css/$1' , 'js/(.*)' => 'wp-content/themes/' . $theme_name . '/js/$1' , 'images/wordpress-urls-rewrite/(.*)' => 'wp-content/themes/' . $theme_name . '/images/wordpress-urls-rewrite/$1' , ); $wp_rewrite ->non_wp_rules += $new_non_wp_rules ; } |
我编写了一个新函数themes_dir_add_rewrites()
来从这些较长的 URL 中提取所有主要内容并在后端重定向它们。请注意,我们正在使用 $wp_rewrite 类的另一个神秘属性 named non_wp_rules
。根据文档,这些规则不指向 WP 的 index.php 文件,将在服务器端处理。
这些非 WP 规则的优点在于您仍然可以非常轻松地管理旧的 URL 方法。没有什么可以阻止您链接到:
/wp-content/themes/mytheme/images/wordpress-urls-rewrite/logo.jpg
.
但如果你能参考一下,它看起来会好很多:
/images/wordpress-urls-rewrite/logo.jpg
反而。
有用的工具和插件
如果您坚持编写自己的漂亮 URL,那么您可以使用一些工具。这个过程很难掌握,所以如果你挣扎了几周也不要气馁。我觉得随着你花更多的时间练习,内容会变得更容易。
但要开始使用,请查看其中一些方便的重写工具和插件。您可能不需要所有这些,但很高兴找到如此庞大的开发人员群体围绕 WP 重写工作。
猴子重写分析器
当第一次进入重写规则时,这个插件是必备的。它实际上并没有改变您网站的任何规则——它只是允许您测试代码并查看哪些重定向到哪些页面。它甚至可以用于测试任何自定义帖子类型的自定义查询变量。
AskApache RewriteRules 查看器
这类似于上面的插件,只是它不允许您测试自己的规则。相反,此插件将显示您网站的所有默认 WP 规则以及它们重定向到的位置。这将包括所有主要属性,$wp_rewrite
例如永久链接设置和页面/类别/标签基础。
WP htaccess 控制
在这里,您有一组不同的规则来进行新的页面重定向。该插件有自己的管理面板,您可以在其中编辑作者库、页面库等变量,甚至可以附加您自己的自定义 .htaccess 规则。
与使用 wp_rewrite 构建您自己的方法相比,此方法不同。然而,对于真正了解 Web 服务器并且更愿意直接写入 .htaccess 的技术人员来说,这可能更容易。
重写规则测试器
这实际上不是 WordPress 插件,但绝对是一种方便的存档工具。您可以复制重写规则并为您的网站测试它们,而无需编辑您的 .htaccess 文件。这是在 Web 上实时发布之前从语法中删除错误的完美方法。
DW重写
DW Rewrite 是一个非常简单的插件,它在安装后立即创建 3 个独特的漂亮 URL。默认情况下,它会将管理、登录和注册链接分别更改为/admin
、/login
和/register
。
如果您需要快速修复具有多个作者的博客,这可能会很棒。它将专门隐藏令人尴尬的 WordPress 注册链接 ( /wp-login.php?action=register
)。
结论
我希望本教程可以提供一些示例,让您思考 WordPress 重写。CMS 非常流行,开发人员每天都在开发新功能。自定义您自己的 URL 是一项非常庞大的基于用户的功能。与默认选项相比,它为您的网站提供了自己独特的形象和品牌。
如果您在重写规则方面遇到麻烦,那么消除损坏应该永远不会很困难。通过简单地删除功能代码并刷新您的 .htaccess 规则,它看起来没有任何改变。请务必查看您可以在该主题上找到的其他一些类似文章。如果您有任何问题或意见,可以在帖子讨论区与我们分享。