1. I don't know if AjaxSearch will search additional custom tables or not, and it's not clear if you need it to.
1A and 2 - I think the Peoples snippet will do these for you.
3. Yes, getResources or pdoResources should do that fine using &sortby=`RAND()` and &limit=`2`.
Creating a resource for each user when they register (with Subscribe or the Register snippet) is relatively easy in a plugin attached to OnUserActivate.
The $user variable is available in the plugin, so you can get any user fields you want, and you can get profile fields with this:
$profile = $user->getOne('Profile');
By luck, I've just done this for a client. The code looks something like this:
<?php
/* Attach to OnUserActivate System Event */
$profile = $user->getOne('Profile');
$fullName = $profile->get('fullname');
$pagetitle = $fullName;
$parentId = 12; /* ID of parent container */
$template = 5; /* ID of page template */
$fields = array(
'parent' => $parentId,
'pagetitle' => $pagetitle,
'menutitle' => $fullname,
'longtitle' => '',
'introtext' => '',
'published' => '1',
'hidemenu' => '1',
'cacheable' => '1',
'searchable' => '0',
'template' => $template,
);
/* Make sure it doesn't exist already */
$resource = $this->modx->getObject('modResource', array('pagetitle' => $pagetitle));
if (! $resource) {
$resource = $this->modx->newObject('modResource');
$resource->fromArray($fields);
$resource->setContent($modx->getChunk('ResourceContent');
$resource->set('alias', $resource->cleanAlias($pagetitle));
if (! $resource->save()) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Could not save resource');
}
}
$modx->reloadContext('web');
return;
Create a Tpl chunk called ResourceContent for the page content.