有没有办法将自定义端点仅添加到特定页面

时间:2020-10-13 作者:Raashid Din

希望大家都好,我正在WordPress中学习自定义端点。我知道如何创建端点以及它们是如何工作的(有一点)。但当我只想在一个页面上添加一个端点时,我就陷入了困境。让我给你举一个我想做的例子。

以id为77的示例命名的页面some-template.phpexample.com/example/endpoint1 或example.com/example/endpoint2以下是添加端点的方法。

add_action( \'init\', \'add_new_e\' );
add_filter( \'query_vars\', \'filter_vars_e\');
function add_new_e() {
    add_rewrite_endpoint( \'mash\', EP_PAGES );
}

function filter_vars_e($vars) {
    $vars[] = \'mash\';
    return $vars;
}
当插件激活/停用时,我刷新重写规则。

现在的问题是,当我打开另一个带有端点的页面时,它不会抛出404错误,而且我知道我正在使用EP_PAGES 面具

有人能帮我实现目标吗。

Goal: 将端点添加到仅具有特定模板的特定页面

此外,我希望端点的工作方式与woocommerce中的工作方式相同,比如我的帐户页面。提前谢谢。如果有人需要其他信息,请告诉我。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

add_rewrite_endpoint() 不限于任何特定页面,仅限于add_rewrite_rule() 我能做到。

但是,如果我理解正确,您可以使用pre_handle_404 钩子以检查是否设置了端点查询以及页面是否使用了特定模板,如果不满足这些条件,则抛出404错误。

基于代码的工作示例:

add_filter( \'pre_handle_404\', \'wpse_376370\', 10, 2 );
function wpse_376370( $value, $wp_query ) {
    if (
        // It\'s a valid "mash" endpoint request,
        $wp_query->get( \'mash\' )          &&
        // but the request is not a Page or its slug is not \'example\',
        ! $wp_query->is_page( \'example\' ) &&
        // and the Page is not using the template some-template.php.
        ! is_page_template( \'some-template.php\' )
    ) {
        // Therefore, we throw a 404 error
        $wp_query->set_404();

        // and avoid redirect to the page. (at example.com/example)
        remove_action( \'template_redirect\', \'redirect_canonical\' );
    }

    return $value;
}