5

我希望使用Ghost来托管博客和静态网站,因此结构可能如下所示:

  • /: 登陆页面(不是博客登陆页面,不需要访问posts
  • /blog/:博客登陆页面(需要访问posts通常index.hbs可以访问的页面)
  • /page1/等:将使用page.hbspage-page1.hbs根据需要的静态页面
  • /blog-post-whatever/等:将使用的博客文章post.hbs

我预见到的唯一 问题是index.hbs(据我所知)仅传递了posts模板变量(请参阅此处的 GitHub 上的代码)。

在我提交拉取请求之前,很高兴知道是否:

  1. 是否有现有的方法可以访问posts变量 in page.hbs
  2. 如果没有,是否值得为此提交拉取请求?
  3. 如果是,我们真的要发送posts所有页面吗?还是应该将拉取请求分开page.hbs并仅将其发送给那些?还是有更好的方法来做到这一点?
4

6 回答 6

4

如果您不介意破解 Ghost 核心文件,那么您可以为当前版本的 Ghost (0.7.4) 进行破解。如果升级到新的 Ghost 版本,则需要重新进行此 hack。

首先创建模板文件(升级后不会改变):

在以下位置创建主页模板:

内容/主题/主题名称/home.hbs

home.hbs现在取代index.hbs并将被渲染而不是它。

还要在以下位置创建博客模板文件:

内容/主题/主题名称/blog.hbs

添加分页帖子的车把元素是

{{> "loop"}}

所以这应该在blog.hbs文件中。

同样,如果您升级到新版本的 Ghost,上述文件不会更改。

现在编辑目录中的以下文件core/server

我在您需要添加的代码部分之前和之后添加了几行,以便您可以更轻松地找到需要添加新代码的位置。

/core/server/routes/frontend.js:

前:

indexRouter.route('/').get(frontend.index);
indexRouter.route('/' + routeKeywords.page + '/:page/').get(frontend.index);

后:

indexRouter.route('/').get(frontend.index);
indexRouter.route('/blog/').get(frontend.blog);
indexRouter.route('/' + routeKeywords.page + '/:page/').get(frontend.index);

这调用了前端控制器,它将以与“索引”和“主页”相同的数据级别呈现博客页面(默认是加载最近帖子的第一页),从而使我们能够使用 / 中的“循环”博客/页面。

/core/server/controllers/frontend/index.js

前:

frontendControllers = {
    index: renderChannel('index'),
    tag: renderChannel('tag'),

后:

frontendControllers = {
    index: renderChannel('index'),
    blog: renderChannel('blog'),
    tag: renderChannel('tag'),

/core/server/controllers/frontend/channel-config.js

前:

getConfig = function getConfig(name) {
    var defaults = {
        index: {
            name: 'index',
            route: '/',
            frontPageTemplate: 'home'
        },
        tag: {

后:

getConfig = function getConfig(name) {
    var defaults = {
        index: {
            name: 'index',
            route: '/',
            frontPageTemplate: 'home'
        },
        blog: {
            name: 'blog',
            route: '/blog/',
            frontPageTemplate: 'blog'
        },
        tag: {

/core/server/controllers/frontend/channel-config.js 之前:

indexPattern = new RegExp('^\\/' + config.routeKeywords.page + '\\/'),
rssPattern = new RegExp('^\\/rss\\/'),
homePattern = new RegExp('^\\/$');

后:

indexPattern = new RegExp('^\\/' + config.routeKeywords.page + '\\/'),
rssPattern = new RegExp('^\\/rss\\/'),
blogPattern = new RegExp('^\\/blog\\/'),
homePattern = new RegExp('^\\/$');

前:

 if (indexPattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('index');
    } else if (homePattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('home');
        res.locals.context.push('index');
    } else if (rssPattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('rss');
    } else if (privatePattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('private');

后:

 if (indexPattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('index');
    } else if (homePattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('home');
        res.locals.context.push('index');
    } else if (blogPattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('blog');
    } else if (rssPattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('rss');
    } else if (privatePattern.test(res.locals.relativeUrl)) {
        res.locals.context.push('private');

重新启动服务器,您应该会看到新的 /blog/ 页面出现了最近的博客文章列表

于 2015-12-31T07:49:39.597 回答
3

这是我目前正在使用的解决方案。我有一个画布外导航,我想用它来显示指向我最新posts的 . 在主页上,这很好用:我迭代posts并呈现一些链接。在其他页面上,我没有可用的posts变量。

我的解决方案是:将主页上的相关帖子链接包装在一个 id 为“posts”的 div 中,然后我对该特定内容发出 ajax 请求(使用 jQuery 的负载)并将其注入到我的所有其他页面上的导航中,除了主页。这是jQuery 加载文档的链接。

代码:

索引.hbs

<div id='posts'>
  {{#foreach posts}}
    <li>
      <a href="{{url}}">{{{title}}}</a>
    </li>
  {{/foreach}}
</div>

应用程序.js

var $latest = $('#posts');

if ( location.pathname !== '/' )
  $latest.load('/ #posts li');
于 2014-05-19T16:06:59.283 回答
1

目前(Ghost v0.5.8)无法posts在页面模板中访问。

我认为它可能不值得提交拉取请求。Ghost 开发人员似乎对此有自己的计划,并一直表示他们会使用此功能。希望它很快,因为它是基本功能。

解决这个问题的最好方法是自己破解核心。最终,更好的方法是使用钩子。看起来 Ghost API 最终会开放到您可以连接到插件的核心功能的地步,这与 Wordpress 的做法几乎相同。https://github.com/TryGhost/Ghost/wiki/Apps-Getting-Started-for-Ghost-Devs

如果这是其他人将使用的主题,我建议在 Ghost 的当前限制范围内工作。我知道这非常烦人,但从长远来看,这对您的用户和您的声誉来说是最好的。

如果这适用于您,那么我会破解核心以在每条路线中将帖子或页面列表公开为本地人。如果您熟悉 Express,那么这应该不是很困难。

我认为你完成它的方式非常有创意,我的一部分喜欢它,但它确实是一个非常丑陋的黑客。如果您发现自己经常将这些解决方案组合在一起,那么 Ghost 可能不是您想要使用的工具。

于 2015-02-14T00:46:03.960 回答
0

比 briangonzalez 更好的解决方案是从 RSS 提要获取帖子信息,而不是主页。

请参阅此要点以了解如何完成。

于 2015-05-19T18:48:49.993 回答
0

现在您可以使用 ghost-url-api,它目前处于测试阶段,但您可以在管理中激活它(设置 > 实验室)。

例如,{{#get}} 帮助器可以像这样在静态页面中使用:

{{#get "posts" limit="3" include="author,tags"}}
 {{#foreach posts}}
    ... call the loop
 {{/foreach}}
{{/get}}

更多信息: http ://themes.ghost.org/docs/ghost-url-api

于 2016-06-30T12:51:51.703 回答
0

从 Ghost v0.9.0 开始,Channels API 仍在开发中。但是,现在实现这一点要简单得多。它仍然需要修改核心文件,但我计划很快提交一些拉取请求。目前,以下方法的一个缺点是您sitemap-pages.xml将不包含/blog/URL。

感谢@Yuval 的回答让这一切开始。


使用路径为您的索引页创建一个模板文件content/themes/theme-name/index.hbs。这可以包含您想要的“静态”主页的任何内容。


使用路径为您的博客索引页面创建一个模板文件content/themes/theme-name/blog.hbs。这只需要包含:

{{> "loop"}}

/core/server/controllers/frontend/channel-config.js

编辑var defaults对象以包括:

blog: {
  name: 'blog',
  route: '/blog/'
}
于 2016-08-08T10:11:44.910 回答