@Ilya12345

Seo php + mysql Modx?

Доброго времени суток, по работе появилась задача сделать массовое сео по сайту в проде по шаблону:
для страницы с "таким шаблоном" в cms и категорией, то сделать генерируемый заголовок по шаблону из экселя.
В полу ручном режиме сделал задачу получилось, 6000+ записей, для одного из городов.
Далее мне сказали сделать то же самое с другими городами. (Если бы сказали сразу сделал бы все сразу).
Прошлую задачу я делал неделю.
До дедлайна 2 дня. Единственное логичное решение продублировать контент со сделанных страниц на те, которые ещё не готовы.
Шаблон генерирования title и description один и тот же по сути.
И тут я глянул на количество неготовых записей, их более 230+ тысяч.
Вот код который я использовал:
<?php
ini_set("memory_limit", "4012M");
function sear($text,$word){
$pos = strpos($text, $word);
if ($pos === false) {
    return false;
} else {
    return true;
} 
return false;
}
$sql = "
SELECT id,type,contentType,pagetitle,longtitle,alias,isfolder,template,class_key,content_type,uri FROM modx_site_content WHERE context_key <> 'contname' and context_key <> 'web' and template <> 172 and template <> 136 and template <> 138 and template <> 169 and template <> 148 and template <> 142 and template <> 0 and template <> 145 and template <> 135 and template <> 70 and template <> 38 and template <> 13
";
$sql1 = "SELECT id,type,contentType,pagetitle,longtitle,alias,isfolder,template,class_key,content_type,uri FROM modx_site_content WHERE context_key = 'contname' and template <> 172 and template <> 136 and template <> 138 and template <> 169 and template <> 148 and template <> 142 and template <> 0 and template <> 145 and template <> 135 and template <> 70 and template <> 38 and template <> 13"; //Выборка готовых полей
$statement = $modx->query($sql);
$out = $statement->fetchAll(PDO::FETCH_ASSOC);
$stat = $modx->query($sql1);
$ouo = $stat->fetchAll(PDO::FETCH_ASSOC);
foreach ($ouo as $ou){
    foreach ($out as $data) {
if($data['type'] === $ou['type'] and
$data['contentType'] === $ou['contentType'] and $data['pagetitle'] === $ou['pagetitle'] and $data['longtitle'] === $ou['longtitle'] and $data['alias']=== $ou['alias'] and $data['isfolder']=== $ou['isfolder'] and $data['template'] === $ou['template'] and $data['class_key'] === $ou['class_key'] and $data['content_type'] === $ou['content_type'] and $data['uri'] === $ou['uri']){
    $res1 = $modx->getObject('modResource',intval($ou['id']));
    $t1 = $res1->getTVValue('MetaTitle');
    $d1 = $res1->getTVValue('MetaDescription');
    if(!sear($t1,'&#10148')){continue;} ////Если тайтл вообще есть
    $res2 = $modx->getObject('modResource',intval($data['id']));
    $t2 = $res2->getTVValue('MetaTitle');
    $d2 = $res2->getTVValue('MetaDescription');
    if($t1 === $t2 and $d1 === $d2){continue;} //Если ещё не отредактирован
    if(sear($t2,'&#10148')){continue;} //Если ещё не отредактирован
    $t1 = str_replace('[[!++city_name2]]','[[!++city_name_2]]',$t1);
    $d1 = str_replace('[[!++city_name2]]','[[!++city_name_2]]',$d1);
    $res2->setTVValue('MetaTitle',$t1);
    $res2->setTVValue('MetaDescription',$d1);
    $res2->save();
}
}
}
die;


Логика кода простая:
  • первый цикл проходит по 200 000+ записям;
  • второй цикл внутри первого проходит по обработанным 6000+ записям;
  • далее сравнивает что-бы ресурсы были идентичны с точки зрения CMS;
  • далее он проверяет чтоб записи небыли идентичны;
  • далее он проверяет чтобы в полученной записи не было триггера "➤";
  • и редактирует если все условия соблюдены;

Если вы не знакомы с Modx то эта cms хранит доп поля переменных (в моем случае MetaTitle и MetsDescription) в отдельной таблице SQL, доступ к которой осуществляеться через api:
$res1 = $modx->getObject('modResource',intval($ou['id']));
 $t1 = $res1->getTVValue('MetaTitle');
  $d1 = $res1->getTVValue('MetaDescription');


Он обработал уже более 27 253 записи. Далее он просто кладёт сайт и подвисает и не работает видимо из за утечки памяти.
Доступа к админ панели хостинга у меня нет.
В глубине души я понимаю что можно это сделать на чистом SQL но знаний по нему не хватает.
Помогите эту хрень заставить работать.
  • Вопрос задан
  • 111 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы