Доброго времени суток, по работе появилась задача сделать массовое сео по сайту в проде по шаблону:
для страницы с "таким шаблоном" в 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,'➤')){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,'➤')){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 но знаний по нему не хватает.
Помогите эту хрень заставить работать.