添加重写终结点打破静态头版

时间:2015-06-17 作者:Sisir

我的WP安装集的静态首页来自settings > reading. 然后,我使用添加了一个URL端点。

add_rewrite_endpoint(\'foo\', EP_ALL);
因此,可以通过

http://example.com/
http://example.com/foo
http://example.com/foo/bar
对于#1,一切正常,但对于#2和#3默认home.php 显示,而不是静态主页。在单站点和多站点安装中进行本地测试。

这是我想要的行为还是我撞到了不寻常的东西?更重要的是,如何使WP在给定条件下显示静态主页?

解决方案

我已经parse_request 若要处理部分代码,请执行以下操作foo 存在。因此,根据@gmazzap的解决方案。我只需要在事后取消设置它。不需要额外的钩子函数来绕过bug。

add_action(\'parse_request\', function(&wp){

    $key = \'foo\';

    if (!array_key_exists( $key, $wp->query_vars ) ) {
        return;
    }

    // do things when foo exists

    // we no longer need \'foo\'
    unset($wp->query_vars[$key]);

});

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

也许我没有很好地理解这一点,但如果你需要删除\'foo\' from查询变量的使用不会简单得多\'request\' 过滤并删除var?

所需代码:

add_filter(\'request\', function($query_vars) {
     return array_diff_key($query_vars, array(\'foo\'=>\'\'));
});
信息技术:

仅在主查询上运行删除的var$wp 对象在设置查询之前动作$wp_query, 因此,无需从那里删除查询不会影响所有其他变量编辑:此代码的一个问题是它运行得很早,因此很难捕捉到查询变量的存在并根据其存在/值执行操作。

解决方案可以是在相同的条件下运行\'request\' 过滤器,就在删除查询变量之前(例如,使用优先级更高的同一挂钩)。

另一种解决方案可能是在$wp 对象:

add_filter(\'request\', function($query_vars) {
     $GLOBALS[\'wp\']->_foo = isset($query_vars[\'foo\']) ? $query_vars[\'foo\'] : false;
     return array_diff_key($query_vars, array(\'foo\'=>\'\'));
});
之后,就可以在之后激发的任何挂钩中检查“foo”变量\'request\', 最早的是\'parse_request\'

add_action(\'parse_request\', function($wp) {
    $foo = $wp->_foo;
    // do something with foo
});
最后一个是\'shutdown\':

add_action(\'shutdown\', function() {
    $foo = $GLOBALS[\'wp\']->_foo;
    // do something with foo
});

SO网友:Sisir

这是一个bug25143 正如@toscho指出的,将在4.3中固定

Workaround Found in the ticket and modified a little

WordPress添加foo 作为导致问题的查询变量。因此,我们需要在WP查询DB之前删除它

add_action( \'pre_get_posts\', \'wpse191771_unset_query_arg\' );
function wpse191771_unset_query_arg($query){

    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    $key = \'foo\';

    $query_vars =& $query->query_vars;

    if ( array_key_exists($key, $query_vars) ) {
        // unset ref var from $wp_query
        $query->set( $key, null );

        global $wp;
        // unset ref var from $wp
        unset( $wp->query_vars[ $key ] );

        // if in home (because $wp->query_vars is empty) and \'show_on_front\' is page
        if ( empty( $wp->query_vars ) && get_option( \'show_on_front\' ) === \'page\' ) {
            // reset and re-parse query vars
            $wp->query_vars[\'page_id\'] = get_option( \'page_on_front\' );
            $query->parse_query( $wp->query_vars );
        }
    }

}

结束

相关推荐