... в главный layout, т.к. он один на весь фронт, но этот вариант рассматриваю только как крайне запасной.
Почему? Разве это проблема подключить компонент в единой нужной точке?
Дополняю:
/**
* Зарегистрировать все тэги метаданных для страницы с правила
*/
public function applySeoRule ()
{
# Не применяем правила если отключен
if ( ! $this->isEnabled() ) {
return;
}
# Только если есть правило для SEO
if ( $this->hasSeoRule() ) {
$view = Yii::$app->controller ?
Yii::$app->controller->getView() :
Yii::$app->getView();
$seoRule = $this->getSeoRule();
# Параметры индексации
if ( $seoRule->is_no_index ) {
$view->registerMetaTag( [
'name' => 'robots',
'content' => 'noindex',
], 'robots' );
}
# Основные метаданные
if ( $seoRule->title !== '' ) {
$view->title = $seoRule->title;
}
if ( $seoRule->description !== '' ) {
$view->registerMetaTag( [
'name' => 'description',
'content' => $seoRule->description,
], 'description' );
}
if ( $seoRule->keywords !== '' ) {
$view->registerMetaTag( [
'name' => 'keywords',
'content' => $seoRule->keywords,
], 'keywords' );
}
# Метаданные OpenGraph
$opengraphTags = [
'opengraph_title' => 'og:title',
'opengraph_site_name' => 'og:site_name',
'opengraph_url' => 'og:url',
'opengraph_description' => 'og:description',
];
$registerOpengraph = false;
foreach ( $opengraphTags as $attribute => $tagName ) {
if ( isset( $seoRule->$attribute ) && $seoRule->$attribute !== '' ) {
$view->registerMetaTag( [
'name' => $tagName,
'content' => $seoRule->$attribute,
], $tagName );
$registerOpengraph = true;
}
}
if ( $seoRule->opengraphImage ) {
$view->registerMetaTag( [
'name' => 'og:image',
'content' => $seoRule->opengraphImage->getFileUrlWithDomain(),
], 'og:image' );
$registerOpengraph = true;
}
if ( $registerOpengraph ) {
$view->registerMetaTag( [
'name' => 'og:locale',
'content' => str_replace( '-', '_', Yii::$app->language ),
], 'og:locale' );
$view->registerMetaTag( [
'name' => 'og:type',
'content' => 'website',
], 'og:type' );
}
# Twitter OpenGraph
$twitterTags = [
'twitter_url' => 'twitter:url',
'twitter_title' => 'twitter:title',
'twitter_description' => 'twitter:description',
'twitter_site' => 'twitter:site',
'twitter_creator' => 'twitter:creator',
];
$registerTwitter = false;
foreach ( $twitterTags as $attribute => $tagName ) {
if ( isset( $seoRule->$attribute ) && $seoRule->$attribute !== '' ) {
$view->registerMetaTag( [
'name' => $tagName,
'content' => $seoRule->$attribute,
], $tagName );
$registerTwitter = true;
}
}
if ( $seoRule->twitterImage ) {
$view->registerMetaTag( [
'name' => 'twitter:image',
'content' => $seoRule->twitterImage->getFileUrlWithDomain(),
], 'twitter:image' );
$registerTwitter = true;
}
if ( $registerTwitter ) {
$view->registerMetaTag( [
'name' => 'twitter:card',
'content' => 'summary',
], 'twitter:card' );
}
}
}