单独去除Joomla首页中页面标题(Page Title)的网站名称
改进版本(适用Joomla 6)
<?php
use Joomla\CMS\Factory;
$app = Factory::getApplication();
$menu = $app->getMenu()->getActive();
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');
if ($menu && $menu->home)
{
// 使用 getParams() 获取菜单项参数
$menuParams = $menu->getParams();
$browserTitle = $menuParams->get('page_title', '');
if (!empty($browserTitle)) {
// 如果有自定义浏览器标题
$this->setTitle($browserTitle);
} else {
// 如果没有设置,首页只显示站点名称
$this->setTitle($sitename);
}
}
?>
注意:如果$app和$menu等变量已加载的话,不要重复加载。
一般的企业网站或外贸网站,我们都会把后台 - 全局设置 - 前台 - 页面 Title 中加入网站名称 的选项,选择 “之后”;也就是说,如果你的网站名称是“野草工作室”,你的某篇文章名称是“怎样升级到Joomla 6?”,那你开启了该选项后,实际的页面标题(Page Title)是“怎样升级到Joomla 6? - 野草工作室”。
但是,对于首页来说,我们更习惯把网站名称放在最前面,假如我们自定义首页的名称是“野草工作室,提供Joomla建站服务”,那如果开启上面选项,实际页面标题就是“野草工作室,提供Joomla建站服务 - 野草工作室”,这样就会重复了,这样不利于SEO,也不符合阅读习惯。
于是就有了既想开启“在页面标题中加入网站名称”的需求,也希望首页排除在外,首页不要添加网站名称的想法,那怎么实现?思路如下:
- 获取当前实际页面标题(包含网站名称)并把网站名称和连接符去除
- 判断当前是否是首页
- 如果是首页即输出修改后的网页标题
use Joomla\CMS\Factory;如果上面代码,能够在Joomla的默认模板cassiopeia中运行,但是如果使用的模板是Yootheme Pro,即会提示
$app = JFactory::getApplication();
$menu = Factory::getApplication()->getMenu();
$isHomePage = ($menu->getActive() == $menu->getDefault());
$title = $this->getTitle();
$titleAfter =' - ' . $app->getCfg( 'sitename' );
$titleHomePage = str_replace ($titleAfter,'',$title);
if ($isHomePage)
{
$this->setTitle( $titleHomePage );
}
Class "YOOtheme\JFactory" not found,是因为使用的是Joomla 4或更高的版本,JFactory已经被弃用,替换为Joomla\CMS\Factory。所以,您需要将代码中的JFactory替换为Factory,并确保代码符合Joomla 4的命名空间要求。
解决方法:
- 代码中替换
JFactory为Factory,JFactory::getApplication()和其他JFactory的引用需要更新为Factory::getApplication()。 - 检查命名空间和类加载在Joomla 4或更高版本中,确保已经正确加载了命名空间
Joomla\CMS\Factory,您不需要手动引入它,Joomla 会自动加载这个命名空间。(所以下面代码中已移除) - 修改后的代码(并重新优化):
$app = Factory::getApplication();
$menu = $app->getMenu();
$isHomePage = ($menu->getActive() == $menu->getDefault());
$title = $this->getTitle();
$titleSuffix = ' - ' . $app->getCfg('sitename');
// 如果有标题且是首页,移除网站名称部分
if ($title && $isHomePage) {
$this->setTitle(str_replace($titleSuffix, '', $title));
} else {
$this->setTitle($title);
}