diff --git a/config/install/simple_sitemap.settings.yml b/config/install/simple_sitemap.settings.yml index 12734ab46623f2f497b9e1e2aeeb6311a5989a57..d306e131a0b180bb71ce6106e6cebcc9bfb7428d 100644 --- a/config/install/simple_sitemap.settings.yml +++ b/config/install/simple_sitemap.settings.yml @@ -12,5 +12,6 @@ settings: max_links: 2000 cron_generate: true remove_duplicates: true + skip_untranslated: false batch_process_limit: 1500 diff --git a/config/schema/simple_sitemap.schema.yml b/config/schema/simple_sitemap.schema.yml index ac369424d75f2cd20a2402a462d4fdd5da68193b..c2cb2f43232dddd18a0a21ef78665fb3e14c714a 100644 --- a/config/schema/simple_sitemap.schema.yml +++ b/config/schema/simple_sitemap.schema.yml @@ -13,6 +13,9 @@ simple_sitemap.settings: remove_duplicates: label: 'Remove duplicates' type: boolean + skip_untranslated: + label: 'Skip untranslated' + type: boolean batch_process_limit: label: 'Batch process limit' type: integer diff --git a/src/Batch.php b/src/Batch.php index 8f9b7d9b79740e54998387225020aefde5c9e2d8..3566add93a3c9c72cf4aae70e2dba23d3e6e5027 100644 --- a/src/Batch.php +++ b/src/Batch.php @@ -189,8 +189,19 @@ class Batch { $urls = []; foreach ($languages as $language) { - $url_object->setOption('language', $language); - $urls[$language->getId()] = $url_object->toString(); + $langcode = $language->getId(); + + // Exclude untranslated paths. + if ($batch_info['skip_untranslated']) { + if ($language->isDefault() || $entity->hasTranslation($langcode)) { + $url_object->setOption('language', $language); + $urls[$langcode] = $url_object->toString(); + } + } + else { + $url_object->setOption('language', $language); + $urls[$langcode] = $url_object->toString(); + } } $context['results']['generate'][] = [ @@ -246,10 +257,27 @@ class Batch { if ($batch_info['remove_duplicates'] && self::pathProcessed($path, $context)) continue; + // Load entity object if this is an entity route. + $route_parameters = $url_object->getRouteParameters(); + $entity = !empty(key($route_parameters)) + ? \Drupal::entityTypeManager()->getStorage(key($route_parameters))->load($route_parameters[key($route_parameters)]) + : NULL; + $urls = []; foreach ($languages as $language) { - $url_object->setOption('language', $language); - $urls[$language->getId()] = $url_object->toString(); + $langcode = $language->getId(); + + // Exclude untranslated paths. + if (!is_null($entity) && $batch_info['skip_untranslated']) { + if ($language->isDefault() || $entity->hasTranslation($langcode)) { + $url_object->setOption('language', $language); + $urls[$langcode] = $url_object->toString(); + } + } + else { + $url_object->setOption('language', $language); + $urls[$langcode] = $url_object->toString(); + } } $context['results']['generate'][] = [ diff --git a/src/Form/SimplesitemapSettingsForm.php b/src/Form/SimplesitemapSettingsForm.php index e349d5ff5626a09f925088736fd139f9b6c398f6..1643f9ecddf84ce5e14e6e5db0c2b91503d14a2c 100644 --- a/src/Form/SimplesitemapSettingsForm.php +++ b/src/Form/SimplesitemapSettingsForm.php @@ -10,7 +10,13 @@ use Drupal\Core\Form\FormStateInterface; */ class SimplesitemapSettingsForm extends ConfigFormBase { - private $form_settings = ['max_links', 'cron_generate', 'remove_duplicates', 'batch_process_limit']; + private $form_settings = [ + 'max_links', + 'cron_generate', + 'remove_duplicates', + 'skip_untranslated', + 'batch_process_limit' + ]; /** * {@inheritdoc} @@ -69,7 +75,14 @@ class SimplesitemapSettingsForm extends ConfigFormBase { '#type' => 'checkbox', '#title' => $this->t('Exclude duplicate links'), '#description' => $this->t('Uncheck this to significantly speed up the sitemap generation process on a huge site (more than 20 000 indexed entities).'), - '#default_value' => $generator->getSetting('remove_duplicates'), + '#default_value' => $generator->getSetting('remove_duplicates', TRUE), + ]; + + $form['simple_sitemap_settings']['advanced']['skip_untranslated'] = [ + '#type' => 'checkbox', + '#title' => $this->t('Skip non-existent translations'), + '#description' => $this->t('If unchecked, the sitemap will include links to all content translation variants, even when the content has not been translated yet. If checked, only links to the translated content are included.'), + '#default_value' => $generator->getSetting('skip_untranslated', FALSE), ]; $form['simple_sitemap_settings']['advanced']['max_links'] = [