WordPress URL重写技巧与插件教程
WordPress的最新更新为开发者提供了前所未有的便捷,让他们能够迅速定制个人网站。无论是更新主题区域、替换侧边栏小部件,还是编写自定义PHP代码,都变得异常简单。WordPress重写系统的广度令人惊叹,其中最受欢迎的领域之一就是改写漂亮的URL固定链接。通过多种方法,你可以轻松更新默认的WordPress重写系统。本教程将分享几个实用案例,并展示这一过程的简单性。虽然需要对PHP有一定了解才能理解代码逻辑,但复制粘贴到模板中却极其简单,几乎无需额外工作。
了解WP_Rewrite
如果你对Apache服务器上的mod_rewrite有一定了解,那么你会发现WordPress的重写语法非常相似。它们的系统仍然基于.htaccess文件,但所有规则都是用PHP编码的。这种设计实际上简化了过程,因为我们能够对自定义URL拥有更多控制权。我强烈建议你浏览$wp_rewrite类的官方文档,那里包含了大量关于这个主题的信息,甚至还有一些参考示例,能帮助你更好地理解。
大部分代码可以直接写在你的主题的functions.php文件中。让我们先来看看WordPress已经包含的默认重写内容。
wp_rewrite->rules
通过将wp_rewrite类声明为全局变量,我们可以访问所有的内部数据。当你添加自己的规则时,这些规则会被添加到一个名为wp_rewrite->rules的数组中。记住这个变量非常重要,因为在开发过程中,你可能需要多次引用这些数据。
我在我的主题的page.php文件中加入了以下代码块。它将输出一个庞大的数据数组,看起来可能有些混乱。但如果你在你的页面上查看页面源代码,实际上很容易看到哪些重写规则与哪个文件名相匹配。例如,让我们看一下类别重写的规则:
[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的默认设置外,我们还可以建立自己的规则。
重建Author Base
当你进入固定链接设置页面时,你可以选择重设类别和标签基础。但奇怪的是,重置Author Base的选项却没有。但我们可以使用WordPress代码中的add_rewrite_rule()函数来整合新的设置。在这种情况下,我把/author/替换成了/writer/,但你可以使用任何你喜欢的基数。此外,我还复制了一些其他的重定向,用于作者页和RSS订阅。你可以把以下代码添加到你的主题的functions.php文件中。
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后,在钩子上添加这些规则(见下文)。
Author Base使用generate_rewrite_rules
为这个方法写作,我们将再次需要全局的wp_rewrite类。然后我设置了一个名为$new_rules的新变量,其中包含一个关联数组的数据。我下面的例子代码只是为基本的作者页部分进行重写。
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主题文件中的更新代码。
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重写规则,这样你的新代码才会被加入。然而,在每一个页面启动时都这样做是非常浪费的,因为它会写入数据库并硬刷新.htaccess文件。一个更好的方法是在管理面板中访问你的permalinks页面并重新保存更改。这总是调用flush_rewrite_rules,所以你永远不必担心用户在前台遇到加载问题。而且只需要一次就可以重新保存页面并更新你系统中的所有规则。但如果这不起作用,你可以尝试调用$wp_rewrite->flush_rules()。
使用非WP规则
在wp_rewrite类中,我们可以访问几十个属性。其中一个比较重要的选项是wp_rewrite->non_wp_rules,它收集了一个不影响index.php文件的重定向数组。这实际上是在WordPress插件开发中最常使用的。你可以将一个特定的自定义URL类型(如 /calendar/jun-2012/ )推送到你的网站后台( /wp-content/plugins/calendarplug/myscript.php )。当然,除了插件之外,这种自定义重写规则的关联数组还有更多的用途。我在下文中提供了一个很好的例子。
屏蔽你的主题文件
这是我在WordPress讨论区经常看到的一个常见建议。理想情况下,我们想用一个更优雅的URL来引用 /wp-content/themes/mytheme/ 文件夹中的一些文件。注意,这将需要一组不同的WordPress重写来改变目录结构。WordPress的内部重写系统总是将内容推向一个单一的路由文件。在默认情况下,我们使用index.php以及任何额外的查询字符串数据。但对于隐藏我们的标准模板目录( /wp-content/themes/mytheme/* ),我们将需要显示许多不同的文件。
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类的另一个神秘的属性,名为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重写工作,这很好。
Monkeyman Rewrite Analyzer
当第一次接触到重写规则时,这个插件是必须的。它实际上不会改变你网站的任何规则——它只是允许你测试代码,看看哪些重定向到哪些页面。它甚至可以用于测试任何自定义帖子类型的自定义查询变量。
AskApache RewriteRules Viewer
这与上面的插件类似,只是它不能让你测试你自己的规则。相反,这个插件将显示你的网站的所有默认WP规则和它们重定向到哪里。这将包括wp_rewrite的所有主要属性,如你的固定链接设置和页面/类别/标签基础。
WP htaccess Control
在这里,你有一套不同的规则来制作新的页面重定向。该插件有自己的管理面板,你可以编辑变量,如你的作者基地,页面基地,甚至附加你自己的自定义.htaccess规则。这种方法与使用wp_rewrite建立自己的方法不同。然而,对于真正了解网络服务器的技术人员来说,这可能更容易,他们觉得直接写进.htaccess更舒服。
Rewrite Rule Tester
这实际上不是一个WordPress插件,但绝对是一个方便的工具,可以保存在文件中。你可以复制重写规则,为你的网站进行测试,而不必编辑你的.htaccess文件。这是一个完美的方法,可以在网络上发布之前消除你的语法中的错误。
DW ReWrite
DW Rewrite是一个非常简单的插件,安装后立即创建3个独特的漂亮URL。默认情况下,它将把管理员、登录和注册链接分别改为 /admin 、 /login 和 /register 。如果你需要快速解决一个具有多个作者的博客,这可能是很好的。它将特别隐藏令人尴尬的复杂的WordPress注册链接( /wp-login.php?action=register )。
小结
我希望这个教程能够提供一些例子,让你思考WordPress的改写。这个CMS非常流行,而且开发人员每天仍在生产新的功能。定制你自己的URL是如此巨大的一块基于用户的功能。与默认选项相比,它使你的网站有自己独特的存在和品牌。如果你在重写规则方面遇到麻烦,那么要消除损害应该是不难的。通过简单地删除功能代码和刷新你的.htaccess规则,看起来就像什么都没有改变。请务必查看一些其他类似的文章,你可以在这个主题上找到。如果你有任何问题或意见,可以在帖子讨论区与我们分享。