| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 | <?phpnamespace Grav\Plugin\Aura;use Grav\Common\Grav;use Grav\Common\Page\Page;use Grav\Plugin\AuraAuthorsPlugin;class Aura{    private $org;    private $website;    public  $webpage;    private $person;    private $grav;    private $otherPresence = array(        'facebook-url',        'instagram-url',        'linkedin-url',        'pinterest-url',        'youtube-url',        'wikipedia-url',        'website-url',    );    /**     * Initializes Aura variables for the page     *     * @param  object $page     *     */    public function __construct(Page $page)    {        $this->grav = $cache = Grav::instance();        /*         * Organization         */        $this->org = new Organization();        $this->org->url = (string)$this->grav['config']->get('plugins.aura.org-url');        $this->org->id = $this->org->url . '#organization';        $this->org->name = $this->grav['config']->get('plugins.aura.org-name');        // Org SameAs        $sameAs = array();        foreach ($this->otherPresence as $platform) {            $key = 'plugins.aura.org-' . $platform;            if ($this->grav['config']->get($key)) {                $sameAs[] = $this->grav['config']->get($key);            }        }        $key = 'plugins.aura.' . 'org-twitter-user';        if ($this->grav['config']->get($key)) {            $sameAs[] = 'https://twitter.com/' . $this->grav['config']->get($key);        }        if (!empty($sameAs)) {            $this->org->sameAs = $sameAs;        }        // Org Logo        if ($this->grav['config']->get('plugins.aura.org-logo')) {            $imageArray = $this->grav['config']->get('plugins.aura.org-logo');            $firstImage = reset($imageArray);            $imagePath = ROOT_DIR . $firstImage['path'];            if (file_exists($imagePath)) {                $size = getimagesize($imagePath);                $this->org->logo = new Image();                $this->org->logo->url = $this->grav['base_url_absolute'] . '/' . $firstImage['path'];                $this->org->logo->id = $this->org->url . '#logo';                $this->org->logo->width = $size[0];                $this->org->logo->height = $size[1];                $this->org->logo->caption = $this->org->name;                $this->org->logo->type = $size['mime'];            }        }        /*         * Website         */        $this->website = new WebSite;        $this->website->url = $this->grav['base_url_absolute'];        $this->website->id = $this->website->url . '#website';        $this->website->name = $this->grav['config']->get('site.title');        /*         * Webpage         */        $this->webpage = new WebPage;        $this->webpage->url = $page->url(true);        $this->webpage->id = $this->webpage->url . '#webpage';        $this->webpage->title = $page->title() . ' | ' . $this->grav['config']->get('site.title');        $header = $page->header();        if ((isset($header->aura['description'])) && ($header->aura['description'] != '')) {            $this->webpage->description = (string)$header->aura['description'];        }        if ((isset($header->language)) and ($header->language != '')) {            $this->webpage->language = $header->language;        } else {            $this->webpage->language = $this->grav['language']->getActive();            if (!$this->webpage->language) {                $this->webpage->language = $this->grav['config']->get('site.default_lang');            }        }        $datePublishedRaw = time();        if ($page->publishDate()) {            $datePublishedRaw = $page->publishDate();        } else if ($page->date()) {            $datePublishedRaw = $page->date();        } else if ($page->modified()) {            $datePublishedRaw = $page->modified();        }        $dateModifiedRaw = $page->modified() ? $page->modified() : time();        $this->webpage->datePublished = date("c", $datePublishedRaw);        $this->webpage->dateModified = date("c", $dateModifiedRaw);        // Webpage Image        $filename = false;        if ((isset($header->aura['image'])) && ($header->aura['image'] != '')) {            $filename = $header->aura['image'];        } else if (isset($header->media_order) && ($header->media_order != '')) {            $images = explode(',', $header->media_order);            if ((is_array($images)) && (!empty($images))) {                $filename = $images[0];            }        }        if ($filename) {            $imagePath = $page->path() . '/' . $filename;            if (file_exists($imagePath)) {                $size = getimagesize($imagePath);                $this->webpage->image = new Image();                $this->webpage->image->url = preg_replace('/' . preg_quote($page->urlExtension()) . '$/u', '', $page->url(true)) . '/' . $filename;                $this->webpage->image->id = $this->webpage->url . '#primaryimage';                $this->webpage->image->width = $size[0];                $this->webpage->image->height = $size[1];                $this->webpage->image->caption = $this->webpage->title;                $this->webpage->image->type = $size['mime'];            }        }        if ((isset($header->aura['pagetype'])) && ($header->aura['pagetype'] != '')) {            $this->webpage->type = $header->aura['pagetype'];        }        // Author        if (($this->grav['config']->get('plugins.aura-authors.enabled')) && isset($page->header()->aura['author'])) {            $authors = $this->grav['config']->get('plugins.aura-authors.authors');            $key = array_search($page->header()->aura['author'], array_column($authors, 'label'));            if ($key !== false) {                $author = $authors[$key];                $this->person = new Person();                $this->person->id = $this->org->url . '#person/' . $author['label'];                $this->person->name = $author['name'];                $this->person->description = $author['description'];                // Person SameAs                $sameAs = array();                foreach ($this->otherPresence as $platform) {                    $key = 'person-' . $platform;                    if (isset($author[$key]) && $author[$key] != '') {                        $sameAs[] = $author[$key];                    }                }                $key = 'person-twitter-user';                if (isset($author[$key]) && $author[$key] != '') {                    $this->person->twitterUser = $author[$key];                    $sameAs[] = 'https://twitter.com/' . $author[$key];                }                if (!empty($sameAs)) {                    $this->person->sameAs = $sameAs;                }                // Person Image                if ((isset($author['image'])) && (!empty($author['image']))) {                    $firstImage = reset($author['image']);                    $imagePath = ROOT_DIR . $firstImage['path'];                    if (file_exists($imagePath)) {                        $size = getimagesize($imagePath);                        $this->person->image = new Image();                        $this->person->image->url = $this->grav['base_url_absolute'] . '/' . $firstImage['path'];                        $this->person->image->id = $this->org->url . '#personimage/' . $author['label'];                        $this->person->image->width = $size[0];                        $this->person->image->height = $size[1];                        $this->person->image->caption = $author['name'];                        $this->person->image->type = $size['mime'];                    }                }            }        }    }    public function generateOpenGraphMeta() {        $data = array(            'og:url' => $this->webpage->url,            'og:type' => $this->webpage->type,            'og:title' => $this->webpage->title,        );        if ($this->webpage->description) {            $data['og:description'] = $this->webpage->description;        }        if ($this->webpage->image) {            $data['og:image'] = $this->webpage->image->url;            $data['og:image:type'] = $this->webpage->image->type;            $data['og:image:width'] = $this->webpage->image->width;            $data['og:image:height'] = $this->webpage->image->height;        }        if ($this->grav['config']->get('plugins.aura.org-facebook-appid')) {            $data['fb:app_id'] = $this->grav['config']->get('plugins.aura.org-facebook-appid');        }        if ($this->person) {            $data['og:author'] = $this->person->name;        } else {            $data['og:author'] = $this->org->name;        }        foreach ($data as $property => $content) {            $this->webpage->metadata[$property] = array(                'property' => $property,                'content' => htmlentities($content),            );        }    }    public function generateTwitterMeta() {        $data = array(            'twitter:card' => 'summary_large_image',            'twitter:title' => $this->webpage->title,        );        if ($this->webpage->description) {            $data['twitter:description'] = $this->webpage->description;        }        if ($this->grav['config']->get('plugins.aura.org-twitter-user')) {            $data['twitter:site'] = '@' . $this->grav['config']->get('plugins.aura.org-twitter-user');        }        if ($this->person && $this->person->twitterUser) {            $data['twitter:creator'] = '@' . $this->person->twitterUser;        } else {            if ($this->grav['config']->get('plugins.aura.org-twitter-user')) {                $data['twitter:creator'] = '@' . $this->grav['config']->get('plugins.aura.org-twitter-user');            }        }        if ($this->webpage->image) {            $data['twitter:image'] = $this->webpage->image->url;        }        foreach ($data as $name => $content) {            $this->webpage->metadata[$name] = array(                'name' => $name,                'content' => htmlentities($content),            );        }    }    public function generateLinkedInMeta() {        $data = array(            'article:published_time' => $this->webpage->datePublished,            'article:modified_time' => $this->webpage->dateModified,        );        if ($this->person) {            $data['article:author'] = $this->person->name;        } else {            $data['article:author'] = $this->org->name;        }        foreach ($data as $property => $content) {            $this->webpage->metadata[$property] = array(                'property' => $property,                'content' => htmlentities($content),            );        }    }    public function generateStructuredData() {        $organization = array(            '@type' => 'Organization',            '@id' => $this->org->id,            'name' => $this->org->name,            'url' => $this->org->url,        );        $website = array(            '@type' => 'WebSite',            '@id' => $this->website->id,            'url' => $this->website->url,            'name' => $this->website->name,            'publisher' => array(                '@id' => $this->org->id,            ),        );        $webpage = array(            '@type' => 'WebPage',            '@id' => $this->webpage->id,            'url' => $this->webpage->url,            'inLanguage' => $this->webpage->language,            'name' => $this->webpage->title,            'isPartOf' => array(                '@id' => $this->website->id,            ),            'datePublished' => $this->webpage->datePublished,            'dateModified' => $this->webpage->dateModified,        );        // Add Organization sameAs (if defined)        if ($this->org->sameAs) {            $organization['sameAs'] = $this->org->sameAs;        }        // Add logo (if defined)        if ($this->org->logo) {            $organization['logo'] = array(                '@type' => 'ImageObject',                '@id' => $this->org->logo->id,                'url' => $this->org->logo->url,                'width' => $this->org->logo->width,                'height' => $this->org->logo->height,                'caption' => $this->org->logo->caption,            );            $organization['image'] = array(                '@id' => $this->org->logo->id,            );        }        // Add page description (if defined)        if ($this->webpage->description) {            $webpage['description'] = $this->webpage->description;        }        // Add page image (if defined)        if ($this->webpage->image) {            $webpageImage = array(                '@type' => 'ImageObject',                '@id' => $this->webpage->image->id,                'url' => $this->webpage->image->url,                'width' => $this->webpage->image->width,                'height' => $this->webpage->image->height,                'caption' => $this->webpage->image->caption,            );            $webpage['primaryImageOfPage'] = array(                '@id' => $this->webpage->image->id,            );        }        // Additional based on page type i.e. article        if ($this->webpage->type == 'article') {            $article = array(                '@type' => 'Article',                '@id' => $this->webpage->url . '#article',                'isPartOf' => array(                    '@id' => $this->webpage->id,                ),                'headline' => $this->webpage->title,                'datePublished' => $this->webpage->datePublished,                'dateModified' => $this->webpage->dateModified,                'mainEntityOfPage' => array(                    '@id' => $this->webpage->id,                ),                'publisher' => array(                    '@id' => $this->org->id,                ),            );            // Add Image            if ($this->webpage->image) {                $article['image'] = array(                    '@id' => $this->webpage->image->id,                );            }            // Add Author            if ($this->person) {                // Use Person (if defined)                $person = array(                    '@type' => 'Person',                    '@id' => $this->person->id,                    'name' => $this->person->name,                );                // Add Person description (if defined)                if ($this->person->description) {                    $person['description'] = $this->person->description;                }                // Add Person sameAs (if defined)                if ($this->person->sameAs) {                    $person['sameAs'] = $this->person->sameAs;                }                // Add Person image (if defined)                if ($this->person->image) {                    $person['image'] = array(                        '@type' => 'ImageObject',                        '@id' => $this->person->image->id,                        'url' => $this->person->image->url,                        'width' => $this->person->image->width,                        'height' => $this->person->image->height,                        'caption' => $this->person->image->caption,                    );                }                $article['author'] = array(                    '@id' => $this->person->id,                );            } else {                // Use Organization                $article['author'] = array(                    '@id' => $this->org->id,                );            }        }        // Build the empty structured data block        $data = array(            '@context' => 'https://schema.org',            '@graph' => array(),        );        // Add the elements in order        $data['@graph'][] = $organization;        $data['@graph'][] = $website;        if (isset($webpageImage)) {            $data['@graph'][] = $webpageImage;        }        $data['@graph'][] = $webpage;        if (isset($article)) {            $data['@graph'][] = $article;        }        if (isset($person)) {            $data['@graph'][] = $person;        }        return json_encode($data, JSON_UNESCAPED_SLASHES);    }}
 |