View source
<?php
define('XMLSITEMAP_BATCH_LIMIT', 100);
function xmlsitemap_drush_command() {
$items['xmlsitemap-regenerate'] = array(
'description' => 'Regenerate the XML sitemap files.',
'callback' => 'drush_xmlsitemap_regenerate',
'drupal dependencies' => array(
'xmlsitemap',
),
);
$items['xmlsitemap-rebuild'] = array(
'description' => 'Dump and re-process all possible XML sitemap data, and then regenerate the files.',
'callback' => 'drush_xmlsitemap_rebuild',
'drupal dependencies' => array(
'xmlsitemap',
),
'options' => array(
'types' => 'The types of links to rebuild, comma separated. If not provided, all link types will be used.',
),
);
$items['xmlsitemap-index'] = array(
'description' => 'Process un-indexed XML sitemap links.',
'callback' => 'drush_xmlsitemap_index',
'drupal dependencies' => array(
'xmlsitemap',
),
'options' => array(
'limit' => 'The limit of links of each type to process. Default value: ' . variable_get('xmlsitemap_batch_limit', XMLSITEMAP_BATCH_LIMIT),
),
);
$items['xmlsitemap-queue-rebuild'] = array(
'description' => 'Dump and queues all possible XML sitemap data to be re-processed via the xmlsitemap_link_process queue. This command does not regenerate the sitemap files.',
'options' => array(
'types' => 'The types of links to queue for rebuild, comma separated. If not provided, all link types will be used.',
'limit' => 'The number of links to be processed in each queue task.',
),
);
return $items;
}
function drush_xmlsitemap_regenerate() {
module_load_include('generate.inc', 'xmlsitemap');
timer_start('xmlsitemap_regenerate');
xmlsitemap_run_unprogressive_batch('xmlsitemap_regenerate_batch');
$vars = array(
'@timer' => timer_read('xmlsitemap_regenerate'),
'@memory-peak' => format_size(memory_get_peak_usage(TRUE)),
);
drush_print(dt('XML sitemap files regenerated in @timer ms. Peak memory usage: @memory-peak.', $vars));
}
function drush_xmlsitemap_rebuild() {
module_load_include('generate.inc', 'xmlsitemap');
$types = xmlsitemap_get_rebuildable_link_types();
if ($option_types = drush_get_option('types', '')) {
$option_types = explode(',', $option_types);
if ($invalid_types = array_diff($option_types, $types)) {
drush_set_error(dt('The following link types are invalid: @types', array(
'@types' => implode(', ', $invalid_types),
)));
}
$types = array_intersect($types, $option_types);
}
if (empty($types)) {
return drush_log(dt('No link types are rebuildable.'), 'warning');
}
timer_start('xmlsitemap_rebuild');
xmlsitemap_run_unprogressive_batch('xmlsitemap_rebuild_batch', $types, TRUE);
$vars = array(
'@timer' => timer_read('xmlsitemap_rebuild'),
'@memory-peak' => format_size(memory_get_peak_usage(TRUE)),
);
drush_print(dt('XML sitemap files rebuilt in @timer ms. Peak memory usage: @memory-peak.', $vars));
}
function drush_xmlsitemap_index() {
$limit = (int) drush_get_option('limit', variable_get('xmlsitemap_batch_limit', XMLSITEMAP_BATCH_LIMIT));
$count_before = db_query("SELECT COUNT(id) FROM {xmlsitemap}")
->fetchField();
module_invoke_all('xmlsitemap_index_links', $limit);
$count_after = db_query("SELECT COUNT(id) FROM {xmlsitemap}")
->fetchField();
if ($count_after == $count_before) {
drush_print(dt('No new XML sitemap links to index.'));
}
else {
drush_print(dt('Indexed @count new XML sitemap links.', array(
'@count' => $count_after - $count_before,
)));
}
}
function drush_xmlsitemap_queue_rebuild() {
module_load_include('generate.inc', 'xmlsitemap');
$types = xmlsitemap_get_rebuildable_link_types();
if ($option_types = drush_get_option('types', '')) {
$option_types = explode(',', $option_types);
if ($invalid_types = array_diff($option_types, $types)) {
drush_set_error(dt('The following link types are invalid: @types', array(
'@types' => implode(', ', $invalid_types),
)));
}
$types = array_intersect($types, $option_types);
}
if (empty($types)) {
return drush_log(dt('No link types are rebuildable.'), 'warning');
}
xmlsitemap_rebuild_clear($types, TRUE);
$link_count = 0;
$chunk_count = 0;
$chunk_size = (int) drush_get_option('limit', variable_get('xmlsitemap_batch_limit', XMLSITEMAP_BATCH_LIMIT));
foreach ($types as $type) {
$info = xmlsitemap_get_link_info($type);
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', $type);
$query
->entityCondition('entity_id', 0, '>');
$query
->addTag('xmlsitemap_link_bundle_access');
$query
->addTag('xmlsitemap_rebuild');
$query
->addMetaData('entity', $type);
$query
->addMetaData('entity_info', $info);
if ($bundles = xmlsitemap_get_link_type_enabled_bundles($type)) {
$query
->entityCondition('bundle', $bundles, 'IN');
}
else {
continue;
}
$results = $query
->execute();
if (!empty($results[$type])) {
$ids = array_keys($results[$type]);
$link_count += count($ids);
$chunks = array_chunk($ids, $chunk_size);
$chunk_count += count($chunks);
foreach ($chunks as $chunk) {
xmlsitemap_link_enqueue($type, $chunk);
}
}
}
if ($link_count) {
drush_log(dt('Queued @link_count links for rebuild processing in the xmlsitemap_link_process (in @chunk_count chunks of up to @chunk_size links each).', array(
'@link_count' => $link_count,
'@chunk_count' => $chunk_count,
'@chunk_size' => $chunk_size,
)), 'success');
}
else {
drush_log(dt('No links to queue for rebuild processing.'), 'ok');
}
variable_set('xmlsitemap_rebuild_needed', FALSE);
}