Внесены изменения - подробнее в конце статьи.
Ну что же, как говориться, клиенту доверяй, но проверяй. И правда, зайдя на сайт клиента и попробовав работоспособность расширений, выяснилось, что редиректов нет. То есть, каждое расширение работает, в панели администратора, устанавливается без ошибок, но вот перенаправления нет.
Можно было бы покопаться, поискать, где порылся, лучший друг человека, но не в рамках оговоренного бюджета. Так как, я бы потратил кучу времени на это дело. А, ведь вокруг столько интересного и нужного, что можно поделать и за что тебе дадут билеты банка России. В общем, не стал заморачиваться, как говориться чужой код потемки и лезть туда не смей, ну если нет должной мотивации.
Когда-то давным-давно, когда деревья были большими, я что-то подобное делал для какого-то клиента, но на 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 (важно, урл куда идёт перенаправление, должен быть полным)
Роман
- 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?
Роман
- 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';
}
распечатал результат, должно работать, но не работает :(
BSamedi
- 26 ноября 2019, 03:45 0 ↑ ↓Роман
- 26 ноября 2019, 04:15 0 ↑ ↓BSamedi
- 26 ноября 2019, 15:57 0 ↑ ↓BSamedi
- 26 ноября 2019, 15:58 0 ↓Роман
- 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);
}
}