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 { if ($this->meta) { return $this->meta; } # Use landing uri if ($landing !== false) { $url = $landing['landing_uri']; if (Lang::getLanguageUrlPrefix() !== '/') { # {sitehost}/(lang1|lang2|...)/.* => {sitehost}/ $url = preg_replace( '/' . preg_quote(Url::HOST_PLACEHOLDER) . '\/(' . join('|', Lang::getLanguages()) . ')\/.*/U', Url::HOST_PLACEHOLDER . '/', $url ); } if (empty($landing['joined'])) { $this->template->index(); } } else { $url = $this->url; } # Noindex => no meta if (! $this->template->index) { return $this->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()); if (sizeof($languages) > 1) { foreach ($languages as $lng) { # alternate meta $tag = [ 'rel' => 'alternate', 'hreflang' => $lng, 'href' => Url::dynamic($url, [], ['lang' => $lng, 'scheme' => $scheme]), ]; $this->meta['link-alternate-' . $lng] = array_merge($tag, [ 'tag' => 'link', 'html' => '', ]); } } $url = Url::dynamic($url, [], ['lang' => $language, 'scheme' => $scheme]); } # canonical meta $tag = [ 'rel' => 'canonical', 'href' => $url, ]; $this->meta['link-canonical'] = array_merge($tag, [ 'tag' => 'link', 'html' => '', ]); return $this->meta; } }