如何在WordPress中让特定页面与所有文章一同显示
解决WordPress主页同时展示特定页面与博客文章的方案
嘿,这个需求太常见了!我给你几个实用的方法,都是WordPress开发里的常规操作,不用再搞中转文章这么麻烦:
方法1:用pre_get_posts钩子修改主查询(推荐,符合WP最佳实践)
这个方法不用动主页模板,直接在主题的functions.php里加代码,通过钩子修改WordPress的主查询,让它同时包含文章和你指定的页面:
add_action('pre_get_posts', 'include_specific_pages_on_home'); function include_specific_pages_on_home($query) { // 只针对主页的主查询生效 if ($query->is_home() && $query->is_main_query()) { // 设置要查询的内容类型:文章(post) + 页面(page) $query->set('post_type', array('post', 'page')); // 如果你只想显示特定页面,用post__in指定页面ID(把下面的ID换成你自己的) $query->set('post__in', array(123, 456)); // 可选:如果想让页面和文章按发布/修改时间统一排序,保持默认的日期排序即可 // 如果你想调整排序规则,可以加下面的代码 // $query->set('orderby', 'date'); // $query->set('order', 'DESC'); } }
如果不想硬编码页面ID,想更灵活(比如后台编辑页面时直接控制是否显示在主页),可以给页面加个自定义字段:
- 编辑需要显示的页面,在「自定义字段」里添加键为
show_on_home,值为yes的字段(如果看不到自定义字段,去右上角「选项」里勾选显示) - 修改上面的函数,加上meta_query筛选:
add_action('pre_get_posts', 'include_specific_pages_on_home'); function include_specific_pages_on_home($query) { if ($query->is_home() && $query->is_main_query()) { $query->set('post_type', array('post', 'page')); // 筛选出带有show_on_home=yes的页面,同时保留所有文章 $meta_query = array( 'relation' => 'OR', array( 'key' => 'show_on_home', 'value' => 'yes', 'compare' => '=' ), array( 'post_type' => 'post', 'compare' => 'EXISTS' ) ); $query->set('meta_query', $meta_query); } }
方法2:直接修改主页模板的WP_Query
如果你不想碰functions.php,可以直接在主页模板(比如home.php或者index.php)里修改查询参数:
找到原来的WP_Query代码,把post_type改成数组,同时指定要包含的页面:
$args = array( 'post_type' => array('post', 'page'), // 同时查询文章和页面 'post__in' => array(123, 456), // 替换成你的页面ID 'posts_per_page' => 10, // 保持你原来的每页显示数量 'orderby' => 'date', 'order' => 'DESC' ); $home_query = new WP_Query($args);
同样,也可以用自定义字段的方式来筛选页面,把上面的post__in换成meta_query参数就行,和方法1里的meta_query写法一致。
注意事项
- 页面的「发布日期」会影响排序,如果你想让页面和文章按时间顺序混排,记得调整页面的发布日期到合适的位置
- 如果你的主题有自定义的文章卡片模板,要确保它能正确处理页面类型的内容(比如页面没有摘要的话,可以用
the_excerpt()或者自定义字段来显示摘要,或者用wp_trim_words(get_the_content(), 50)来截取内容作为摘要)
内容的提问来源于stack exchange,提问作者rubbernilly
相关产品推荐
相关产品推荐

