XF 1.5 Is it possible to create new threads using SQL commands?


Well-known member
What I am basically aiming to do is to create a batch of threads from data stored in spreadsheet. I am looking for advice on whether SQL statements can be created that would create multiple threads on running them. I have the content for title and post content stored in cells of a spreadsheet. I mean I can use Excel/Sheets to create custom MySQL Statements that I can run from terminals. I just need to know if it is possible, safe to do. TIA!


XenForo moderator
Staff member
Yes, thread and post data is relatively simple, so inserting records is easily done.


XenForo developer
Staff member
Conversely, I'd never recommend it. There's a ton of other related data (message counts, forum counters). Some can potentially be rebuilt, but I'd always recommend using a PHP script to insert if possible.


Well-known member
That was what I was worried about. Customized PHP script would be fine as well as long as I can batch post multiple threads in one go. Manual is taking way too much time and effort. Though I guess you were talking about the form rendered by XenForo for new threads :p If not, it would be great to get some sample code that I can play with. Thanks!


Well-known member
@OperaManiac, a "some assembly required" script.

Basically, you need to provide a list of messages with the right format, a thread title/post date/user, and the target forum. This is intended as a quick & dirty example, and can't run as-is.


$startTime = microtime(true);
$fileDir = dirname(__FILE__);


require($fileDir . '/library/XenForo/Autoloader.php');
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

$dependencies = new XenForo_Dependencies_Public();

$nodeId = 5; // Current Affairs
$messages = ... go here ...
$title = .. thread title ..
$date = .. thread post date (unix epoc) ..

$forumModel = XenForo_Model::create('XenForo_Model_Forum');
$forum = $forumModel->getForumById($nodeId);
$initialMessage = reset($messages);

/** @var XenForo_DataWriter_Discussion_Thread $threadDw */
$threadDw = XenForo_DataWriter::create('XenForo_DataWriter_Discussion_Thread');
$threadDw->setExtraData(XenForo_DataWriter_Discussion_Thread::DATA_FORUM, $forum);
$threadDw->set('node_id', $forum['node_id']);
$threadDw->set('user_id', $initialMessage['user_id']);
$threadDw->set('username', $initialMessage['username']);
$threadDw->set('title', $title);
$threadDw->set('post_date', $date);
$threadDw->set('discussion_state', 'visible');

$threadMessageDw = $threadDw->getFirstMessageDw();
$threadMessageDw->setOption(XenForo_DataWriter_DiscussionMessage_Post::OPTION_IS_AUTOMATED, true);
$threadMessageDw->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM, $forum);
$threadMessageDw->set('user_id', $initialMessage['user_id']);
$threadMessageDw->set('username', $initialMessage['username']);
$threadMessageDw->set('post_date', $initialMessage['date']);
$threadMessageDw->set('message',  $initialMessage['message']);


$thread = $threadDw->getMergedData();


foreach ($messages as $message)
    /** @var XenForo_DataWriter_DiscussionMessage_Post $threadMessageDw */
    $threadMessageDw = XenForo_DataWriter::create('XenForo_DataWriter_DiscussionMessage_Post');
    $threadMessageDw->setOption(XenForo_DataWriter_DiscussionMessage_Post::OPTION_IS_AUTOMATED, true);
    $threadMessageDw->setExtraData(XenForo_DataWriter_DiscussionMessage_Post::DATA_FORUM, $forum);
    $threadMessageDw->set('thread_id', $thread['thread_id']);
    $threadMessageDw->set('user_id', $message['user_id']);
    $threadMessageDw->set('username', $message['username']);
    $threadMessageDw->set('message_state', 'visible');
    $threadMessageDw->set('post_date', $message['date']);
    $threadMessageDw->set('message', $message['message']);