Обновить alias документов через catalogfill

Добрый день. Как можно массово изменить (обновить) alias у документов через catalogfill, чтобы он сгенерировал alias по своему и изменил url документов.

А чем вас функция imp_autoalias не устроила?

//автоматически генерировать псевдоним (alias) при импорте
//false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
$cf_config['imp_autoalias'] = true;

Через нее обновляется у меня так: alias меняется в админке, а url у страницы не меняется. Только если зайдешь на страницу через админку и нажмешь сохранить, тогда меняется url.

а у вас никаких дурацких SEO плагинов не установлено?
Типа stricturls и тп?
По умолчанию должно простое обновление кеша помогать. Попробуйте зайти в управление ->очистить кеш -> обновить uri.

URI попробовал обновить, не помогло.

Плагинов нет, но у меня доработана сама генерация alias в файле настроек импорта. Может в этом дело. Вот такое у меня там есть:

//функция для фильтрации значений при ИМПОРТЕ
function filter_import($value_arr){
    $output_arr = $value_arr;
    
    if(isset($output_arr['content']))
        $output_arr['content']['alias'] = $output_arr['content']['alias'].'-'.$output_arr['tv']['5'];
        $output_arr['content']['pub_date'] = strtotime($output_arr['content']['pub_date']);
    return $output_arr;
}

Это сделано для уникализации урлов при одинаковых заголовках.

@CIAO нет, с функцией проблем нет.

У вас товары документы modx? Как вы проверяете, что у вас урл не обновился? Папку с кешем удаляете после загрузки?

Что выводится, когда на новой странице вызываете [[~123]] , где 123 id одного из загруженных доков?

Да, все страницы это стандартные документы modx. На сайте сейчас около 50 тыс. страниц.

Проверяю обычно, просто смотрю, что в админке в поле alias написан один адрес сгенерированный catalogfill, а при нажатии на кнопку "просмотреть" переходишь на другой адрес, тот который сгенерировала система. Например, в админке есть в поле alias нижнее подчеркивание, а на самом деле его нет в фактическом адресе страницы. А вот если нажму в админке "Сохранить", то в строке alias меняется написание, на то как генерирует modx и это нижнее подчеркивание удаляется.

Папку с кэшем не удалял, сейчас удалил, не помогло.

При вызове [[~123]] выводится адрес страницы, который сгенерировала система, то есть не тот который перезалил сейчас через catalogfill и написан в поле alias.

Идеально было бы сделать, чтобы catalogfill генерировал адреса такие же как и система modx, это очень нужно, может кто-нибудь делал такую синхронизацию?

Проблема в том, что catalogfill так и работает. Он перезаписывает alias, а modx из него формирует ссылку.
Поэтому сложно представить то, что вы описываете.

Предположу только, что у вас какое-то жесткое кеширование где-то настроено, ну или вы открыли страницу с каталогом, потом оновляете алиас и не обновив страницу каталога пытаетесь открыть документ.

Еще попробуете отключить cache_alias_map, обновить кеш и из админки открыть документ.

@slaad и отключите friendly_alias_realtime - поставьте нет

@slaad должно быть:
automatic_alias Да
friendly_alias_realtime Нет

это в системных настройках

automatic_alias Да
friendly_alias_realtime Нет
так и было

cache_alias_map поставил нет, обновил, не помогло, все по прежнему.

Так catalogfill должен генерировать такие же alias, как и система? Это у меня, что-то не так? Например, у меня catalogfill, может ставить нижнее подчеркивание и двойной дефис, а система так не делает.

@CIAO Нет, catalogfill не будет генерить такие же alias как система.
Но сгенерированные alias должны работать и ссылки будут открываться. Т.е. должно работать [[~123]]

Если вам нужно один в один, как генерит modx, то делайте с помощью filter_import($value_arr)

Блин, по всему сайту сейчас поменялись урлы, убрались нижние подчеркивания и т.д., то вроде было, только одному разделу, но может я ошибаюсь. Сейчас будет куча 404 ошибок и потеря поискового трафика. Почему же так сделали, чтоб catalogfill генерировал урлы отличные от системы, не понятно.

К сожалению, я не знаю, как можно привести генерацию урлов к едниному виду через filter_import($value_arr).

Неужели, раньше этот вопрос никого не интересовал.

@CIAO
Ну так стоит разбираться в том что делаете прежде чем делать. И никогда на боевом не делайте ничего без сохранения.

Рекомендую следующее

  1. Откатите систему.

  2. Сделайте локальный тестовый вариант openserver, например

  3. Загрузите с помощью catalogfill и определите в чем отличия.

  4. Залезьте в \core\components\catalogfill\model\catalogfill.class.php

Функция makeAlias и поправьте как вам нужно:

    public function makeAlias($str){
        $str = mb_strtolower($str, mb_detect_encoding($str));
        $str = strtr($str, 
            array(
                " "=>"-", "."=>"_", ","=>"", "$"=>"", "?"=>"", "!"=>"", "\""=>"", "'"=>"", "/"=>"",
                "\\"=>"", "("=>"", ")"=>"", "{"=>"", "}"=>"", "["=>"", "]"=>"", "+"=>"p", "&"=>"",
                "?"=>"", "!"=>"", "«"=>"", "»"=>"", "%"=>""
            )
        );
        if($this->config['imp_autoalias'] !== 'notranslit'){
          $str = strtr($str, 
              array(
                  "а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"zh","з"=>"z",
                  "и"=>"i","й"=>"y","к"=>"k","л"=>"l","м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
                  "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch",
                  "ь"=>"","ъ"=>"","ы"=>"y","э"=>"e","ю"=>"yu","я"=>"ya"
              )
          );
        }
        return $str;
    }
    
  1. Чтобы в будущем каждый раз при обновлении catalogfill не лезть в эту функцию, разберитесь как править через filter_import($value_arr).

  2. Разберитесь как настроить redirect в htaccess. Вам это еще много нервов сэкономит в будущем.

Кстати, Андрей, вынесите, пожалуйста, функцию makeAlias в конфиг или сделеайте возможность ее поменять/расширить. Не первый раз такие вопросы встречаются.

Спасибо, буду пробовать. А можно посмотреть такой же скрипт правил генерации псевдонима в самой системе и там сравнить? Может знаете, где он находится?

@CIAO
скорее всего core\components\translit\model\modx\translit\tables\russian.php

и настройки


friendly_alias_restrict_chars_pattern
/[\0\x0B\t\n\r\f\a&=+%#<>"~:`@\?[]\{\}\|\^'\]/
—
 friendly_alias_strip_element_tags
Да
—
 
friendly_alias_translit
russian
 

friendly_alias_translit_class
modx.translit.modTransliterate

 

friendly_alias_trim_chars
/.-_
—
 

friendly_alias_word_delimiter
-
—
 

friendly_alias_word_delimiters
-_
—
 

@slaad Отдельно спасибо за подсказку с настройкой редиректов в htaccess. Настроил все через регулярку как надо.

Почему же так сделали, чтоб catalogfill генерировал урлы отличные от системы, не понятно.

Для увеличения производительности. При импорте большого числа товаров это очень важно.

Появилась похожая проблема. Правда, в моем случае "обновить uri-ссылки" не работала и зависала с надписью "подождите..."

Система была настроена на генерацию псевдонимов без вложенности.
При импорте создавались документы с нужными алиасами, но они были доступны по ссылкам с вложенной структурой. Чтобы они заработали без вложенности, нужно было или зайти в этот документ и нажать кнопку "сохранить", или же в site_content изменить uri на нужный. Т. е. uri генерировались с вложенностью

Решил данную проблему так:
В файле core/components/catalogfill/model/catalogfill.class.php поменял:

//$output = $this->config['parent_paths'][$fields['parent']].$fields['alias'].$this->config['extension'];
          $output = $fields['alias'].$this->config['extension'];

Выглядит это явным костылем, и вероятно на какой-то стадии скрипт не понимает, что в замороженный урл, не нужно вставлять вложенный, но дальше копать не стал.
Если знаете, как решить эту проблему более красивым способом - подскажите)

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.