diff -u b/hreflang.info.yml b/hreflang.info.yml --- b/hreflang.info.yml +++ b/hreflang.info.yml @@ -1,4 +1,4 @@ -core_version_requirement: ^10.1 || ^11 || ^12 +core_version_requirement: ^8 || ^9 || ^10 || ^11 || ^12 description: Automatically adds an hreflang tag to the page for each enabled language. name: Hreflang package: Multilingual reverted: --- b/hreflang.module +++ a/hreflang.module @@ -5,18 +5,87 @@ * Adds hreflang link elements to the header of each page. */ +use Drupal\Core\Cache\CacheableMetadata; -use Drupal\Core\Hook\Attribute\LegacyHook; -use Drupal\hreflang\Hook\HreflangHooks; use Drupal\Core\Entity\ContentEntityInterface; +use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Url; /** * Implements hook_page_attachments(). * * @phpstan-ignore missingType.iterableValue */ -#[LegacyHook] function hreflang_page_attachments(array &$page): void { + // No need to add hreflang tags for 404/403 pages. + if (Drupal::request()->attributes->has('exception')) { + return; + } + + $config = Drupal::config('hreflang.settings'); + $addXDefault = $config->get('x_default'); + $is_front_page = Drupal::service('path.matcher')->isFrontPage(); + if ($config->get('defer_to_content_translation') && $entity = hreflang_content_translation_get_entity()) { + if ($addXDefault) { + $translation = $entity->getUntranslated(); + $access = $translation->access('view', NULL, TRUE); + if ($access->isAllowed()) { + $url = $is_front_page ? Url::fromRoute('') : $entity->toUrl(); + $page['#attached']['html_head_link'][] = [ + [ + 'rel' => 'alternate', + 'hreflang' => 'x-default', + 'href' => $url + ->setOption('language', $translation->language()) + ->setAbsolute() + ->toString(), + ], + ]; + } + CacheableMetadata::createFromRenderArray($page) + ->addCacheableDependency($access) + ->applyTo($page); + } + return; + } + + $language_manager = Drupal::languageManager(); + if (!$language_manager->isMultilingual()) { + return; + } + $url = $is_front_page ? Url::fromRoute('') : Url::fromRouteMatch(Drupal::routeMatch()); + $links = $language_manager->getLanguageSwitchLinks(LanguageInterface::TYPE_INTERFACE, $url); + if (empty($links->links)) { + return; + } + + // Adding x-default if option checked. + $defaultLanguageId = $language_manager->getDefaultLanguage()->getId(); + if ($config->get('x_default_fallback')) { + $fallbackLanguageId = Drupal::config('language.negotiation')->get('selected_langcode'); + if (isset($fallbackLanguageId) && $fallbackLanguageId !== LanguageInterface::LANGCODE_SITE_DEFAULT) { + $defaultLanguageId = $fallbackLanguageId; + } + } + + foreach ($links->links as $langcode => $link) { + if (isset($link['url'])) { + $link['url']->setOptions($link); + $link['url']->setAbsolute(); + $attributes = [ + 'rel' => 'alternate', + 'hreflang' => NULL, + 'href' => $link['url']->toString(), + ]; + if ($addXDefault && $langcode === $defaultLanguageId) { + $attributes['hreflang'] = 'x-default'; + $page['#attached']['html_head_link'][] = [$attributes]; + } + $attributes['hreflang'] = $langcode; + $page['#attached']['html_head_link'][] = [$attributes]; + } + } + // The hreflang tags include query args, so add the query args cache context. + $page['#cache']['contexts'][] = 'url.query_args'; - \Drupal::service(HreflangHooks::class)->pageAttachments($page); } /** @@ -62,7 +131,13 @@ * * @phpstan-ignore missingType.iterableValue */ -#[LegacyHook] function hreflang_help(?string $route_name): array { + if ($route_name === 'hreflang.admin_settings' || $route_name === 'help.page.hreflang') { + return [ + '#type' => 'html_tag', + '#tag' => 'p', + '#value' => t('Hreflang module automatically adds an hreflang tag to the page for each enabled language.'), + ]; + } + return []; - return \Drupal::service(HreflangHooks::class)->help($route_name); } reverted: --- b/hreflang.services.yml +++ a/hreflang.services.yml @@ -5,7 +5,3 @@ arguments: ['@cache_tags.invalidator', '@messenger'] tags: - { name: event_subscriber } - - Drupal\hreflang\Hook\HreflangHooks: - class: Drupal\hreflang\Hook\HreflangHooks - autowire: true reverted: --- b/src/Hook/HreflangHooks.php +++ /dev/null @@ -1,108 +0,0 @@ -attributes->has('exception')) { - return; - } - $config = \Drupal::config('hreflang.settings'); - $addXDefault = $config->get('x_default'); - $is_front_page = \Drupal::service('path.matcher')->isFrontPage(); - if ($config->get('defer_to_content_translation') && $entity = hreflang_content_translation_get_entity()) { - if ($addXDefault) { - $translation = $entity->getUntranslated(); - $access = $translation->access('view', NULL, TRUE); - if ($access->isAllowed()) { - $url = $is_front_page ? Url::fromRoute('') : $entity->toUrl(); - $page['#attached']['html_head_link'][] = [ - [ - 'rel' => 'alternate', - 'hreflang' => 'x-default', - 'href' => $url->setOption('language', $translation->language())->setAbsolute()->toString(), - ], - ]; - } - CacheableMetadata::createFromRenderArray($page)->addCacheableDependency($access)->applyTo($page); - } - return; - } - $language_manager = \Drupal::languageManager(); - if (!$language_manager->isMultilingual()) { - return; - } - $url = $is_front_page ? Url::fromRoute('') : Url::fromRouteMatch(\Drupal::routeMatch()); - $links = $language_manager->getLanguageSwitchLinks(LanguageInterface::TYPE_INTERFACE, $url); - if (empty($links->links)) { - return; - } - // Adding x-default if option checked. - $defaultLanguageId = $language_manager->getDefaultLanguage()->getId(); - if ($config->get('x_default_fallback')) { - $fallbackLanguageId = \Drupal::config('language.negotiation')->get('selected_langcode'); - if (isset($fallbackLanguageId) && $fallbackLanguageId !== LanguageInterface::LANGCODE_SITE_DEFAULT) { - $defaultLanguageId = $fallbackLanguageId; - } - } - foreach ($links->links as $langcode => $link) { - if (isset($link['url'])) { - $link['url']->setOptions($link); - $link['url']->setAbsolute(); - $attributes = [ - 'rel' => 'alternate', - 'hreflang' => NULL, - 'href' => $link['url']->toString(), - ]; - if ($addXDefault && $langcode === $defaultLanguageId) { - $attributes['hreflang'] = 'x-default'; - $page['#attached']['html_head_link'][] = [ - $attributes, - ]; - } - $attributes['hreflang'] = $langcode; - $page['#attached']['html_head_link'][] = [ - $attributes, - ]; - } - } - // The hreflang tags include query args, so add the query args cache context. - $page['#cache']['contexts'][] = 'url.query_args'; - } - - /** - * Implements hook_help(). - * - * @phpstan-ignore missingType.iterableValue - */ - #[Hook('help')] - public function help(?string $route_name): array { - if ($route_name === 'hreflang.admin_settings' || $route_name === 'help.page.hreflang') { - return [ - '#type' => 'html_tag', - '#tag' => 'p', - '#value' => $this->t('Hreflang module automatically adds an hreflang tag to the page for each enabled language.'), - ]; - } - return []; - } - -}