Hi
I’m sure I’m doing something stupid here but I’ve tried so many combinations of things I’m wondering if someone can help.
I’ve added some fields called ‘seoTitle’ and ‘metaDescription’ to my config.yml file. Here’s an example:
collections:
- name: service
label: Service
format: yml
extension: yml
folder: data/products/
create: true
slug: '{{title}}'
fields:
- {label: "Title", name: "title", widget: "string", required: true}
- {label: "SEO title", name: "seoTitle", widget: "string"}
- {label: "Meta description", name: "metaDescription", widget: "string"}
- {label: "Publish Date", name: "date", widget: "datetime"}
- {label: "Image", name: "image", widget: "image", required: true}
- {label: "Body", name: "body", widget: "markdown"}
I’ve added them to all my collections and they’re showing up fine in the CMS.
I’m having referencing them in the title and meta description files though. I’ve tried doing it from a Slim file like this:
title: product.seoTitle
If I do it within the body it works fine but I can’t figure out how to reference it in the head - It just outputs ‘product.seoTitle’ as a string.
I’ve also tried doing it from my layout file:
title = current_page.seoTitle
That throws an error.
Would anyone mind suggesting what I’m doing wrong?
Looks like you’re using the Netlify CMS Middleman Starter
With yml collections in Middleman, things are a bit more complicated than using current_page.data
like you would with Middleman Blog. Your page gets its data through a proxy, which looks like this:
data.products.each do |_filename, product|
proxy "/product/#{product[:title].parameterize}/index.html", "product.html",
locals: {product: product}, #page data (product) is set here
layout: 'product-detail',
ignore: true
end
You can learn more about dynamic pages in Middleman here: Middleman: Dynamic Pages
In _meta.slim
(or product-layout.slim
if you prefer that) you can then use the data:
title = product.seoTitle
Be aware that if you use meta.slim
you need a fallback for pages where the product data isn’t available, for instance blog titles or a default string.
- product = product || nil
title = product && product.seoTitle || current_page.data.title || "Default website title"
It might be easier to simplify your layout files with their own meta.
Hi Tom
I am indeed - thanks for your hard work on it.
I’ve tried setting title = product.seoTitle in both product.html.slim and meta.slim but both fail to deploy.
Could I be missing something else?
I just tested it with the blank starter and it works. Can you share your repo so I can have a look?
Apologies - I’d missed off the fallback that you mentioned. Now included and working perfectly.
Thanks for your help
2 Likes