Периодически бывает задача скопировать каталог с одного сайта на другой. Если сайт «чистый», то можно пойти копированием таблиц. А вот если на сайте реципиенте есть уже какая-то структура, если ID идут вразнобой, то тут возникают сложности. Для облегчения жизни написал вот такую вот канитель (не самый оптимизированный вариант, но рабочий)

На сайте доноре в корне создаем файл export.php

Для Evolution CMS
<?php
        define('MODX_API_MODE', true);
        define('IN_MANAGER_MODE', false);       
        include_once("index.php");      
        $modx->db->connect();   
        if (empty ($modx->config)) {
                $modx->getSettings();
        }
        $modx->runSnippet('DocLister',array('parents'=>0,'showParent'=>1,'display'=>-1,'tvPrefix'=>'','tvList'=>'mages,price','depth'=>28,'prepareWrap'=>function($data){echo '$docs = '.var_export($data,1).';';exit();}));

Для MODX Revolution
<?php
header('Content-Type: text/html; charset= utf-8');
define('MODX_API_MODE', true);
require_once($_SERVER['DOCUMENT_ROOT'].'/index.php');
$modx=new modX();
$modx->initialize('web');
echo $modx->runSnippet('pdoResources',array('parents'=>8,'limit'=>0,'return'=>'json','includeContent'=>1,'tvPrefix'=>'','includeTVs'=>'price,image'));

Здесь указываем parents — корневой родитель, который мы качаем, ТВшки, ну и далее по вкусу.

На сайте реципиенте в корне создаем файлик import.php

Для Evolution CMS
<?php
        set_time_limit(0);
        define('MODX_API_MODE', true);
        define('IN_MANAGER_MODE', false);       
        include_once("index.php");      
        $modx->db->connect();   
        if (empty ($modx->config)) {
                $modx->getSettings();
        }
        include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");      
        $file = file_get_contents('https://you_site.com/export.php');   
        eval($file);
        $docs = $docs['docs'];  
        $start = 0;
        $parents[$start] = 33523;       
        
        function form_tree($mess){
                if (!is_array($mess)) {
                        return false;
                }
                $tree = array();
                foreach ($mess as $value) {
                        $tree[$value['parent'[] = $value;
                }
                return $tree;
        }       
        
        function build_tree($cats, $parent_id){
                global $modx,$parents;
                if (is_array($cats) && isset($cats[$parent_id])) {
                        
                        foreach ($cats[$parent_id] as $cat) {
                                $id = $cat['id'];                               
                                unset($cat['id']);
                                /*
                                * здесь можем подменить шаблончики и т.д.
                                */
                                if ($parents[$parent_id]) $cat['parent'] = $parents[$parent_id];
                                $doc = new modResource($modx);  
                                $doc->create($cat);                             
                                $parents[$id] = $doc->save(false, false);                                       
                                build_tree($cats, $id);                         
                        }                       
                        } else {
                        return false;
                }
                return $tree;
        }       
        $tree = form_tree($docs);       
        build_tree($tree, $start);      
        echo 'Import site complete!';

Для MODX Revolution
<?php
	header('Content-Type: text/html; charset= utf-8');
	define('MODX_API_MODE', true);
	require_once($_SERVER['DOCUMENT_ROOT'].'/index.php');
	$modx=new modX();
	$modx->initialize('web');
	$file = file_get_contents('https://you_site.com/export.php');
	$docs = json_decode($file,1);
	$start = 8;
	$parents[$start] = 21161;
	
	function form_tree($mess){
		if (!is_array($mess)) {
			return false;
		}
		$tree = array();
		foreach ($mess as $value) {
			$tree[$value['parent'[] = $value;
		}
		return $tree;
	}	
	
	function build_tree($cats, $parent_id){
		global $modx,$parents;
		if (is_array($cats) && isset($cats[$parent_id])) {
			
			foreach ($cats[$parent_id] as $cat) {
				$id = $cat['id'];				
				unset($cat['id']);
				/*
					* здесь можем подменить шаблончики и т.д.
				*/
				if ($parents[$parent_id]) $cat['parent'] = $parents[$parent_id];
				$resource = $modx->newObject('modResource');
				foreach($cat as $key => $val) $resource->set($key, $val); 
				$parents[$id] = $resource->save();									
				build_tree($cats, $id);				
			}			
			} else {
			return false;
		}
		return $tree;
	}	
	$tree = form_tree($docs);	
	build_tree($tree, $start);	
echo 'Import site complete!';


Здесь указываем сайт, с которого будем копировать, в $start указываем корневой айдишник на сайте доноре, в далее значение в массиве — в какой ресурс копировать.

Проверил на нескольких сайтах — работает.
По окончанию работ не забудьте снести эти файлики)
P.S. В связи с моими хреновыми знаниями ревы мог не учесть различные подводные камни, связанные со связанными таблицами и прочим.