template = $template;
$this->setUrl($url, $query);
$this->pagesCanonical = bff::config('seo.pages.canonical', true, TYPE_BOOL);
}
/**
* @param string $url
* @param array $query
*/
public function setUrl(string $url, array $query = [])
{
$this->url = $url;
$this->query = $query;
}
/**
* @param array $query
* @param string $url
* @return string
*/
public function queryToString(array $query, string $url): string
{
if (empty($query)) {
return '';
}
# Skip first 'page' and 'total' pages counter
foreach ($query as $key => $value) {
if (empty($value) || ($key == 'page' && $value < 2) || $key === 'total') {
unset($query[$key]);
}
}
# Exclude 'page' from canonical url
if (! $this->pagesCanonical) {
unset($query['page']);
}
return Url::query($query, [], (strpos($url, '?') === false ? '?' : '&'));
}
/**
* Get final meta tags
* @param string $language
* @param bool|array $landing active landing page or false
* @return array
*/
public function getMeta(string $language, $landing): array
{
$meta = [];
# Use landing uri
$url = ($landing !== false ? $landing['landing_uri'] : $this->url);
# Noindex => no meta
if (! $this->template->index && bff::config('seo.noindex.notcanonical', false)) {
return $meta;
}
# Add query
$url .= $this->queryToString($this->query, $url);
# Dynamic url => final url
if (Url::isDynamic($url)) {
$scheme = (bff::config('https.canonical', false) ? 'https' : false);
$languages = Lang::getLanguages(true, Lang::getHiddenLocalesList());
$dynamicOptions = function ($language) use ($scheme, $landing) {
if ($landing !== false) { # landing pages + all segments (region, ...)
return ['scheme' => $scheme, 'segments' => Url::segments(['locale' => $language])];
}
# page + system segments only (subdir, lang)
return ['scheme' => $scheme, 'lang' => $language];
};
if (sizeof($languages) > 1) {
foreach ($languages as $lng) {
# alternate meta
$tag = [
'rel' => 'alternate',
'hreflang' => $lng,
'href' => Url::dynamic($url, [], $dynamicOptions($lng)),
];
$meta['link-alternate-' . $lng] = array_merge($tag, [
'tag' => 'link',
'html' => '',
]);
}
}
$url = Url::dynamic($url, [], $dynamicOptions($language));
}
# canonical meta
$tag = [
'rel' => 'canonical',
'href' => $url,
];
$meta['link-canonical'] = array_merge($tag, [
'tag' => 'link',
'html' => '',
]);
return $meta;
}
}