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; } }