diff --git a/core/server/data/meta/context_object.js b/core/server/data/meta/context_object.js index 52eabd45ffb5..d8b7495497fa 100644 --- a/core/server/data/meta/context_object.js +++ b/core/server/data/meta/context_object.js @@ -5,16 +5,29 @@ function getContextObject(data, context) { /** * If the data object does not contain the requested context, we return the fallback object. */ - var blog = { - cover_image: settingsCache.get('cover_image'), - twitter: settingsCache.get('twitter'), - facebook: settingsCache.get('facebook') - }, - contextObject; + const blog = { + cover_image: settingsCache.get('cover_image'), + twitter: settingsCache.get('twitter'), + facebook: settingsCache.get('facebook') + }; - context = _.includes(context, 'page') || _.includes(context, 'amp') ? 'post' : context; - contextObject = data[context] || blog; - return contextObject; + let chosenContext; + + // @TODO: meta layer is very broken, it's really hard to understand what it's doing + // The problem is that handlebars root object is structured differently. Sometimes the object is flat on data + // and sometimes the object is part of a key e.g. data.post. This needs to be prepared at the very first stage and not in each helper. + if (_.includes(context, 'page') || _.includes(context, 'amp') && data.post) { + chosenContext = data.post; + } else if (_.includes(context, 'post') && data.post) { + chosenContext = data.post; + } else if (data[context]) { + // @NOTE: This is confusing as hell. It tries to get data[['author']], which works, but coincidence? + chosenContext = data[context]; + } else { + chosenContext = blog; + } + + return chosenContext; } module.exports = getContextObject; diff --git a/core/test/unit/data/meta/twitter_image_spec.js b/core/test/unit/data/meta/twitter_image_spec.js index 9b26f60d1115..a8ecddf33e21 100644 --- a/core/test/unit/data/meta/twitter_image_spec.js +++ b/core/test/unit/data/meta/twitter_image_spec.js @@ -38,6 +38,18 @@ describe('getTwitterImage', function () { twitterImageUrl.should.match(/\/content\/images\/my-special-twitter-image\.jpg$/); }); + it('should return absolute url for Twitter image in post context', function () { + var twitterImageUrl = getTwitterImage({ + context: ['news', 'post'], + post: { + feature_image: '/content/images/my-test-image.jpg', + twitter_image: '/content/images/my-special-twitter-image.jpg' + } + }); + twitterImageUrl.should.not.equal('/content/images/my-special-twitter-image.jpg'); + twitterImageUrl.should.match(/\/content\/images\/my-special-twitter-image\.jpg$/); + }); + it('should return absolute url for feature image in post context', function () { var twitterImageUrl = getTwitterImage({ context: ['post'],