post 编辑器中 URL 弹出窗口的特定过滤器
Specific filter for URL popover in post editor
我使用 WP 5.3 和默认 (Gutenberg) 编辑器以及 Polylang 2.7.2 插件来制作网站多语言。使用 Polylang,每个 post 由每种语言的一个翻译 post 组成(Polylang 将翻译 post 组合在一起)。
现在我遇到以下问题:当用户正在编写 post 并尝试 link 到另一个已经存在的 post 时,[=43= 的搜索下拉列表]ing 文本 (Ctrl+K) 以 所有 种可用语言显示 posts。如果 post 标题不是 language-specific(例如,“智能家居”),但“智能家居”post 存在两种语言,则用户需要反复试验 select匹配当前编辑的语言post:
我希望这个 URL 弹出窗口下拉列表只列出与当前 post 语言相同的 post,或者修改下拉列表中的结果以显示特定语言(通过标志,或标题前的“[en]”)。
首先,我尝试使用管理菜单栏的“按语言过滤内容”下拉菜单将其限制为英语 posts - 根本没有影响下拉菜单。
接下来,我尝试使用过滤器来篡改此下拉列表的查询结果。使用 pre_get_posts
并将语言 hard-coded 设置为英语有效:
add_filter('pre_get_posts', [self::class, 'filterQueryLanguage']);
}
public static function filterQueryLanguage($query) {
$query->set('lang', 'en'); // this limits the drop down results to English posts
return $query;
}
搜索下拉菜单只列出英文 posts。不幸的是,这限制了 all 查询,并且在过滤器函数中不可能确定此查询是否源自此弹出框下拉列表的 AJAX 请求。此外,我没有未能检测到当前编辑的语言 post(pll_current_language()
在这种情况下返回 false)。
因此,我需要一种方法来 post-filter 仅针对此弹出窗口下拉列表的结果,并以某种方式将语言添加到 post 名称之前。但我不知道是否有过滤器。 get_posts
似乎没有触发,即使触发了,我也不想影响所有查询。
是否有更具体的过滤器可用于此目的?
好的,我自己找到了解决办法。问题是:此 URL 弹出窗口对 search=phrase
执行 REST API 查询。此搜索查询还有一个 lang=
参数,该参数已设置为适当的 post 语言 - 但是,在组装 REST 响应时,此 lang
参数将被忽略。
我 post- 像这样过滤 REST 结果:
add_filter('rest_pre_echo_response', [self::class, 'filterRESTResponse'], 10, 3);
}
public static function filterRESTResponse($result, $server, $request) {
$params = $request->get_params();
if (!empty($params['search']) && !empty($params['lang'])) {
$filtered = [];
$lang = $params['lang'];
foreach ($result as $post) {
$post_lang = pll_get_post_language($post['id']);
if ($post_lang === $lang) {
$filtered []= $post;
}
}
$result = $filtered;
}
return $result;
}
这个解决方案有点笨拙,因为它可能让 REST 查询从一开始就尊重语言。不知道如何连接到那个,寿。
好吧,随便吧。
我使用 WP 5.3 和默认 (Gutenberg) 编辑器以及 Polylang 2.7.2 插件来制作网站多语言。使用 Polylang,每个 post 由每种语言的一个翻译 post 组成(Polylang 将翻译 post 组合在一起)。
现在我遇到以下问题:当用户正在编写 post 并尝试 link 到另一个已经存在的 post 时,[=43= 的搜索下拉列表]ing 文本 (Ctrl+K) 以 所有 种可用语言显示 posts。如果 post 标题不是 language-specific(例如,“智能家居”),但“智能家居”post 存在两种语言,则用户需要反复试验 select匹配当前编辑的语言post:
我希望这个 URL 弹出窗口下拉列表只列出与当前 post 语言相同的 post,或者修改下拉列表中的结果以显示特定语言(通过标志,或标题前的“[en]”)。
首先,我尝试使用管理菜单栏的“按语言过滤内容”下拉菜单将其限制为英语 posts - 根本没有影响下拉菜单。
接下来,我尝试使用过滤器来篡改此下拉列表的查询结果。使用 pre_get_posts
并将语言 hard-coded 设置为英语有效:
add_filter('pre_get_posts', [self::class, 'filterQueryLanguage']);
}
public static function filterQueryLanguage($query) {
$query->set('lang', 'en'); // this limits the drop down results to English posts
return $query;
}
搜索下拉菜单只列出英文 posts。不幸的是,这限制了 all 查询,并且在过滤器函数中不可能确定此查询是否源自此弹出框下拉列表的 AJAX 请求。此外,我没有未能检测到当前编辑的语言 post(pll_current_language()
在这种情况下返回 false)。
因此,我需要一种方法来 post-filter 仅针对此弹出窗口下拉列表的结果,并以某种方式将语言添加到 post 名称之前。但我不知道是否有过滤器。 get_posts
似乎没有触发,即使触发了,我也不想影响所有查询。
是否有更具体的过滤器可用于此目的?
好的,我自己找到了解决办法。问题是:此 URL 弹出窗口对 search=phrase
执行 REST API 查询。此搜索查询还有一个 lang=
参数,该参数已设置为适当的 post 语言 - 但是,在组装 REST 响应时,此 lang
参数将被忽略。
我 post- 像这样过滤 REST 结果:
add_filter('rest_pre_echo_response', [self::class, 'filterRESTResponse'], 10, 3);
}
public static function filterRESTResponse($result, $server, $request) {
$params = $request->get_params();
if (!empty($params['search']) && !empty($params['lang'])) {
$filtered = [];
$lang = $params['lang'];
foreach ($result as $post) {
$post_lang = pll_get_post_language($post['id']);
if ($post_lang === $lang) {
$filtered []= $post;
}
}
$result = $filtered;
}
return $result;
}
这个解决方案有点笨拙,因为它可能让 REST 查询从一开始就尊重语言。不知道如何连接到那个,寿。 好吧,随便吧。