View source
<?php
namespace Drupal\media_sitemap;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Database\Driver\mysql\Connection;
use Drupal\Core\File\FileSystem;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Url;
class MediaSitemapGenerator implements MediaSitemapGeneratorInterface {
protected $database;
protected $configFactory;
protected $fileSystem;
protected $messenger;
public function __construct(Connection $database, ConfigFactory $configFactory, FileSystem $fileSystem, MessengerInterface $messenger) {
$this->database = $database;
$this->configFactory = $configFactory;
$this->fileSystem = $fileSystem;
$this->messenger = $messenger;
}
public static function generateSitemap() {
$database = \Drupal::service('database');
$configFactory = \Drupal::service('config.factory');
$fileSystem = \Drupal::service('file_system');
$messenger = \Drupal::service('messenger');
$sitemapGenerator = new static($database, $configFactory, $fileSystem, $messenger);
$sitemapGenerator
->process();
}
public function process() {
$query = $this->database
->select('file_usage', 'fu');
$query
->fields('fu', array(
'id',
));
$query
->join('node', 'n', 'n.nid = fu.id');
$nids = $query
->distinct()
->execute()
->fetchAll();
$output = '';
$path = '';
$total_urls = 0;
if (count($nids) > 0) {
$output = '<?xml version="1.0" encoding="UTF-8"?>';
$output .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">';
foreach ($nids as $nid) {
$query = \Drupal::database()
->select('file_managed', 'fm');
$query
->fields('fm', array(
'fid',
'filename',
'uri',
));
$query
->join('file_usage', 'fu', 'fu.fid = fm.fid');
$query
->condition('fu.id', $nid->id);
$query
->condition('fm.filemime', 'image/%', 'LIKE');
$files = $query
->execute()
->fetchAll();
if (count($files) > 0) {
$output .= '<url><loc>' . Url::fromRoute('entity.node.canonical', array(
'node' => $nid->id,
), array(
'absolute' => TRUE,
))
->toString() . '</loc>';
foreach ($files as $file) {
$output .= '<image:image><image:loc>' . file_create_url($file->uri) . '</image:loc><image:title>' . $file->filename . '</image:title></image:image>';
}
$output .= '</url>';
$total_urls++;
}
}
$output .= '</urlset>';
$path = file_create_url($this->fileSystem
->realpath($this->configFactory
->get('system.file')
->get('default_scheme') . "://media_sitemap"));
if (!is_dir($path)) {
\Drupal::service('file_system')
->mkdir($path);
}
}
$time = time();
$filename = 'image_sitemap.xml';
if ($file = $this->fileSystem
->saveData($output, $path . '/' . $filename, FileSystemInterface::EXISTS_REPLACE)) {
$this->configFactory
->getEditable('media_sitemap.settings')
->set('image_sitemap_created', $time)
->set('image_sitemap_number_of_urls', $total_urls)
->save();
}
}
public function sitemapGenerateFinished($success, $results, $operations) {
if ($success) {
$this->messenger
->addMessage(t('Image Sitemap Generated Successfully.'));
}
else {
$error_operation = reset($operations);
$this->messenger
->addMessage(t('An error occurred while processing @operation with arguments : @args', array(
'@operation' => $error_operation[0],
'@args' => print_r($error_operation[0], TRUE),
)));
}
}
}