I want to set the Drupal front page programmatically at run time.
How can I do this? Is this possible?
8 Answers
You can use variable_set()
for that.
variable_set('site_frontpage', $value);
-
18This is correct, but it's not something that should be done too frequently or based on a use action. A variable_set() call always results in "cache_clear_all('variables', 'cache_bootstrap');" so the next request will need to re-fetch the variables and the bootstrap information from the database.– BerdirCommented Apr 5, 2011 at 10:57
-
1
-
7Yes, it will affect performance, cache_bootstrap contains multiple caches that will only be rebuilt over time, for example hook implementations. Alternative solutions would be using Views, Panels or a custom module to dynamically display content on the front page. For example, you could build a view to show the most recent node of a content type and then point site_frontpage to that.– BerdirCommented Apr 5, 2011 at 18:32
-
Using this in a
hook_install
orhook_update_N
then should be fine.– leymannxCommented Sep 30, 2019 at 9:12
There is a module (Frontpage, which is one I maintained) that allows to set a different front page for anonymous users, and authenticated users. The module allows third-party modules to alter the page to which the users are instead redirected, or to alter the structure array used to render the page. Third-party modules are allowed to change the redirection URL only when the front page for anonymous or authenticated has not been set within the Frontpage module, or when there has been an error during the node loading; the module will probably be changed in the future to allow third-party modules to redirect the users to a specific page they select.
As alternative, you can create a custom module that, using code similar to the one used by Frontpage, redirect users to a specific page, basing on specific criteria.
The module should implement hook_menu() and associate a menu callback to, for example, http://example.com/frontpage; the page callback of that menu item should simply verify a condition is verified, and then redirect the users to a specific URL.
The code skeleton could be something similar to the following:
/**
* Implements hook_menu().
*/
function mymodule_menu() {
$items = array();
$items['frontpage'] = array(
'page callback' => 'mymodule_frontpage_view',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function mymodule_frontpage_view() {
// These variables can be useful to redirect the users
// to specific pages, basing on the language currently set for
// the content, or on the fact the user is logged in.
$langcode = $GLOBALS['language_content']->language;
$logged_in = user_is_logged_in();
if ($condition) {
drupal_goto($redirect);
}
}
A very flexible solution would be to use Panels. Different displays can be presented based on any criteria, and is controlled through a UI.
I fixed like this:
/**
* Implements hook_page_alter.
* @param type $page
*/
function my_module_page_alter(&$page){
global $user;
$is_fron_page = drupal_is_front_page();
if($is_fron_page && $user->uid){
$redirect = 'users/'.$user->name.'/my-argument';
drupal_goto($redirect);
}
}
-
1Hello. Nice of you to share your code. Would be even nicer if you could tell us how exactly your code fixes it. You know, reasoning others can follow if for some reason copy-pasted code will not work for them.– MołotCommented Jan 30, 2014 at 11:57
-
@molot - this method, that should be added to your custom module, implements
hook_page_alter
, and usesdrupal_is_front_page
to redirect users, usingdrupal_goto
, based on some condition (in this case $user->uid should not be 0) Commented Apr 21, 2015 at 15:22 -
@commonpike it's not that I don't understand it. My comment was about answer's quality overall, and specifically to it's usability for new, inexperienced users.– MołotCommented Apr 21, 2015 at 15:25
The Rules module can be used also to set the frontpage "programatically".
The actually rule to be created, would be a variation of the answer at Redirect logged in (authenticated) users to a different frontpage using rules or php code.
And optionally combining it with the Flag module, might possibly further enhance the user experience. Eg for logged in users to indicate which of the possible frontpages they consider as their "favorite".
If you're looking to programmatically set this globally, you can set the variable in settings.php:
$conf['site_frontpage'] = 'some/custom/path';
I've altered the homepage node (on subdomains) by settings the variable in a hook_url_outbound_alter()
variable_set('site_frontpage', $value);
And then redirecting:
$_GET['q'] = 'node/' . $domain_homepage_node_id;
From command line or in a shell's script, you can use this Drush command
drush variable-set site_frontpage /path/to/page
or, using alias vset
drush vset site_frontpage /path/to/page
This should comply with Drupal 7 (then Drush 8), as per question.
If you use more a modern system instead, e.g. Drupal 10/Drush 12, then try
drush config:set system.site page.front /path/to/page
or, using alias cset
drush cset system.site page.front /path/to/page
or alias config-set
drush config-set system.site page.front /path/to/page