xref: /plugin/combo/action/metacanonical.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3c3437056SNickeau
471f916b9Sgerardnicouse ComboStrap\Page;
5007225e5Sgerardnico
6007225e5Sgerardnico/**
7c3437056SNickeau * Class action_plugin_combo_metacanonical
8c3437056SNickeau * Add all canonical HTML meta
9007225e5Sgerardnico */
10c3437056SNickeauclass action_plugin_combo_metacanonical
11007225e5Sgerardnico{
12007225e5Sgerardnico
13007225e5Sgerardnico
14007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
15007225e5Sgerardnico    {
1685e82846SNickeau        /**
1785e82846SNickeau         * https://www.dokuwiki.org/devel:event:tpl_metaheader_output
1885e82846SNickeau         */
19007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaCanonicalProcessing', array());
20c3437056SNickeau
21c3437056SNickeau
22007225e5Sgerardnico    }
23007225e5Sgerardnico
24007225e5Sgerardnico    /**
25007225e5Sgerardnico     * Dokuwiki has already a canonical methodology
26007225e5Sgerardnico     * https://www.dokuwiki.org/canonical
27007225e5Sgerardnico     *
28007225e5Sgerardnico     * @param $event
29007225e5Sgerardnico     */
30007225e5Sgerardnico    function metaCanonicalProcessing($event)
31007225e5Sgerardnico    {
32007225e5Sgerardnico
335f891b7eSNickeau        global $ID;
345f891b7eSNickeau        if (empty($ID)) {
355f891b7eSNickeau            // $_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php"
369da76789Sgerardnico            // $ID is null
379da76789Sgerardnico            return;
389da76789Sgerardnico        }
399da76789Sgerardnico
4085e82846SNickeau        $page = Page::createPageFromId($ID);
419da76789Sgerardnico
42007225e5Sgerardnico        /**
43531e725cSNickeau         * No canonical for slot page
44007225e5Sgerardnico         */
45*4cadd4f8SNickeau        if ($page->isSecondarySlot()) {
46007225e5Sgerardnico            return;
47007225e5Sgerardnico        }
48007225e5Sgerardnico
49007225e5Sgerardnico        /**
50007225e5Sgerardnico         * Where do we pick the canonical URL
51007225e5Sgerardnico         */
52007225e5Sgerardnico        /**
53007225e5Sgerardnico         * Canonical from meta
54007225e5Sgerardnico         *
55007225e5Sgerardnico         * FYI: The creation of the link was extracted from
56007225e5Sgerardnico         * {@link wl()} that call {@link idfilter()} that performs just a replacement
57007225e5Sgerardnico         * Calling the wl function will not work because
58007225e5Sgerardnico         * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true)
59007225e5Sgerardnico         */
60c3437056SNickeau        $canonicalUrl = $page->getAbsoluteCanonicalUrl();
61007225e5Sgerardnico
62007225e5Sgerardnico        /**
63007225e5Sgerardnico         * Replace the meta entry
64007225e5Sgerardnico         *
65007225e5Sgerardnico         * First search the key of the meta array
66007225e5Sgerardnico         */
67007225e5Sgerardnico        $canonicalKey = "";
68007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
69007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
70007225e5Sgerardnico            if ($link["rel"] == "canonical") {
71007225e5Sgerardnico                $canonicalKey = $key;
72007225e5Sgerardnico            }
73007225e5Sgerardnico        }
74007225e5Sgerardnico        if ($canonicalKey != "") {
75007225e5Sgerardnico            // Update
76007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
77007225e5Sgerardnico        } else {
78007225e5Sgerardnico            // Add
79007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
80007225e5Sgerardnico        }
81007225e5Sgerardnico
82007225e5Sgerardnico        /**
83007225e5Sgerardnico         * Add the Og canonical meta
84007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
85007225e5Sgerardnico         */
86007225e5Sgerardnico        $canonicalOgKeyKey = "";
87007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
88007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
89ebdc69ceSgerardnico        // Search if the canonical property is already present
90007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
91ebdc69ceSgerardnico            if (array_key_exists("property", $meta)) {
92ebdc69ceSgerardnico                /**
93ebdc69ceSgerardnico                 * We may have several properties
94ebdc69ceSgerardnico                 */
95007225e5Sgerardnico                if ($meta["property"] == $canonicalPropertyKey) {
96007225e5Sgerardnico                    $canonicalOgKeyKey = $key;
97007225e5Sgerardnico                }
98007225e5Sgerardnico            }
99ebdc69ceSgerardnico        }
100007225e5Sgerardnico        if ($canonicalOgKeyKey != "") {
101007225e5Sgerardnico            // Update
102007225e5Sgerardnico            $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray;
103007225e5Sgerardnico        } else {
104007225e5Sgerardnico            // Add
105007225e5Sgerardnico            $event->data['meta'][] = $canonicalOgArray;
106007225e5Sgerardnico        }
107007225e5Sgerardnico
108007225e5Sgerardnico    }
109007225e5Sgerardnico
110007225e5Sgerardnico}
111