You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress中获取带自定义模板的页面内容并合并为单页?

WordPress多页转单页:提取自定义模板内容方案

WordPress原生没有直接提取自定义page-ID.php模板中get_header()和get_footer()之间内容的函数,必须通过自定义代码实现,以下是两种可行方案:

方案一:改造自定义模板(推荐,稳定性高)

先修改每个page-ID.php,将核心内容封装为独立函数,同时保留原页面的正常访问逻辑:

// 示例:page-123.php
if (!defined('ABSPATH')) exit;

// 将原模板中header之后、footer之前的内容封装成函数
function my_page_123_content() {
    // 这里放原模板的核心代码,比如自定义查询、媒体展示等
    $custom_query = new WP_Query(['post_type' => 'portfolio', 'posts_per_page' => 6]);
    if ($custom_query->have_posts()) {
        while ($custom_query->have_posts()) {
            $custom_query->the_post();
            echo '<div class="portfolio-item">';
            the_title('<h3>', '</h3>');
            the_post_thumbnail('medium');
            echo '</div>';
        }
        wp_reset_postdata();
    }
}

// 保留原页面访问时的正常输出逻辑
if (is_singular('page') && get_the_ID() == 123) {
    get_header();
    my_page_123_content();
    get_footer();
}

之后在你的单页模板中,循环调用各页面的封装函数:

// 示例:page-single-site.php(你的单页模板)
get_header();

// 定义需要整合的页面ID列表
$target_page_ids = [123, 456, 789];

foreach ($target_page_ids as $page_id) {
    global $post;
    $post = get_post($page_id);
    setup_postdata($post);

    $template_path = get_template_directory() . "/page-{$page_id}.php";
    if (file_exists($template_path)) {
        require_once $template_path;
        // 调用对应页面的内容函数
        $content_func = "my_page_{$page_id}_content";
        if (function_exists($content_func)) {
            call_user_func($content_func);
        }
    } else {
        // 无自定义模板的页面,直接输出处理后的内容
        echo apply_filters('the_content', $post->post_content);
    }

    wp_reset_postdata();
}

get_footer();

方案二:输出缓冲捕获模板内容(无需改模板,依赖主题结构)

如果不想修改现有page-ID.php,可以用PHP输出缓冲捕获完整模板输出,再剔除header和footer部分:

// 单页模板中的循环逻辑
$target_page_ids = [123, 456, 789];

foreach ($target_page_ids as $page_id) {
    global $post;
    $post = get_post($page_id);
    setup_postdata($post);

    // 开启输出缓冲
    ob_start();
    // 加载页面的完整模板(含header和footer)
    include(get_page_template());
    $full_output = ob_get_clean();

    // 根据你的主题header/footer结构,截取中间内容
    // 示例:假设header以</header>结尾,footer以<footer>开头
    $header_end_pos = strpos($full_output, '</header>') + strlen('</header>');
    $footer_start_pos = strpos($full_output, '<footer>');

    if ($header_end_pos && $footer_start_pos) {
        $core_content = substr($full_output, $header_end_pos, $footer_start_pos - $header_end_pos);
        echo $core_content;
    } else {
        // 匹配失败时的降级处理
        echo apply_filters('the_content', $post->post_content);
    }

    wp_reset_postdata();
}

方案对比

  • 方案一:需要逐个修改自定义模板,但逻辑清晰、稳定性高,不会受主题header/footer变更影响。
  • 方案二:无需修改现有模板,但依赖主题的HTML结构,若header/footer代码变动,截取逻辑可能失效。

内容的提问来源于stack exchange,提问作者etlaM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:45:05