xref: /plugin/combo/action/metacanonical.php (revision 71f916b90657b0ec64f620dd9cb434dd66a4bb62)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnicouse ComboStrap\MetadataUtility;
4007225e5Sgerardnicouse ComboStrap\PluginUtility;
5*71f916b9Sgerardnicouse ComboStrap\Page;
6007225e5Sgerardnico
7007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
8007225e5Sgerardnico
9007225e5Sgerardnico/**
10007225e5Sgerardnico *
11007225e5Sgerardnico *
12007225e5Sgerardnico *   * The name of the file should be the last name of the class
13007225e5Sgerardnico *   * There should be only one name
14007225e5Sgerardnico */
15007225e5Sgerardnicoclass action_plugin_combo_metacanonical extends DokuWiki_Action_Plugin
16007225e5Sgerardnico{
17007225e5Sgerardnico
18007225e5Sgerardnico    /**
19007225e5Sgerardnico     * The conf
20007225e5Sgerardnico     */
21007225e5Sgerardnico    const CANONICAL_LAST_NAMES_COUNT_CONF = 'MinimalNamesCountForAutomaticCanonical';
22007225e5Sgerardnico
23007225e5Sgerardnico
24007225e5Sgerardnico    function __construct()
25007225e5Sgerardnico    {
26007225e5Sgerardnico        // enable direct access to language strings
27007225e5Sgerardnico        // ie $this->lang
28007225e5Sgerardnico        $this->setupLocale();
29007225e5Sgerardnico    }
30007225e5Sgerardnico
31007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
32007225e5Sgerardnico    {
33007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaCanonicalProcessing', array());
34007225e5Sgerardnico    }
35007225e5Sgerardnico
36007225e5Sgerardnico    /**
37007225e5Sgerardnico     * Dokuwiki has already a canonical methodology
38007225e5Sgerardnico     * https://www.dokuwiki.org/canonical
39007225e5Sgerardnico     *
40007225e5Sgerardnico     * @param $event
41007225e5Sgerardnico     */
42007225e5Sgerardnico    function metaCanonicalProcessing($event)
43007225e5Sgerardnico    {
44007225e5Sgerardnico        global $ID;
45007225e5Sgerardnico        global $conf;
46007225e5Sgerardnico
47007225e5Sgerardnico        /**
48007225e5Sgerardnico         * Split the id by :
49007225e5Sgerardnico         */
50007225e5Sgerardnico        $names = preg_split("/:/", $ID);
51007225e5Sgerardnico        $namesLength = sizeOf($names);
52007225e5Sgerardnico
53007225e5Sgerardnico        /**
54007225e5Sgerardnico         * No canonical for bars
55007225e5Sgerardnico         */
56007225e5Sgerardnico        $bars = array($conf['sidebar']);
57007225e5Sgerardnico        $strapTemplateName = 'strap';
58007225e5Sgerardnico        if ($conf['template'] === $strapTemplateName) {
59007225e5Sgerardnico            $bars[] = $conf['tpl'][$strapTemplateName]['headerbar'];
60007225e5Sgerardnico            $bars[] = $conf['tpl'][$strapTemplateName]['footerbar'];
61007225e5Sgerardnico            $bars[] = $conf['tpl'][$strapTemplateName]['sidekickbar'];
62007225e5Sgerardnico        }
63007225e5Sgerardnico        if (in_array($names[$namesLength - 1], $bars)) {
64007225e5Sgerardnico            return;
65007225e5Sgerardnico        }
66007225e5Sgerardnico
67007225e5Sgerardnico        /**
68007225e5Sgerardnico         * Where do we pick the canonical URL
69007225e5Sgerardnico         */
70007225e5Sgerardnico
71007225e5Sgerardnico
72007225e5Sgerardnico        /**
73007225e5Sgerardnico         * Canonical from meta
74007225e5Sgerardnico         *
75007225e5Sgerardnico         * FYI: The creation of the link was extracted from
76007225e5Sgerardnico         * {@link wl()} that call {@link idfilter()} that performs just a replacement
77007225e5Sgerardnico         * Calling the wl function will not work because
78007225e5Sgerardnico         * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true)
79007225e5Sgerardnico         */
80007225e5Sgerardnico
81*71f916b9Sgerardnico        $canonical = MetadataUtility::getMeta(Page::CANONICAL_PROPERTY);
82007225e5Sgerardnico
83007225e5Sgerardnico        /**
84007225e5Sgerardnico         * The last part of the id as canonical
85007225e5Sgerardnico         */
86007225e5Sgerardnico        // How many last parts are taken into account in the canonical processing (2 by default)
87007225e5Sgerardnico        $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0);
88007225e5Sgerardnico        if ($canonical == null && $canonicalLastNamesCount > 0) {
89007225e5Sgerardnico            /**
90007225e5Sgerardnico             * Takes the last names part
91007225e5Sgerardnico             */
92007225e5Sgerardnico            if ($namesLength > $canonicalLastNamesCount) {
93007225e5Sgerardnico                $names = array_slice($names, $namesLength - $canonicalLastNamesCount);
94007225e5Sgerardnico            }
95007225e5Sgerardnico            /**
96007225e5Sgerardnico             * If this is a start page, delete the name
97007225e5Sgerardnico             * ie javascript:start will become javascript
98007225e5Sgerardnico             */
99007225e5Sgerardnico            if ($names[$namesLength - 1] == $conf['start']) {
100007225e5Sgerardnico                $names = array_slice($names, 0, $namesLength - 1);
101007225e5Sgerardnico            }
102007225e5Sgerardnico            $canonical = implode(":", $names);
103*71f916b9Sgerardnico            p_set_metadata($ID, array(Page::CANONICAL_PROPERTY => $canonical));
104007225e5Sgerardnico        }
105007225e5Sgerardnico
106*71f916b9Sgerardnico        $canonicalUrl = Page::getUrl($canonical);
107007225e5Sgerardnico
108007225e5Sgerardnico        /**
109007225e5Sgerardnico         * Replace the meta entry
110007225e5Sgerardnico         *
111007225e5Sgerardnico         * First search the key of the meta array
112007225e5Sgerardnico         */
113007225e5Sgerardnico        $canonicalKey = "";
114007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
115007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
116007225e5Sgerardnico            if ($link["rel"] == "canonical") {
117007225e5Sgerardnico                $canonicalKey = $key;
118007225e5Sgerardnico            }
119007225e5Sgerardnico        }
120007225e5Sgerardnico        if ($canonicalKey != "") {
121007225e5Sgerardnico            // Update
122007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
123007225e5Sgerardnico        } else {
124007225e5Sgerardnico            // Add
125007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
126007225e5Sgerardnico        }
127007225e5Sgerardnico
128007225e5Sgerardnico        /**
129007225e5Sgerardnico         * Add the Og canonical meta
130007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
131007225e5Sgerardnico         */
132007225e5Sgerardnico        $canonicalOgKeyKey = "";
133007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
134007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
135007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
136007225e5Sgerardnico            if ($meta["property"] == $canonicalPropertyKey) {
137007225e5Sgerardnico                $canonicalOgKeyKey = $key;
138007225e5Sgerardnico            }
139007225e5Sgerardnico        }
140007225e5Sgerardnico        if ($canonicalOgKeyKey != "") {
141007225e5Sgerardnico            // Update
142007225e5Sgerardnico            $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray;
143007225e5Sgerardnico        } else {
144007225e5Sgerardnico            // Add
145007225e5Sgerardnico            $event->data['meta'][] = $canonicalOgArray;
146007225e5Sgerardnico        }
147007225e5Sgerardnico
148007225e5Sgerardnico    }
149007225e5Sgerardnico
150007225e5Sgerardnico}
151