如何在wordpress上进行路由?


13

核心wp路由如何工作?我很难理解...在MVC中,您的网址看起来像映射到MyController-> myaction()的mycontroller / myaction

在drupal中,它是index.php?q = mycustomerpath / hello,可以将其映射到您喜欢的任何函数,该函数会将“主题化”的内容返回到主题布局中。

但是在wp中,我不知道事情是如何完成的……它是?p = 1然后是?product = 1 ...我已经搜索了路由流程的文档,但是找不到任何内容(谷歌只是返回自定义的文章路由)..我想首先了解核心路由的基础。


挖掘代码,我看到它调用query_posts的每个请求吗?为什么到底需要每次查询帖子?在某些情况下,您实际上并不想显示帖子吗?
yeahman 2014年

1
内容另存为WP中的帖子。因此,当您需要显示内容时,您需要对其进行查询
Sisir 2014年

我可以建议您阅读一下“循环”这一概念,以便了解WordPress的工作原理。基本的“循环”显示了一组数组,这些数组是query_posts的结果。对于非管理员URL请求,WP设计为仅显示帖子,并且需要自定义编程才能显示帖子以外的内容。管理员URL请求是不同的,这些请求不使用“循环”,并且显示不发布的内容。

好的,但是这种方法有点怪异而且不是很灵活tbh
yeahman 2014年

说我想显示联系表格..我需要将我的html放在页面内容类型中吗?我仍在尝试查找将表单提交的逻辑放在哪里...(在主题page.php中?非常丑陋的方法)
yeahman 2014年

Answers:


20

在WordPress中,URL不会映射到路由。它们映射到数据库查询。

在“默认”永久链接模式下使用WordPress时,主URL查询中有一组变量,例如?p = 1或?page = 234等。还有?s = search和许多其他搜索。

如果使用“漂亮”永久链接,则会创建一大套称为“重写规则”的规则,这些规则将各种URL模式直接映射到同一组URL参数上。因此,类似/ 2014/04/12 / example的URL会映射到?year = 2014&month = 04&day = 12&postname = example或类似名称。因此,在完成此映射之后,以下内容同样适用于这些对象。

这些变量实际上控制着WP_Query类的主要实例。WP_Query类保存构建数据库查询以从数据库获取“帖子”的所有信息。传递给它的各种参数控制着它建立什么样的查询以及它得到什么数据。

看,WordPress可以显示的所有内容本质上都是“帖子”。博客是一系列按时间倒序排列的帖子。“页面”是具有定义名称的静态帖子。“自定义帖子类型”的确切含义就是带有您定义的自定义类型的“帖子”。在WordPress中显示所有内容的所有主要查询都从wp_posts表中获取了部分帖子。

WP_Query是做什么的。URL的参数直接发送到该主查询中并在其中使用。

然后,主题根据查询返回的内容确定要使用的模板。如果您请求/ category / example,那么它将变成?category_name = example,这意味着主$ wp_query-> query_vars数组将获取该信息,而WP_Query将提取出“ example”类别的最后X个帖子,并且将其is_category标志设置为true。

模板加载器将在此之后运行,看到is_category()返回true,并决定选择类别模板,因此根据模板,它将查找category-example.php并返回category.php等。层次结构。

因此,是否要更改URL的工作方式的问题很简单:是否要更改URL或映射到URL?由于URL未映射到函数,因此将它们映射到控制查询的参数。如果要让URL调整该主查询,则与希望特殊URL运行完全其他特殊代码的过程稍有不同。

并在评论中回答您的特定问题:“在某些情况下您实际上并不想显示帖子吗?” 不,那里没有。一切都是职位。所有内容都存储在帖子中。如果您想将内容存储在其他地方并且与众不同,则可以执行此操作,但是这样做比较困难,因为老实说,通常不需要这样做。如果您有特殊的内容,请创建自定义帖子类型,将内容存储为具有该类型的帖子,然后将URL模式映射到该帖子。简单。


我知道所有内容都应在帖子中表示(通过自定义帖子类型等。)与drupal 6中的自定义类型非常相似...但是,使用单个帖子表来存储网站的每个内容,是否会影响性能?drupal 7通过引入实体类型解决了它,因此您不必创建自定义类型并将所有内容存储在节点表中,而是存储在您自己的实体表中,该表仍然可以从drupal框架中利用。我希望wordpress将来引入这种方法。thx详细解释。
yeahman 2014年

我想如果我想将URL映射到我自己的功能/主题,wp路由器会有所帮助吗?
yeahman 2014年

通常不需要添加完整的路由系统。有更简单的方法。WordPress的基础是显示用户生成的内容,这些内容都存储在posts表中。如果要显示不是用户生成的内容,则通常在主题或插件中进行。生成页面时,有成百上千个动作挂钩和过滤器以及其他方式可以使代码覆盖过程的各个部分。借助短代码之类的东西,将自定义html插入内容相对容易。
奥托

如何将自定义html / php添加到我创建的帖子类型中?无需修改主题的single.php或创建single-mycustompost.php(不是一种非常便携的方法)
yeahman 2014年

7
在使用wordpress一年多之后,现在...我仍然不相信它...该框架并不优雅也不十分丑陋...它的作用就像一个简单的博客,但是如果您要开发其他类型的网站。 ……是一种用词欺骗WordPress来完成本不该做的事情。
yeahman 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.