XF 1.4 Canonical building of threads by id returns wrong URL?

mqudsi

Member
I just bit the bullet and switched to XF from vB, but I'm having a bit of a problem that I don't think is actually caused by the import?

In the vB import scripts, this snippet:

Code:
$target = XenForo_Link::buildPublicLink('canonical:threads', array('thread_id' => $newId));

Is returning the wrong result. $newId arrives correctly, but buildPublicLink returns a link to the thread containing the post that has id = $newId instead of the thread with that id.

For example, for the request with $newId = 642, XF takes me to

Code:
/forums/threads/linux-needs-love-tooo.93/#post-642

Instead of

Code:
/forums/threads/easybcd-2-3-beta-builds.642/

I know absolutely zero about XF, but my guess is that 'thread_id' needs to be something else?
 
Hmm. That shouldn't be happening.

Possibilities include:

1) An addon interfering with the threads route (try disabling addons).

2) PHP opcode caches like Zend Optimizer can cause all sorts of weird behavior at the code level if the cache is having problems. Try disabling any such extensions in PHP.

3) Bad file upload. Try re-uploading the original XF files.
 
It worked by looking up the thread and redirecting to it. Code now looks like this:

Code:
<?php

$startTime = microtime(true);

$fileDir = dirname(__FILE__);
if (file_exists($fileDir . '/301config.php'))
{
    include($fileDir . '/301config.php');
}

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);

$http = new Zend_Controller_Request_Http();

$inputHandler = new XenForo_Input($http);

$input = $inputHandler->filter(array(
    't' => XenForo_Input::UINT,
    'p' => XenForo_Input::UINT
));
if(preg_match('/(?:showthread|printthread)\.php(?:\/|\?)([0-9]+)(?:-[^\/]+)/', $http->getRequestUri(), $matches) && count($matches) >= 1){   
    $input['t'] = intval($matches[1]);
}

$target = false;
if ($input['t'])
{
    $thread = XenForo_Model::create('XenForo_Model_Thread')->getThreadById($input['t']);
    $target = XenForo_Link::buildPublicLink('canonical:threads', $thread);
}
else if ($input['p'])
{
    $target = XenForo_Link::buildPublicLink('canonical:posts', array('post_id' => $input['p']));
}

if (!$target)
{
    $target = XenForo_Link::buildPublicLink('canonical:index');
}

$response = new Zend_Controller_Response_Http();
$response->setRedirect(XenForo_Link::convertUriToAbsoluteUri($target), 301);
$response->sendResponse();
 
It worked by looking up the thread and redirecting to it. Code now looks like this:

Code:
<?php

$startTime = microtime(true);

$fileDir = dirname(__FILE__);
if (file_exists($fileDir . '/301config.php'))
{
    include($fileDir . '/301config.php');
}

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);

$http = new Zend_Controller_Request_Http();

$inputHandler = new XenForo_Input($http);

$input = $inputHandler->filter(array(
    't' => XenForo_Input::UINT,
    'p' => XenForo_Input::UINT
));
if(preg_match('/(?:showthread|printthread)\.php(?:\/|\?)([0-9]+)(?:-[^\/]+)/', $http->getRequestUri(), $matches) && count($matches) >= 1){  
    $input['t'] = intval($matches[1]);
}

$target = false;
if ($input['t'])
{
    $thread = XenForo_Model::create('XenForo_Model_Thread')->getThreadById($input['t']);
    $target = XenForo_Link::buildPublicLink('canonical:threads', $thread);
}
else if ($input['p'])
{
    $target = XenForo_Link::buildPublicLink('canonical:posts', array('post_id' => $input['p']));
}

if (!$target)
{
    $target = XenForo_Link::buildPublicLink('canonical:index');
}

$response = new Zend_Controller_Response_Http();
$response->setRedirect(XenForo_Link::convertUriToAbsoluteUri($target), 301);
$response->sendResponse();

This is from two years, but I was having a similar problem and this fixed it. Thank you!
 
Top Bottom