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;
    }
}