xref: /plugin/combo/action/metadescription.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3*04fd306cSNickeauuse ComboStrap\ExceptionNotFound;
4*04fd306cSNickeauuse ComboStrap\ExecutionContext;
5007225e5Sgerardnicouse ComboStrap\LogUtility;
6*04fd306cSNickeauuse ComboStrap\MarkupPath;
7*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
8007225e5Sgerardnico
9007225e5Sgerardnico
10007225e5Sgerardnico/**
11007225e5Sgerardnico * Take the metadata description
12007225e5Sgerardnico *
13c3437056SNickeau * To known more about description and [[docs:seo:seo|search engine optimization]], see:
14c3437056SNickeau * [[https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML#Active_learning_The_descriptions_use_in_search_engines|Active learning: The description's use in search engines]].
15c3437056SNickeau * [[https://developers.google.com/search/docs/beginner/seo-starter-guide#use-the-description-meta-tag|Description section of the Google SEO Starter guide]]
16007225e5Sgerardnico */
17007225e5Sgerardnicoclass action_plugin_combo_metadescription extends DokuWiki_Action_Plugin
18007225e5Sgerardnico{
19007225e5Sgerardnico
20007225e5Sgerardnico    const DESCRIPTION_META_KEY = 'description';
21c3437056SNickeau    const FACEBOOK_DESCRIPTION_PROPERTY = 'og:description';
22007225e5Sgerardnico
23007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
24007225e5Sgerardnico    {
25007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'description_modification', array());
26007225e5Sgerardnico    }
27007225e5Sgerardnico
28007225e5Sgerardnico    /**
29007225e5Sgerardnico     * Add a meta-data description
305f891b7eSNickeau     * @param $event
315f891b7eSNickeau     * @param $param
32007225e5Sgerardnico     */
33007225e5Sgerardnico    function description_modification(&$event, $param)
34007225e5Sgerardnico    {
35007225e5Sgerardnico
36*04fd306cSNickeau        try {
37*04fd306cSNickeau            $pageTemplate = ExecutionContext::getActualOrCreateFromEnv()
38*04fd306cSNickeau                ->getExecutingPageTemplate();
39*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
40*04fd306cSNickeau            return;
41*04fd306cSNickeau        }
42*04fd306cSNickeau
43*04fd306cSNickeau        if(!$pageTemplate->isSocial()){
44*04fd306cSNickeau            return;
455f891b7eSNickeau        }
46007225e5Sgerardnico
47007225e5Sgerardnico        /**
48007225e5Sgerardnico         * Description
49007225e5Sgerardnico         * https://www.dokuwiki.org/devel:metadata
50007225e5Sgerardnico         */
51*04fd306cSNickeau        try {
52*04fd306cSNickeau            $wikiPath = $pageTemplate->getRequestedContextPath();
53*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
54*04fd306cSNickeau            LogUtility::internalError("A social template should have a path");
55*04fd306cSNickeau            return;
56*04fd306cSNickeau        }
57*04fd306cSNickeau
58*04fd306cSNickeau        $page = MarkupPath::createPageFromPathObject($wikiPath);
59007225e5Sgerardnico
605f891b7eSNickeau        $description = $page->getDescriptionOrElseDokuWiki();
61007225e5Sgerardnico        if (empty($description)) {
62*04fd306cSNickeau            $this->sendDestInfo($wikiPath->getWikiId());
63007225e5Sgerardnico            return;
64007225e5Sgerardnico        }
65007225e5Sgerardnico
66007225e5Sgerardnico        // Add it to the meta
67c3437056SNickeau        Metadata::upsertMetaOnUniqueAttribute(
68c3437056SNickeau            $event->data['meta'],
69c3437056SNickeau            "name",
70c3437056SNickeau            [
71c3437056SNickeau                "name" => self::DESCRIPTION_META_KEY,
72c3437056SNickeau                "content" => $description
73c3437056SNickeau            ]
74c3437056SNickeau        );
75c3437056SNickeau        Metadata::upsertMetaOnUniqueAttribute(
76c3437056SNickeau            $event->data['meta'],
77c3437056SNickeau            "property",
78c3437056SNickeau            [
79c3437056SNickeau                "property" => self::FACEBOOK_DESCRIPTION_PROPERTY,
80c3437056SNickeau                "content" => $description
81c3437056SNickeau            ]
82c3437056SNickeau        );
83c3437056SNickeau
84007225e5Sgerardnico
85007225e5Sgerardnico
86007225e5Sgerardnico    }
87007225e5Sgerardnico
88007225e5Sgerardnico    /**
89007225e5Sgerardnico     * Just send a test info
90007225e5Sgerardnico     * @param $ID
91007225e5Sgerardnico     */
92007225e5Sgerardnico    public function sendDestInfo($ID)
93007225e5Sgerardnico    {
94007225e5Sgerardnico        if (defined('DOKU_UNITTEST')) {
95007225e5Sgerardnico            // When you make a admin test call, the page ID = start and there is no meta
96007225e5Sgerardnico            // When there is only an icon, there is also no meta
97007225e5Sgerardnico            global $INPUT;
98007225e5Sgerardnico            $showActions = ["show", ""]; // Empty for the test
99007225e5Sgerardnico            if (in_array($INPUT->str("do"), $showActions)) {
100007225e5Sgerardnico                LogUtility::msg("Page ($ID): The description should never be null when rendering the page", LogUtility::LVL_MSG_INFO);
101007225e5Sgerardnico            }
102007225e5Sgerardnico        }
103007225e5Sgerardnico    }
104007225e5Sgerardnico
105007225e5Sgerardnico
106007225e5Sgerardnico}
107