以下是not 一个完整的解决方案(如@cjbj所述,它不会处理帖子内容中的链接),但它可以为任何URL(在WP核心、主题或插件中)通过get_permalink() (包括wp_page_menu(), 和亲属)。
$filters = array (
\'post_link\', // when post_type == \'post\'
\'page_link\', // when post_type == \'page\'
\'attachment_link\', // when post_type == \'attachment\'
\'post_type_link\', // when post_type is not one of the above
) ;
foreach ($filters as $filter) {
add_filter ($filter, \'wpse_add_current_requests_query_args\', 10, 3) ;
}
function
wpse_add_current_requests_query_args ($permalink, $post, $leavename)
{
if (!is_admin ()) {
// we only want to modify the permalink URL on the front-end
return ;
}
// for the purposes of this answer, we ignore the $post & $leavename
// params, but they are there in case you want to do conditional
// processing based on their value
return (esc_url (add_query_arg ($_GET, $permalink))) ;
}
返回结果之前的解释,
get_permalink()
应用4个过滤器中的一个(在
$filters
上面的数组)。因此,我们连接到每个过滤器。
我们钩住这些过滤器调用的函数add_query_arg() 要添加当前请求中存在的任何查询参数(即。,$_GET
).
重要提示:默认情况下,add\\u query\\u arg()的返回值不会转义。应使用esc\\u url()或类似工具对输出进行后期转义,以帮助防止跨站点脚本(XSS)攻击的漏洞。
在中调用esc\\u url()wpse_add_current_requests_query_args()
并不是在所有情况下我都会称之为“迟来的逃跑”。但不幸的是,许多WP核心功能(例如。Walker_Page::start_el(), 最终由wp_page_menu()
), 不要打电话esc_url()
关于返回值get_permalink()
, 因此,为了安全起见,我们必须在过滤器挂钩中调用它。