Если вы решили изменить способ построения ЧПУ у ваших ресурсов, то вам может потребоваться сгенерировать новый псевдоним
, он же alias
для всех старых ресурсов.
Это можено сделать вручную: открыть каждый ресурс, очистить поле "псевдоним" и сохранить ресурс. Работает. Но если на сайте более 10 страниц, то нужен автоматизированный способ, который я представляю в этой заметке.
Последовательность работы сниппета
- Убираем ограничение на время выполнение скрипта
- Делаем выборку ресурсов. Некотоыре блоки кода закомментированы и оставлены для того чтобы упростить настройку выборки
- В цикле проходим по коллекции выбраных ресурсов
-
Генерируем новый 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);
- Можно стереть старый алиас
- Создаем редирект, если обновление ресурса через процессор
resource/update
прошло успешно. Для создания редиректа используем API пакета autoRedirector - Выводим результат таблицу для наглядного отображения результа
Код сниппета для генерации 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)
Не писать ответ