xref: /plugin/combo/action/metacanonical.php (revision ebdc69ce9d3a09a988bd8b0f64c338978b9dd3e5)
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
45007225e5Sgerardnico
469da76789Sgerardnico        if ($_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php"){
479da76789Sgerardnico            // $ID is null
489da76789Sgerardnico            return;
499da76789Sgerardnico        }
509da76789Sgerardnico
519da76789Sgerardnico        global $ID;
529da76789Sgerardnico        $page = new Page($ID);
539da76789Sgerardnico
54007225e5Sgerardnico        /**
55007225e5Sgerardnico         * No canonical for bars
56007225e5Sgerardnico         */
57c25e802bSgerardnico        if ($page->isBar()) {
58007225e5Sgerardnico            return;
59007225e5Sgerardnico        }
60007225e5Sgerardnico
61007225e5Sgerardnico        /**
62007225e5Sgerardnico         * Where do we pick the canonical URL
63007225e5Sgerardnico         */
64007225e5Sgerardnico        /**
65007225e5Sgerardnico         * Canonical from meta
66007225e5Sgerardnico         *
67007225e5Sgerardnico         * FYI: The creation of the link was extracted from
68007225e5Sgerardnico         * {@link wl()} that call {@link idfilter()} that performs just a replacement
69007225e5Sgerardnico         * Calling the wl function will not work because
70007225e5Sgerardnico         * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true)
71007225e5Sgerardnico         */
72007225e5Sgerardnico
7371f916b9Sgerardnico        $canonical = MetadataUtility::getMeta(Page::CANONICAL_PROPERTY);
74007225e5Sgerardnico
75007225e5Sgerardnico        /**
76007225e5Sgerardnico         * The last part of the id as canonical
77007225e5Sgerardnico         */
78007225e5Sgerardnico        // How many last parts are taken into account in the canonical processing (2 by default)
79007225e5Sgerardnico        $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0);
80007225e5Sgerardnico        if ($canonical == null && $canonicalLastNamesCount > 0) {
81007225e5Sgerardnico            /**
82007225e5Sgerardnico             * Takes the last names part
83007225e5Sgerardnico             */
84c25e802bSgerardnico            $names = $page->getNames();
85c25e802bSgerardnico            $namesLength = sizeof($names);
86007225e5Sgerardnico            if ($namesLength > $canonicalLastNamesCount) {
87007225e5Sgerardnico                $names = array_slice($names, $namesLength - $canonicalLastNamesCount);
88007225e5Sgerardnico            }
89007225e5Sgerardnico            /**
90007225e5Sgerardnico             * If this is a start page, delete the name
91007225e5Sgerardnico             * ie javascript:start will become javascript
92007225e5Sgerardnico             */
93c25e802bSgerardnico            if ($page->isStartPage()) {
94007225e5Sgerardnico                $names = array_slice($names, 0, $namesLength - 1);
95007225e5Sgerardnico            }
96007225e5Sgerardnico            $canonical = implode(":", $names);
9771f916b9Sgerardnico            p_set_metadata($ID, array(Page::CANONICAL_PROPERTY => $canonical));
98007225e5Sgerardnico        }
99007225e5Sgerardnico
10071f916b9Sgerardnico        $canonicalUrl = Page::getUrl($canonical);
101007225e5Sgerardnico
102007225e5Sgerardnico        /**
103007225e5Sgerardnico         * Replace the meta entry
104007225e5Sgerardnico         *
105007225e5Sgerardnico         * First search the key of the meta array
106007225e5Sgerardnico         */
107007225e5Sgerardnico        $canonicalKey = "";
108007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
109007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
110007225e5Sgerardnico            if ($link["rel"] == "canonical") {
111007225e5Sgerardnico                $canonicalKey = $key;
112007225e5Sgerardnico            }
113007225e5Sgerardnico        }
114007225e5Sgerardnico        if ($canonicalKey != "") {
115007225e5Sgerardnico            // Update
116007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
117007225e5Sgerardnico        } else {
118007225e5Sgerardnico            // Add
119007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
120007225e5Sgerardnico        }
121007225e5Sgerardnico
122007225e5Sgerardnico        /**
123007225e5Sgerardnico         * Add the Og canonical meta
124007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
125007225e5Sgerardnico         */
126007225e5Sgerardnico        $canonicalOgKeyKey = "";
127007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
128007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
129*ebdc69ceSgerardnico        // Search if the canonical property is already present
130007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
131*ebdc69ceSgerardnico            if (array_key_exists("property",$meta)) {
132*ebdc69ceSgerardnico                /**
133*ebdc69ceSgerardnico                 * We may have several properties
134*ebdc69ceSgerardnico                 */
135007225e5Sgerardnico                if ($meta["property"] == $canonicalPropertyKey) {
136007225e5Sgerardnico                    $canonicalOgKeyKey = $key;
137007225e5Sgerardnico                }
138007225e5Sgerardnico            }
139*ebdc69ceSgerardnico        }
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