Mixing PHP into Hugo

Hugo Homepage

Hugo is nice because of its blog template system, static site generation abilities and generic framework structure, but sometimes you may want to add extra functionality that requires dynamic The unholy union of PHP and Hugo.

If you are also combining static elements with dynamic functions you may want to DRY your views to make everything consistent. It could be that you only want the blog of your website to be static and everything else to operate dynamically.

We can generate files ending in .php using the media types option in Hugo, however because the template is in the layouts/_default directory, we can simply inject something like this directly within the .html This is not recommended if you do not have complete control of your stack.

{{ safeHTML "<?php require $_SERVER['DOCUMENT_ROOT'] . '/..' . '/views/partials/navigator.php'; ?>" }}

This tells Hugo when compiling to insert the above PHP code as safe HTML into the statically generated When in the context of an HTML attribute you can use safeHTMLAttr. If your web server is set up to parse .html files as PHP then you are good to go.

# nginx let fastcgi parse .php, .html, and .htm
location ~ \.(php|html|htm)$ {
    include default.d/php_fastcgi.conf;

More tricks can be had by carefully tiptoeing around the Go This is blasphemy … is what you are probably thinking. You get the best of both This is a partial snippet of an image shortcode which automatically sets height and width using PHP to prevent image reflow. This can also be done with plain imageConfig.

{{ safeHTML "<?php" }}
$width = getimagesize($_SERVER['DOCUMENT_ROOT'] . '{{.Get `source`}}')[0];
$height = getimagesize($_SERVER['DOCUMENT_ROOT'] . '{{.Get `source`}}')[1];
$ratio = ((($height / $width) * 100) > 100) ? $height . 'px' : $height / $width * 100 . '%';
{{ safeHTML "?>" }}

<img data-image-zoom src="{{.Get `source`}}" alt="{{.Get `title`}}" title="{{.Get `title`}}"
{{ safeHTMLAttr `<?php echo 'width=' . '"' . $width . '"'; ?>` }}
{{ safeHTMLAttr `<?php echo 'height=' . '"' . $height . '"'; ?>` }} />

If you are interested in producing .php pages with Hugo, take a look here. Note that since Hugo version 0.44 the MediaType.Suffix is deprecated and replaced with a plural version, MediaType.Suffixes

Updated 18 May 2019