我认为你对钩子如何工作的概念有点不正确。如果输出的内容包含所查询对象的URL和标题,则通常不需要担心这一点。
您需要考虑两种类型的过滤器:使用pre_get_posts
, 和筛选标题。
假使pre_get_posts
, 这不会修改查询的对象。此挂钩用于修改基于查询对象执行的查询。查询的对象本身不会更改。例如,如果用户访问类别“Foo”的URL,但插件使用pre_get_posts
要更改查询以使该类别返回属于“Bar”类别的帖子,查询的对象仍然是“Foo”,以及页面的其他元素,例如页面的<title>
标记仍将使用“Foo”。在这种情况下,您仍然希望“Foo”的详细信息与title标记匹配,因此您将使用查询的对象。
所以你不必担心pre_get_posts
. 其他可能影响查询对象的过滤器如何?需要了解的重要一点是,这些过滤器不会修改查询对象的状态。
例如,假设查询的对象是WP_Post
对象,标题为“Foo”。即使运行的插件使用the_title
过滤器将所有帖子标题修改为“Bar”,然后post_title
的属性WP_Post
仍将是“Foo”。这是因为这些过滤器不会修改对象的状态。相反,这些过滤器的工作方式是将其应用于输出。如果是帖子标题,则通过get_the_title()
函数,该函数运行post_title
每次使用时,通过任何已注册的筛选器。
因此,如果您想获取页面查询对象的标题,并尊重其他插件添加的任何过滤器,这将是不正确的:
$title = get_queried_object()->post_title;
而是使用正确的函数,该函数将对您的值应用第三方过滤器:
$title = get_the_title( get_queried_object() );
或者自己手动应用过滤器:
$title = apply_filters( get_queried_object()->post_title, get_queried_object_id() );
因此,基本上这可以归结为:不要担心被查询对象的“状态”,也不要担心最新的钩子会做什么。相反,只需确保您使用了正确的函数和API来获取所需的数据,您的插件也将反映其他插件所做的任何更改。