Seo.php
<?php
namespace Lia\Compo;
class Seo extends \Lia\Compo {
protected $seo = [];
public function onReady(){
$lia = $this->lia;
$lia->addApi('lia:seo.add',[$this,'seo']);
$lia->addApiMethod('lia:seo.add', 'seo');
$lia->addApi('lia:seo.title',[$this,'seoTitle']);
$lia->addApiMethod('lia:seo.title', 'seoTitle');
$lia->addApi('lia:seo.description',[$this,'seoDescription']);
$lia->addApiMethod('lia:seo.description', 'seoDescription');
$lia->addApi('lia:seo.image',[$this,'seoImage']);
$lia->addApiMethod('lia:seo.image', 'seoImage');
$lia->addApi('lia:seo.url',[$this,'seoUrl']);
$lia->addApiMethod('lia:seo.url', 'seoUrl');
$lia->addApi('lia:seo.sitename',[$this,'seoSiteName']);
$lia->addApiMethod('lia:seo.sitename', 'seoSiteName');
$lia->addApi('lia:seo.gethtml',[$this,'getSeoHtml']);
$lia->addApiMethod('lia:seo.gethtml', 'getSeoHtml');
}
public function seo($params){
if (isset($params['image'])
&&empty($params['image:alt'])){
throw new \Lia\Exception\Base("When setting seo 'image', you MUST set 'image:alt' as well.");
}
foreach ($params as $key=>$value){
$this->seo[$key] = $value;
}
}
public function seoTitle($title){
$this->lia->api('lia:seo.add',['title'=>$title]);
}
public function seoDescription($description){
$this->lia->api('lia:seo.add',['description'=>$description]);
}
public function seoImage($image, $altText){
$this->lia->api('lia:seo.add',['image'=>$image, 'image:alt'=>$altText]);
}
public function seoUrl($url){
$this->lia->api('lia:seo.add',['url'=>$url]);
}
public function seoSiteName($siteName){
$this->lia->api('lia:seo.add', ['siteName'=>$siteName]);
}
public function getSeoHtml(){
// Resources for needed seo data
// https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started
// https://ogp.me/
// https://www.w3schools.com/tags/tag_meta.asp
// NOT USED https://schema.org
$map = [
'title'=>[
'<title>%s</title>',
'<meta property="og:title" content="%s" />'
],
'description'=>[
'<meta name="description" content="%s" />',
'<meta property="og:description" content="%s" />',
],
'image'=>[
'<meta property="og:image" content="%s" />',
],
'image:alt'=>[
'<meta property="og:image:alt" content="%s" />',
],
'keywords'=>[
'<meta name="keywords" content="%s" />',
],
'url' =>[
'<link rel="canonical" href="%s" />',
'<meta name="og:url" content="%s" />',
],
'siteName'=>[
'<meta name="og:site_name" content="%s" />',
]
];
$html = [];
foreach ($this->seo as $param=>$value){
$bits = $map[$param] ?? [];
foreach ($bits as $template){
$html[] = sprintf($template, $value);
}
$html[] = '';
}
$html = implode("\n", $html);
return $html;
}
}