Drupal 7中template.php的preprocess_page里drupal_set_title失效问题排查
看起来你已经确认代码确实执行了,但页面标题就是没变化,这种情况在Drupal 7里挺常见的,我来帮你拆解几个可能的原因和对应的解决办法:
1. 主题模板可能没使用$title变量
首先检查你的主题page.tpl.php文件,看看页面标题的输出逻辑。很多标准主题会用类似这样的代码输出标题:
<?php print render($title_prefix); ?> <?php if ($title): ?> <h1 class="title" id="page-title"> <?php print $title; ?> </h1> <?php endif; ?> <?php print render($title_suffix); ?>
但如果你的模板里是直接调用drupal_get_title()输出标题(比如<?php print drupal_get_title(); ?>),那你设置的$vars['title']就不会生效——因为模板根本没用到这个变量。
解决办法:要么修改模板改用$title变量输出,要么确保drupal_set_title()的设置能被drupal_get_title()读取到(更推荐前者,这是Drupal主题层的标准做法)。
2. 你的preprocess函数被其他模块/主题覆盖了
Drupal的hook执行是有权重优先级的,如果有其他模块或者父主题的preprocess_page函数在你的代码之后运行,并且修改了$vars['title']或者调用了drupal_set_title(),那你的设置就会被覆盖。
解决办法:给你的主题preprocess函数设置更高的权重,确保它最后执行。在你的主题.module文件里添加这段代码:
function newtheme_module_implements_alter(&$implementations, $hook) { if ($hook == 'preprocess_page') { // 把当前主题的preprocess_page移到执行队列的最后 $theme_implementation = $implementations['newtheme']; unset($implementations['newtheme']); $implementations['newtheme'] = $theme_implementation; } }
3. Drupal缓存在搞鬼
这是Drupal开发者最容易忽略的细节!主题层的修改经常会被缓存挡住,哪怕你确认代码执行了,缓存也可能让旧的标题一直显示。
解决办法:进入后台 » 配置 » 性能 » 清空所有缓存,然后再刷新页面试试。
4. 页面标题被其他模块接管了
如果你的页面是用Views、Page Manager(Panels)或者Metatag这类模块创建的,这些模块可能会自己控制页面标题,直接覆盖你在preprocess里的设置。
解决办法:检查对应模块的配置,比如Views里的页面设置有没有自定义标题,Page Manager里的页面变体有没有设置标题,把这些地方的标题配置改成和你想要的一致,或者禁用它们的标题控制。
另外补充一点:其实在preprocess_page里,直接设置$vars['title']是比调用drupal_set_title()更可靠的方式——因为模板最终渲染用的就是这个变量,而drupal_set_title()是设置全局标题,后续可能被其他流程修改。你已经这么做了,所以重点还是放在模板、权重和缓存这几个点上。
内容的提问来源于stack exchange,提问作者steve

