[MODx] Обновить alias (псевдоним) у всех ресурсов

Если вы решили изменить способ построения ЧПУ у ваших ресурсов, то вам может потребоваться сгенерировать новый псевдоним, он же alias для всех старых ресурсов.

Это можено сделать вручную: открыть каждый ресурс, очистить поле "псевдоним" и сохранить ресурс. Работает. Но если на сайте более 10 страниц, то нужен автоматизированный способ, который я представляю в этой заметке.

Последовательность работы сниппета

  1. Убираем ограничение на время выполнение скрипта
  2. Делаем выборку ресурсов. Некотоыре блоки кода закомментированы и оставлены для того чтобы упростить настройку выборки
  3. В цикле проходим по коллекции выбраных ресурсов
  4. Генерируем новый alias методом $resource->cleanAlias($title)

    Тут стоит заметить, что есть еще несколько способов указать системе на генерацию нового alias:

    • Можно стереть старый алиас $resource->set('alias', '') и черех процессор $modx->runProcessor('resource/update', $resource); сгенерировать новый алиас для ресурса. Процессор корректно отреагирует на пустую строку.
    • Если вы хотите просто где-то в коде, или в консоле вызвать метод генерации alias (транслитизации по заданым настройкам), то статичный метод modResource::filterPathSegment($modx, $alias); вам в пригодится
      Можно еще вот так, если почему-то не работает предыдущий вариант
      $res = $modx->newObject('modResource');
      $res->cleanAlias($alias);
  5. Создаем редирект, если обновление ресурса через процессор resource/update прошло успешно. Для создания редиректа используем API пакета autoRedirector
  6. Выводим результат таблицу для наглядного отображения результа
Важно! Соблюдайте технику безопасности — создайте резервную копию базы данных перед выполнением массовых преобразований!

Код сниппета для генерации alias

ini_set('max_execution_time', 0);
//ignore_user_abort(true);

$q = $modx->newQuery('modResource');
// Если нужно сделать выборку по TV
// $q->leftJoin('modTemplateVarResource', 'TV1', 'modResource.id = TV1.contentid AND TV1.tmplvarid = 5');
// $q->leftJoin('modTemplateVarResource', 'TV2', 'modResource.id = TV2.contentid AND TV2.tmplvarid = 4');

// Если нужно применить ко всем ресурсам на сайте, то условие where можно отключить полностью
$q->where(array(
  // Если нужно сделать выборку по TV
  // 'TV1.value' => 'promo',
  // 'AND:TV2.value:NOT LIKE' => 'rus',
  'modResource.parent:IN' => array(175),
  ));
echo "<table style='width:100%'>";
foreach($modx->getCollection('modResource', $q) as $resource){
  echo "<tr>";
  $old_uri = $resource->get('uri'); // Понадобится для редиректа
  
  // Определяем новый Alias
  $title = $resource->get('pagetitle') . '-' . $resource->get('id');
  $new_alias = $resource->cleanAlias($title);
  $resource->set('alias', $new_alias);
  
  $response = $modx->runProcessor('resource/update', $resource->toArray());
  if($response->isError()){
    echo "<td>С обновлением ресорса проблемы проблемы:<pre>";
    print_r($response_ar->getResponse(). true);
    echo "</pre></td>";
    return;
  }else{
    echo "<td>Ок! ".$resource->get('id')." </td>";
    echo "<td> ".$new_alias." </td>";
    
    // Если все прошло успешно, то делаем редирект со старой страницы не новую, используя дополнение autoRedirector
    
    // Подключаем autoRedirector
    $modelPath = $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'model/';
    $modx->addPackage('autoredirector', $modelPath);
    $processorProps = array('processors_path' => $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'processors/');
     
    // Создаем правило перенаправления
    $arRule = array('uri' => $old_uri, 'res_id' => $resource->get('id'));
    
    if (!$modx->getObject('arRule', $arRule)) {
      $response_ar = $modx->runProcessor('mgr/item/create', $arRule, $processorProps);
      if($response_ar->isError()){
        echo "<td> С редиректом проблемы:<pre>";
        print_r($response_ar->getResponse(). true);
        echo "</pre></td>";
        return;
      }else{
        echo "<td> Редирект создан </td>";
      }
    }else{
        echo "<td> Такое правило уже есть </td>";
    }
  }
  $modx->error->reset();
  echo "</tr>";
}
echo "</table>";

Комментарии (0)

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

Похожие статьи

Наш сайт использует куки, нажмите «ОК» если вы не против
OK