Обновление дубликатов страниц (duplicate_updater_modx)

Может кому пригодится, написал скриптец для поиска дублей страниц и обновления последних путем добавление префикса +=1

Инструкция залить duplicate_updater_modx.php в корень сайта и запустить в браузере yousute.ru/duplicate_updater_modx.php
git: github.com/vectorserver/duplicate_updater_modx

Сам код:
<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 25.06.2019
 * Time: 14:19
 */


define('MODX_API_MODE', true);
require 'index.php';

$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');

$msg = "";

$table_prefix = $modx->config['table_prefix'];

//Ищем двойников
$find_query = $modx->query("SELECT group_concat(`id`) ids, count(id) c FROM `" . $table_prefix . "site_content` GROUP by concat(uri) HAVING c > 1");

$dubles = $find_query->fetchAll(PDO::FETCH_ASSOC);
//Если нашли
if (count($dubles)) {
    foreach ($dubles as $item) {
        //Разбивем ID
        $ids = explode(",", $item['ids']);
        //Сортируем - старые вверх
        sort($ids, SORT_NUMERIC);

        $count = 0;

        foreach ($ids as $doc_id) {
            $count++;
            //ПРопускаем оригинал
            if ($count > 1) {

                //Обновляем ресурс
                $originalRes = $modx->getObject('modResource', $doc_id);
                $generated = $originalRes->cleanAlias($originalRes->get('pagetitle')) . "-" . $count;
                $originalRes->set('alias', $generated);
                $originalRes->save();
                //В лог
                $msg .= $originalRes->get('id') . " | " . $originalRes->get('pagetitle') . " - обновлен.\n";
            }

        }
        //Сброрс кеша
        $modx->cacheManager->refresh();
    }

} else {
    $msg .= "Дублей нет\n";
}

echo "<pre>" . $msg;
vectorserver
25 июня 2019, 12:33
modx.pro
11
1 289
+7
Поблагодарить автора Отправить деньги

Комментарии: 3

Павел Степанов
07 июля 2019, 16:57
0
Подскажите, а в чем смысл данного скрипта?
    iWatchYouFromAfar
    07 июля 2019, 19:39
    0
    Ищет ресурсы-дубликаты в алиасе и генерит новый алиас для ресурсов-дубликатов, если таковые есть.
    Сергей Лим
    15 апреля 2024, 11:30
    0
    Код выше уже устаревший и не сработает на новых версиях modx. Ниже рабочий код для 2.8.4

    <?php
    /**
     * Created by PhpStorm.
     * User: admin
     * Date: 25.06.2019
     * Time: 14:19
     */
    
    
    require_once '/ТУТ ПУТЬ К ФАЙЛУ ПИШЕМ/public_html/config.core.php';
    require_once MODX_CORE_PATH.'model/modx/modx.class.php';
    $modx = new modX();
    $modx->initialize('web');
    $modx->getService('error','error.modError', '', '');
    
    $modx->getService('error', 'error.modError');
    $modx->setLogLevel(modX::LOG_LEVEL_FATAL);
    $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
    
    $msg = "";
    
    $table_prefix = $modx->config['table_prefix'];
    
    //Ищем двойников
    $find_query = $modx->query("SELECT group_concat(`id`) ids, count(id) c FROM `" . $table_prefix . "site_content` GROUP by concat(uri) HAVING c > 1");
    
    $dubles = $find_query->fetchAll(PDO::FETCH_ASSOC);
    //Если нашли
    if (count($dubles)) {
        foreach ($dubles as $item) {
            //Разбивем ID
            $ids = explode(",", $item['ids']);
            //Сортируем - старые вверх
            sort($ids, SORT_NUMERIC);
    
            $count = 0;
    
            foreach ($ids as $doc_id) {
                $count++;
                //ПРопускаем оригинал
                if ($count > 1) {
    
                    //Обновляем ресурс
                    $originalRes = $modx->getObject('modResource', $doc_id);
                    $generated = $originalRes->cleanAlias($originalRes->get('pagetitle')) . "-" . $count;
                    $originalRes->set('alias', $generated);
                    $originalRes->save();
                    //В лог
                    $msg .= $originalRes->get('id') . " | " . $originalRes->get('pagetitle') . " - обновлен.\n";
                }
    
            }
            //Сброрс кеша
            $modx->cacheManager->refresh();
        }
    
    } else {
        $msg .= "Дублей нет\n";
    }
    
    echo "<pre>" . $msg;
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3