xref: /plugin/combo/action/metacanonical.php (revision c25e802be7a82e7120d3f6149fed7a9aa24e7c7c)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnicouse ComboStrap\MetadataUtility;
4007225e5Sgerardnicouse ComboStrap\PluginUtility;
571f916b9Sgerardnicouse 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        /**
49007225e5Sgerardnico         * No canonical for bars
50007225e5Sgerardnico         */
51*c25e802bSgerardnico        $page = new Page($ID);
52*c25e802bSgerardnico
53*c25e802bSgerardnico        if ($page->isBar()) {
54007225e5Sgerardnico            return;
55007225e5Sgerardnico        }
56007225e5Sgerardnico
57007225e5Sgerardnico        /**
58007225e5Sgerardnico         * Where do we pick the canonical URL
59007225e5Sgerardnico         */
60007225e5Sgerardnico        /**
61007225e5Sgerardnico         * Canonical from meta
62007225e5Sgerardnico         *
63007225e5Sgerardnico         * FYI: The creation of the link was extracted from
64007225e5Sgerardnico         * {@link wl()} that call {@link idfilter()} that performs just a replacement
65007225e5Sgerardnico         * Calling the wl function will not work because
66007225e5Sgerardnico         * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true)
67007225e5Sgerardnico         */
68007225e5Sgerardnico
6971f916b9Sgerardnico        $canonical = MetadataUtility::getMeta(Page::CANONICAL_PROPERTY);
70007225e5Sgerardnico
71007225e5Sgerardnico        /**
72007225e5Sgerardnico         * The last part of the id as canonical
73007225e5Sgerardnico         */
74007225e5Sgerardnico        // How many last parts are taken into account in the canonical processing (2 by default)
75007225e5Sgerardnico        $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0);
76007225e5Sgerardnico        if ($canonical == null && $canonicalLastNamesCount > 0) {
77007225e5Sgerardnico            /**
78007225e5Sgerardnico             * Takes the last names part
79007225e5Sgerardnico             */
80*c25e802bSgerardnico            $names = $page->getNames();
81*c25e802bSgerardnico            $namesLength = sizeof($names);
82007225e5Sgerardnico            if ($namesLength > $canonicalLastNamesCount) {
83007225e5Sgerardnico                $names = array_slice($names, $namesLength - $canonicalLastNamesCount);
84007225e5Sgerardnico            }
85007225e5Sgerardnico            /**
86007225e5Sgerardnico             * If this is a start page, delete the name
87007225e5Sgerardnico             * ie javascript:start will become javascript
88007225e5Sgerardnico             */
89*c25e802bSgerardnico            if ($page->isStartPage()) {
90007225e5Sgerardnico                $names = array_slice($names, 0, $namesLength - 1);
91007225e5Sgerardnico            }
92007225e5Sgerardnico            $canonical = implode(":", $names);
9371f916b9Sgerardnico            p_set_metadata($ID, array(Page::CANONICAL_PROPERTY => $canonical));
94007225e5Sgerardnico        }
95007225e5Sgerardnico
9671f916b9Sgerardnico        $canonicalUrl = Page::getUrl($canonical);
97007225e5Sgerardnico
98007225e5Sgerardnico        /**
99007225e5Sgerardnico         * Replace the meta entry
100007225e5Sgerardnico         *
101007225e5Sgerardnico         * First search the key of the meta array
102007225e5Sgerardnico         */
103007225e5Sgerardnico        $canonicalKey = "";
104007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
105007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
106007225e5Sgerardnico            if ($link["rel"] == "canonical") {
107007225e5Sgerardnico                $canonicalKey = $key;
108007225e5Sgerardnico            }
109007225e5Sgerardnico        }
110007225e5Sgerardnico        if ($canonicalKey != "") {
111007225e5Sgerardnico            // Update
112007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
113007225e5Sgerardnico        } else {
114007225e5Sgerardnico            // Add
115007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
116007225e5Sgerardnico        }
117007225e5Sgerardnico
118007225e5Sgerardnico        /**
119007225e5Sgerardnico         * Add the Og canonical meta
120007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
121007225e5Sgerardnico         */
122007225e5Sgerardnico        $canonicalOgKeyKey = "";
123007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
124007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
125007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
126007225e5Sgerardnico            if ($meta["property"] == $canonicalPropertyKey) {
127007225e5Sgerardnico                $canonicalOgKeyKey = $key;
128007225e5Sgerardnico            }
129007225e5Sgerardnico        }
130007225e5Sgerardnico        if ($canonicalOgKeyKey != "") {
131007225e5Sgerardnico            // Update
132007225e5Sgerardnico            $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray;
133007225e5Sgerardnico        } else {
134007225e5Sgerardnico            // Add
135007225e5Sgerardnico            $event->data['meta'][] = $canonicalOgArray;
136007225e5Sgerardnico        }
137007225e5Sgerardnico
138007225e5Sgerardnico    }
139007225e5Sgerardnico
140007225e5Sgerardnico}
141