在什么钩子上可以获得被查询对象的最终状态?

时间:2020-01-23 作者:Daniel M

我的目标是创建一个迷你插件,允许我创建社交共享链接,因此,我非常非常有兴趣获取查询对象链接/标题的最新版本。

我通过暴力强迫发现WP_Post-like(或查询的对象、页面等)对我们可用parse_query, 问题是,这让我思考。许多流行的插件/主题仍在筛选标题等,如pre_get_posts 等等

我什么时候才能挂接,以便在仍然允许其他人与我的API交互的情况下获得帖子的最终版本?

我突然想到loop_end 在了解了内核的运行方式后,我会立即启动它,但如果我这么晚才启动我的功能,其他人将无法更早地使用它。我觉得我的架构设计错了。

1 个回复
SO网友:Jacob Peattie

我认为你对钩子如何工作的概念有点不正确。如果输出的内容包含所查询对象的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来获取所需的数据,您的插件也将反映其他插件所做的任何更改。

相关推荐

GET_POSTS查询结果无序,但在php代码段插件中显示正确

我有一个为自定义站点制作的小插件,其中一个新词将通过wp cron挑选。应在get\\u posts中选择并返回最旧(最低ID#)的自定义帖子类型。但是,它总是返回并选择该自定义类型的最新(最大的帖子ID)。奇怪的是,如果我在XYZ PHP代码(允许您在仪表板中使用PHP生成短代码的插件)中尝试相同的查询,就会返回正确的结果。以下是我在众多问题中尝试过的问题。我还尝试了“ID”、“date”、“date”以及“asc”的所有顺序,但都不起作用。在通过wp Crontrol尝试插件的新版本时,我还手动删除了