diff --git a/config/schema/simple_sitemap.schema.yml b/config/schema/simple_sitemap.schema.yml index ac36942..92b62ec 100644 --- a/config/schema/simple_sitemap.schema.yml +++ b/config/schema/simple_sitemap.schema.yml @@ -54,3 +54,6 @@ simple_sitemap.settings: priority: label: 'Priority' type: float + check_translation: + label: 'Priority' + type: boolean diff --git a/js/simple_sitemap.form.js b/js/simple_sitemap.form.js index 04cb661..0218fcf 100644 --- a/js/simple_sitemap.form.js +++ b/js/simple_sitemap.form.js @@ -17,9 +17,11 @@ // Show 'Priority' field if 'Index sitemap' is ticked. $('.form-item-simple-sitemap-priority').show(); + $('.form-item-simple-sitemap-check-translation').show(); } else { // Hide 'Priority' field if 'Index sitemap' is empty. $('.form-item-simple-sitemap-priority').hide(); + $('.form-item-simple-sitemap-check-translation').hide(); } // On change. @@ -29,9 +31,11 @@ if ($(context).find('#edit-simple-sitemap-index-content-1').is(':checked')) { // Show 'Priority' field if 'Index sitemap' is ticked. $('.form-item-simple-sitemap-priority').show(); + $('.form-item-simple-sitemap-check-translation').show(); } else { // Hide 'Priority' field if 'Index sitemap' is empty. $('.form-item-simple-sitemap-priority').hide(); + $('.form-item-simple-sitemap-check-translation').hide(); } }); // Show 'Regenerate sitemap' field if setting has changed. diff --git a/simple_sitemap.module b/simple_sitemap.module index e23701e..16fa144 100644 --- a/simple_sitemap.module +++ b/simple_sitemap.module @@ -72,12 +72,20 @@ function simple_sitemap_entity_form_submit($form, &$form_state) { case 'bundle': $f->bundleName = !empty($f->bundleName) ? $f->bundleName : $f->getFormEntityId(); - $generator->setBundleSettings($f->entityTypeId, $f->bundleName, ['index' => $values['simple_sitemap_index_content'], 'priority' => $values['simple_sitemap_priority']]); + $generator->setBundleSettings($f->entityTypeId, $f->bundleName, [ + 'index' => $values['simple_sitemap_index_content'], + 'priority' => $values['simple_sitemap_priority'], + 'check_translation' => $values['simple_sitemap_check_translation'], + ]); break; case 'instance': $f->instanceId = !empty($f->instanceId) ? $f->instanceId : $f->getFormEntityId(); - $generator->setEntityInstanceSettings($f->entityTypeId, $f->instanceId, ['index' => $values['simple_sitemap_index_content'], 'priority' => $values['simple_sitemap_priority']]); + $generator->setEntityInstanceSettings($f->entityTypeId, $f->instanceId, [ + 'index' => $values['simple_sitemap_index_content'], + 'priority' => $values['simple_sitemap_priority'], + 'check_translation' => $values['simple_sitemap_check_translation'], + ]); break; } diff --git a/src/Batch.php b/src/Batch.php index 15ea55b..bef47f6 100644 --- a/src/Batch.php +++ b/src/Batch.php @@ -185,8 +185,21 @@ class Batch { $urls = []; foreach ($languages as $language) { - $url_object->setOption('language', $language); - $urls[$language->getId()] = $url_object->toString(); + $check_translation = isset($entity_info['bundle_settings']['priority']) ? $entity_info['bundle_settings']['priority'] : FALSE; + $langcode = $language->getId(); + + // Verify if needs to check translation. + if (!$check_translation) { + $url_object->setOption('language', $language); + $urls[$langcode] = $url_object->toString(); + } + else { + $is_translated = $entity->hasTranslation($langcode); + if ($is_translated) { + $url_object->setOption('language', $language); + $urls[$langcode] = $url_object->toString(); + } + } } $context['results']['generate'][] = [ diff --git a/src/Form.php b/src/Form.php index 47f4717..38fd85a 100644 --- a/src/Form.php +++ b/src/Form.php @@ -18,12 +18,12 @@ class Form { public $entityTypeId; public $bundleName; public $instanceId; - + private $formState; private $generator; private static $allowedFormOperations = ['default', 'edit', 'add', 'register']; - private static $valuesToCheck = ['simple_sitemap_index_content', 'simple_sitemap_priority', 'simple_sitemap_regenerate_now']; + private static $valuesToCheck = ['simple_sitemap_index_content', 'simple_sitemap_priority', 'simple_sitemap_regenerate_now', 'simple_sitemap_check_translation']; /** * Form constructor. @@ -89,7 +89,7 @@ class Form { $form_fragment['simple_sitemap_regenerate_now']['#description'] .= '
' . $this->t('Otherwise the sitemap will be regenerated on the next cron run.'); } } - + public function displayEntitySettings(&$form_fragment, $multiple = FALSE) { $prefix = $multiple ? $this->entityTypeId . '_' : ''; @@ -102,6 +102,7 @@ class Form { } $index = isset($settings['index']) ? $settings['index'] : 0; $priority = isset($settings['priority']) ? $settings['priority'] : self::PRIORITY_DEFAULT; + $check_translation = isset($settings['check_translation']) ? $settings['check_translation'] : FALSE; $bundle_name = !empty($this->bundleName) ? $this->bundleName : $this->t('undefined'); if (!$multiple) { @@ -122,6 +123,7 @@ class Form { $priority_description = $this->t('The priority this @bundle entity will have in the eyes of search engine bots.', ['@bundle' => $bundle_name]); else $priority_description = $this->t('The priority entities of this type will have in the eyes of search engine bots.'); + $form_fragment[$prefix . 'simple_sitemap_priority'] = [ '#type' => 'select', '#title' => $this->t('Priority'), @@ -129,6 +131,14 @@ class Form { '#default_value' => $priority, '#options' => self::getPrioritySelectValues(), ]; + + $form_fragment[$prefix . 'simple_sitemap_check_translation'] = [ + '#type' => 'checkbox', + '#title' => t('Check Translation'), + '#description' => t('It will check if exists translation of this content type before index it.'), + '#default_value' => $check_translation, + ]; + if ($this->entityCategory == 'instance' && isset($bundle_settings['priority'])) { $form_fragment[$prefix . 'simple_sitemap_priority']['#options'][(string)$bundle_settings['priority']] .= ' (' . $this->t('Default') . ')'; } diff --git a/src/Simplesitemap.php b/src/Simplesitemap.php index d4d08b1..bdf251c 100644 --- a/src/Simplesitemap.php +++ b/src/Simplesitemap.php @@ -16,7 +16,7 @@ class Simplesitemap { private $config_factory; private $config; private static $allowed_link_settings = [ - 'entity' => ['index', 'priority'], + 'entity' => ['index', 'priority', 'check_translation'], 'custom' => ['priority']]; /** @@ -116,7 +116,7 @@ class Simplesitemap { * Name of the bundle. NULL if entity type has no bundles. * @param array $settings * An array of sitemap settings for this bundle/entity type. - * Example: ['index' => TRUE, 'priority' => 0.5] + * Example: ['index' => TRUE, 'priority' => 0.5, 'check_translation' => TRUE] */ public function setBundleSettings($entity_type_id, $bundle_name = NULL, $settings) { $bundle_name = is_null($bundle_name) ? $entity_type_id : $bundle_name; diff --git a/src/SitemapGenerator.php b/src/SitemapGenerator.php index bf3a681..085a959 100644 --- a/src/SitemapGenerator.php +++ b/src/SitemapGenerator.php @@ -164,19 +164,23 @@ class SitemapGenerator { foreach ($links as $link) { $writer->startElement('url'); - // Adding url to standard language. - $writer->writeElement('loc', $link['urls'][$default_language_id]); - - // Adding alternate urls (other languages) if any. - if (count($link['urls']) > 1) { - foreach($link['urls'] as $language_id => $localised_url) { - $writer->startElement('xhtml:link'); - $writer->writeAttribute('rel', 'alternate'); - $writer->writeAttribute('hreflang', $language_id); - $writer->writeAttribute('href', $localised_url); - $writer->endElement(); - } + // Verify if default langcode is not present. + if (isset($link['default_langcode'])) { + $writer->writeElement('loc', $link['urls'][$link['default_langcode']]); + } + else { + // Adding url to standard language. + $writer->writeElement('loc', $link['urls'][$default_language_id]); } + + foreach($link['urls'] as $language_id => $localised_url) { + $writer->startElement('xhtml:link'); + $writer->writeAttribute('rel', 'alternate'); + $writer->writeAttribute('hreflang', $language_id); + $writer->writeAttribute('href', $localised_url); + $writer->endElement(); + } + if (isset($link['priority'])) { // Add priority if any. $writer->writeElement('priority', $link['priority']); }