Что бы увидеть 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 подписка по электронной почте


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

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

    Ваш плагин работает, но пока руками вписываю, сделал его на событие 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?

    1. Роман 25 ноября 2019, 17:34 # 0
      Поменял в вашем плагине это

      $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';
      }

      распечатал результат, должно работать, но не работает :(
      1. BSamedi 26 ноября 2019, 03:45 # 0
        Доброго времени суок, Роман! А у Вас схема генерации ссылок какая стоит полная или по дефолту которая?
        1. Роман 26 ноября 2019, 04:15 # 0
          По дефолту думаю, а как иначе? Вот если руками редиректы прописывать в чанке работает, а если автоматом собирать, нет :( думаю дело в OnHandleRequest так как оба плагина подвешены на одно это событие, и тот что поддомены из страниц делает, и вам, думаю нужно объединять. Что бы последовательно работали.
          1. BSamedi 26 ноября 2019, 15:57(Комментарий был изменён) # 0
            Ниже
      2. BSamedi 26 ноября 2019, 15:58 # 0
        А можно весь код, который у Вас получился увидеть.
        1. Роман 26 ноября 2019, 16:01 # 0
          Нет, только заменил формирование списка страниц с редиректами, вместо чанка автоматом

          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);
          }
          }