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

Ghost 1.2.0自定义Handlebars助手提取文章HTML问题求助

解决Ghost 1.2.0自定义Handlebars助手获取文章HTML的问题

我之前也踩过Ghost版本升级的坑,1.0+的架构变更确实让旧的自定义助手方法彻底失效了。核心问题你得先理清:Handlebars助手是在服务器端渲染阶段执行的,你用前端Ajax去拿内容的时机完全不对——等客户端Ajax请求返回时,模板早就渲染完成了,自然没法把值传递给助手。

下面给你两个适配Ghost 1.2.0的服务器端可行方案:

方案一:在自定义助手内直接调用Ghost API获取文章原始HTML

不需要依赖前端jQuery,直接在服务器端通过Ghost内置API拿到文章完整HTML内容,再做针对性处理。步骤如下:

  1. 先在你的App目录下安装cheerio(服务器端HTML解析工具,比jQuery更适合无DOM环境):
npm install cheerio --save
  1. 在App的index.js里注册自定义助手,直接从Ghost API拉取内容并处理:
module.exports = function(app) {
    // 注册自定义助手,比如命名为{{customContent}}
    app.helpers.register('customContent', function(options) {
        // 从当前上下文获取文章ID
        const currentPostId = this.post.id;
        
        // 调用Ghost内部API获取文章完整内容(包含原始HTML)
        return app.api.posts.read(
            {id: currentPostId, include: 'content'},
            {context: {internal: true}} // 用内部上下文确保能拿到完整数据
        )
        .then(post => {
            // 用cheerio解析HTML,提取你需要的内容块
            const cheerio = require('cheerio');
            const $ = cheerio.load(post.html);
            
            // 示例:提取文章前两个段落并包裹自定义容器
            const processedContent = $('p').slice(0, 2).wrapAll('<div class="custom-content-block"></div>').parent().html();
            
            // 返回安全的HTML字符串,避免被Handlebars转义
            return new app.handlebars.SafeString(processedContent);
        })
        .catch(err => {
            console.error('获取文章内容失败:', err);
            // 出错时回退到默认的{{content}}输出
            return options.fn(this);
        });
    });
};
  1. 在模板里直接用{{customContent}}代替{{content}},就能输出处理后的内容块了。

方案二:利用Ghost的posts.rendered钩子提前处理内容

如果不需要动态在模板里调用助手,也可以在文章渲染完成前拦截内容,提前处理好后挂载到文章对象上,直接在模板里引用:

module.exports = function(app) {
    // 监听文章渲染完成的钩子
    app.hooks.on('posts.rendered', (post) => {
        const cheerio = require('cheerio');
        const $ = cheerio.load(post.html);
        
        // 示例:提取所有图片并包裹成图片画廊容器
        post.customImageBlock = $('img').wrapAll('<div class="image-gallery"></div>').parent().html();
    });
};

之后在模板里直接用{{post.customImageBlock}}就能拿到提前处理好的内容块。

关键注意事项

  • 绝对不要在服务器端用jQuery:jQuery依赖浏览器DOM环境,服务器端运行会报错,cheerio是专门为服务器端HTML解析设计的轻量工具,完全够用。
  • 确保你的App放在Ghost的content/apps目录下,并且在Ghost后台激活,这样才能正确调用Ghost的API和钩子。
  • 如果需要处理Markdown原始内容(而非渲染后的HTML),可以用post.markdown字段,结合markdown-it这类解析库做更精细的块级处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:00:58