跳至正文

在 WordPress 中重写 URL:提示和插件

在 WordPress 中重写 URL:提示和插件

WordPress 的最新更新允许开发人员非常快速地定制他们的个人网站。更新主题区域、替换侧边栏中的小部件,甚至编写您自己的自定义 PHP 代码函数都非常简单。范围很广——一个受欢迎的领域是重写漂亮的 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记住这个变量很重要,因为您可能需要在开发过程中多次引用数据。

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 重写工作。

猴子重写分析器

当第一次进入重写规则时,这个插件是必备的。它实际上并没有改变您网站的任何规则——它只是允许您测试代码并查看哪些重定向到哪些页面。它甚至可以用于测试任何自定义帖子类型的自定义查询变量。

ReWrite 分析器 by monkey man

AskApache RewriteRules 查看器

这类似于上面的插件,只是它不允许您测试自己的规则。相反,此插件将显示您网站的所有默认 WP 规则以及它们重定向到的位置。这将包括所有主要属性,$wp_rewrite例如永久链接设置和页面/类别/标签基础。

AskApache ReWrite 规则查看器 WordPress 插件

WP htaccess 控制

在这里,您有一组不同的规则来进行新的页面重定向。该插件有自己的管理面板,您可以在其中编辑作者库、页面库等变量,甚至可以附加您自己的自定义 .htaccess 规则。

与使用 wp_rewrite 构建您自己的方法相比,此方法不同。然而,对于真正了解 Web 服务器并且更愿意直接写入 .htaccess 的技术人员来说,这可能更容易。

用于 WP 管理的 WordPress .htaccess 控制访问插件

重写规则测试器

这实际上不是 WordPress 插件,但绝对是一种方便的存档工具。您可以复制重写规则并为您的网站测试它们,而无需编辑您的 .htaccess 文件。这是在 Web 上实时发布之前从语法中删除错误的完美方法。

用于测试 htaccess 重写规则的在线 Web 工具

DW重写

DW Rewrite 是一个非常简单的插件,它在安装后立即创建 3 个独特的漂亮 URL。默认情况下,它会将管理、登录和注册链接分别更改为/admin/login/register

如果您需要快速修复具有多个作者的博客,这可能会很棒。它将专门隐藏令人尴尬的 WordPress 注册链接 ( /wp-login.php?action=register)。

结论

我希望本教程可以提供一些示例,让您思考 WordPress 重写。CMS 非常流行,开发人员每天都在开发新功能。自定义您自己的 URL 是一项非常庞大的基于用户的功能。与默认选项相比,它为您的网站提供了自己独特的形象和品牌。

如果您在重写规则方面遇到麻烦,那么消除损坏应该永远不会很困难。通过简单地删除功能代码并刷新您的 .htaccess 规则,它看起来没有任何改变。请务必查看您可以在该主题上找到的其他一些类似文章。如果您有任何问题或意见,可以在帖子讨论区与我们分享。

标签: