On sites where the 'replace_link_with_first_in_nav' attribute is used, it may be ideal to redirect a visitor to the correct page if they manually enter the parent page's URL. This can be achieved with an event listener in the application bootstrap.

Let's say you have the following tree

site.com/page-1 [replace_link_with_first_in_nav attribute is set on this page] site.com/page-1/sub-page-1 site.com/page-1/sub-page-2

Typically all the navigation entries for /page-1 automatically point to /page-1/sub-page-1 however if the user types in /page-1 for some reason they will see whatever content has been added there (which probably isn't any).

By adding the following snippet to your /application/bootstrap/app.php they will automatically be redirected to the first child page with a 301 response.

use Concrete\Core\Routing\Redirect;

Events::addListener('on_page_view', function($event) {
    $page = $event->getPageObject();
    if ($page->getCollectionAttributeValue('replace_link_with_first_in_nav')) {
        $sub = $page->getFirstChild();
        if (is_object($sub)) {
            Redirect::page($sub, 301)->send();
        }
    }
});
Loading Conversation