如何覆盖查询并按ID显示特定页面?

时间:2017-05-30 作者:Benn

我需要构建一个脱机页面,第一个想法是简单地获取所需的页面ID并执行wp\\u重定向,但这会留下一个页面的URL以重定向到。

function _action_offline_mode( $template  ){

    if( is_admin()){
        return;
    }

    $offline    = get_option(\'offline\',\'inactive\');
    $off_page   = get_option(\'off_page\',null);

    if(\'active\' == $offline && !empty($off_page)){

        $user           = wp_get_current_user();
        $allowed_roles  = array(\'administrator\');       
        $off_page_link  = get_permalink($off_page[0]);

        if( !array_intersect($allowed_roles, $user->roles ) && ( get_the_ID() != $off_page[0] ) ){
            wp_redirect($off_page_link,307);
            exit();
        }
    }

}
add_action( \'template_redirect\', \'_action_offline_mode\');
浏览器中的叶子

sitename.com/redirect_page_permalink
比我想做的还要多template_redirect 但这并没有覆盖实际的查询页面ID,给我留下了不需要的选项。也尝试过pre_get_posts 但无法使其正常工作。

有没有人知道一种体面的方式来告诉WordPress按ID显示特定的页面without 使用自定义模板和使用内置挂钩?

例如,如果您位于ID为10的页面上,请添加函数以显示ID为80的页面及其所有选项。

请注意,在此处显示其他类似的页面内容Get the content of a specific page (by ID)

保持主查询不变,因此主查询仍将从ID为10的页面中提取所有页面数据,但我需要它按ID 80显示页面,主查询将从ID为80的页面中提取数据。

这是因为每个页面都可以有一些自定义设置,这些设置不是由页面ID拉取的,如果查询页面ID与显示的不同,我最终会有错误的选项。

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

您可以通过几种不同的方式来实现这一点,具体取决于模板中发生的情况以及您如何识别要覆盖的页面。

1. Simple method with pre_get_posts:

这将主要起作用,但查询的对象仍将包含旧页面,但是,使用get_the_ID() 在加载页面数据的模板中,将返回正确的ID,并允许您从目标页面加载数据。

function wpd_switch_page( $query ){
    if( $query->is_page( 42 ) && $query->is_main_query() ) {
        $query->set( \'page_id\', 23 );
    }
}
add_action( \'pre_get_posts\', \'wpd_switch_page\' );

2. Using simple request filter with page name:

这将正确设置查询的对象,因此body类等将包含正确的ID,get_queried_object_ID() 将返回目标页的ID。但在这种情况下,您必须知道pagename 源页和目标页的,而不是ID:

function alter_the_query( $request ) {
    if( isset( $request[\'pagename\'] ) && \'source-page\' == $request[\'pagename\'] ){
        $request[\'pagename\'] = \'target-page\';
    }
    return $request;
}
add_filter( \'request\', \'alter_the_query\' );

3. Using request filter with page ID:

如果首先解析查询,则可以检查源页面ID而不是名称。您可以选择然后设置pagename 如上所述,如果您愿意,也可以按页面ID进行:

function alter_the_query( $request ) {
    $dummy_query = new WP_Query();
    $dummy_query->parse_query( $request );

    if ( $dummy_query->is_page( 42 ) ){
        unset( $request[\'pagename\'] );
        $request[\'page_id\'] = 23;
    }
    return $request;
}
add_filter( \'request\', \'alter_the_query\' );

结束

相关推荐