Что бы увидеть email и телефон, включите JavaScript.

Редиректы в MODX Revolution - небольшой плагин


Клиенту потребовался, нормально работающий редирект, с возможностями самому их ставить. При этом он уже ранее использовал расширение Redirect, autoRedirect и CustomURL. При желании Вы, сможете все их найти в репозитории MODX. На вопрос, чем они не устраивают, клиент ответил: "Они все со временем перестают работать. Перестают делать редирект."

Внесены изменения - подробнее в конце статьи.

Ну что же, как говориться, клиенту доверяй, но проверяй. И правда, зайдя на сайт клиента и попробовав работоспособность расширений, выяснилось, что редиректов нет. То есть, каждое расширение работает, в панели администратора, устанавливается без ошибок, но вот перенаправления нет.

Можно было бы покопаться, поискать, где порылся, лучший друг человека, но не в рамках оговоренного бюджета. Так как, я бы потратил кучу времени на это дело. А, ведь вокруг столько интересного и нужного, что можно поделать и за что тебе дадут билеты банка России. В общем, не стал заморачиваться, как говориться чужой код потемки и лезть туда не смей, ну если нет должной мотивации.

Когда-то давным-давно, когда деревья были большими, я что-то подобное делал для какого-то клиента, но на MODX Evolution. А, я сущность хозяйственная и всё, так сказать в дом, точнее в папочки на свой накопитель. Специально использовал слово накопитель, ибо накопил там уже много разных ништяков, в виде файликов, в которых есть интересные решения той или иной задачи. Ну да, отвлёкся, наша цель редирект для MODX Revolution, спонсором данного предложения, стала местная банда SEOшников, в моём лице.

Редирект для MODX Revolution

Создаём плагин, как назвать, ну я назвал Redirect, кэп с Вами, други! Затем идем на вкладку "Системные события" и, о, как неожиданно да, ставим галку в событии OnPageNotFound. Не забываем сохранить.

Код самого плагина:

 
$mapChunk = $modx->getChunk('mapRedirect');
    $mapLines = explode("\n",$mapChunk);
    $mapArr = array();
    foreach($mapLines as $line) {
        list($link,$redirectId) = explode('||',$line);
        $mapArr[$link] = $redirectId;
    }
    $q = $_SERVER['REQUEST_URI'];
    if(isset($mapArr[$q])) {
        if(is_numeric($mapArr[$q])){
            $url = $modx->makeUrl($mapArr[$q]);
            $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
        }else{
            $url = $mapArr[$q];
            $url = 'Location: '.$url;
            header($url,true, 301);
        }
    }

Как Вы, уже заметили в коде я вызваю чанк mapRedirect, кэп все еще с Вами, это именно карта редиректов, создаём его. И уже в нём заносим всё редиректы, которые нам нужны в следующем формате:

<урл с которого редирект>||<урл или ID ресурса куда должен вести редирект>

Да, да, я не ошибся урл или ID ресурса, видели is_numeric, вот тут и происходит магия. Определяет цифра или нет, ну и дальше уже генерирует урл через makeURL или просто использует то, что там есть.

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

Собственно, на этом всё. Успеха и отличного настроения, Вам!

П.С. Доработал, теперь работает не только с ID ресурса, но и URL (важно, урл куда идёт перенаправление, должен быть полным)

Теги материала: MODX Revolution PHP Дополнения
Понравилась статья, поделитесь ей с друзьями!
RSS подписка по электронной почте


коммент.

avatar

Роман

- 25 ноября 2019, 16:58
Приветствую, спасибо за плагин. Скажите пожалуйста, а как его изменить, плагин.
Что бы ссылки на редиректы собирались из папки, и редирект делался со страниц на поддомены?

Ваш плагин работает, но пока руками вписываю, сделал его на событие OnHandleRequest
И прописываю /pages/page1/||http://page1.sute.ru

Все работает, поддомены у меня создаются другим плагином. И страницы по ним доступны, но вот они доступны и по старому URL вот с него и хочу сделать редирект.

Вот код плагина который делает поддомены

if(!$docs = $modx->getCollection('modResource', array(
'parent' => 15,
'published' => 1,
'deleted' => 0,
'searchable' => 1
))){return;}

$domains = [];
foreach ($docs as $doc) {
$domains[$doc->get('alias').'.sute.ru'] = $doc->get('id');
}

switch ($modx->event->name) {
case 'OnHandleRequest':
if (array_key_exists($_SERVER['HTTP_HOST'], $domains)) {
$modx->config['site_start'] = $domains[$_SERVER['HTTP_HOST']];
}
break;
case 'OnPageNotFound':
if (array_key_exists($_SERVER['HTTP_HOST'], $domains)) {
$subdomain = array_shift(explode('.', $_SERVER['HTTP_HOST']));
if ($id = $modx->findResource($subdomain.$_SERVER['REQUEST_URI'], 'web')) {
$modx->sendForward($id);
}
}
break;
}

Вот как бы ваш плагин теперь автоматизировать для режиректов страниц на поддомены из папки с id 15?

avatar

Роман

- 25 ноября 2019, 17:34
Поменял в вашем плагине это

$mapChunk = $modx->getChunk('mapRedirect');
$mapLines = explode("\n",$mapChunk);
$mapArr = array();
foreach($mapLines as $line) {
list($link,$redirectId) = explode('||',$line);
$mapArr[$link] = $redirectId;
}

на это

if(!$docs = $modx->getCollection('modResource', array(
'parent' => 15,
'published' => 1,
'deleted' => 0,
'searchable' => 1
))){return;}
foreach($docs as $doc) {
$mapArr[$modx->makeUrl($doc->get('id'))] = 'http://'.$doc->get('alias').'.site.ru';
}

распечатал результат, должно работать, но не работает :(
avatar

BSamedi

- 26 ноября 2019, 03:45
Доброго времени суок, Роман! А у Вас схема генерации ссылок какая стоит полная или по дефолту которая?
avatar

Роман

- 26 ноября 2019, 04:15
По дефолту думаю, а как иначе? Вот если руками редиректы прописывать в чанке работает, а если автоматом собирать, нет :( думаю дело в OnHandleRequest так как оба плагина подвешены на одно это событие, и тот что поддомены из страниц делает, и вам, думаю нужно объединять. Что бы последовательно работали.
avatar

BSamedi

- 26 ноября 2019, 15:57
Ниже
avatar

BSamedi

- 26 ноября 2019, 15:58
А можно весь код, который у Вас получился увидеть.
avatar

Роман

- 26 ноября 2019, 16:01
Нет, только заменил формирование списка страниц с редиректами, вместо чанка автоматом

if(!$docs = $modx->getCollection('modResource', array(
'parent' => 15,
'published' => 1,
'deleted' => 0,
'searchable' => 1
))){return;}

foreach($docs as $doc) {
$mapArr[$modx->makeUrl($doc->get('id'))] = 'http://'.$doc->get('alias').'.site.ru';
}

/* $mapChunk = $modx->getChunk('mapRedirect');
$mapLines = explode("\n",$mapChunk);
$mapArr = array();
foreach($mapLines as $line) {
list($link,$redirectId) = explode('||',$line);
$mapArr[$link] = $redirectId;
} */

$q = $_SERVER['REQUEST_URI'];
if(isset($mapArr[$q])) {
if(is_numeric($mapArr[$q])){
$url = $modx->makeUrl($mapArr[$q]);
$modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}else{
$url = $mapArr[$q];
$url = 'Location: '.$url;
header($url,true, 301);
}
}

Написать комментарий

Ваш email не будет опубликован. Обязательные поля отмечени символом *