您可以通过几种不同的方式来实现这一点,具体取决于模板中发生的情况以及您如何识别要覆盖的页面。
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\' );