xref: /plugin/combo/action/metacanonical.php (revision 5f891b7e09648e05e78f5882f3fdde1e9df9b0f1)
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
45*5f891b7eSNickeau        global $ID;
46*5f891b7eSNickeau        if (empty($ID)){
47*5f891b7eSNickeau            // $_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php"
489da76789Sgerardnico            // $ID is null
499da76789Sgerardnico            return;
509da76789Sgerardnico        }
519da76789Sgerardnico
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
73007225e5Sgerardnico
74*5f891b7eSNickeau        $canonicalUrl = $page->getCanonicalUrlOrDefault();
75007225e5Sgerardnico
76007225e5Sgerardnico        /**
77007225e5Sgerardnico         * Replace the meta entry
78007225e5Sgerardnico         *
79007225e5Sgerardnico         * First search the key of the meta array
80007225e5Sgerardnico         */
81007225e5Sgerardnico        $canonicalKey = "";
82007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
83007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
84007225e5Sgerardnico            if ($link["rel"] == "canonical") {
85007225e5Sgerardnico                $canonicalKey = $key;
86007225e5Sgerardnico            }
87007225e5Sgerardnico        }
88007225e5Sgerardnico        if ($canonicalKey != "") {
89007225e5Sgerardnico            // Update
90007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
91007225e5Sgerardnico        } else {
92007225e5Sgerardnico            // Add
93007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
94007225e5Sgerardnico        }
95007225e5Sgerardnico
96007225e5Sgerardnico        /**
97007225e5Sgerardnico         * Add the Og canonical meta
98007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
99007225e5Sgerardnico         */
100007225e5Sgerardnico        $canonicalOgKeyKey = "";
101007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
102007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
103ebdc69ceSgerardnico        // Search if the canonical property is already present
104007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
105ebdc69ceSgerardnico            if (array_key_exists("property",$meta)) {
106ebdc69ceSgerardnico                /**
107ebdc69ceSgerardnico                 * We may have several properties
108ebdc69ceSgerardnico                 */
109007225e5Sgerardnico                if ($meta["property"] == $canonicalPropertyKey) {
110007225e5Sgerardnico                    $canonicalOgKeyKey = $key;
111007225e5Sgerardnico                }
112007225e5Sgerardnico            }
113ebdc69ceSgerardnico        }
114007225e5Sgerardnico        if ($canonicalOgKeyKey != "") {
115007225e5Sgerardnico            // Update
116007225e5Sgerardnico            $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray;
117007225e5Sgerardnico        } else {
118007225e5Sgerardnico            // Add
119007225e5Sgerardnico            $event->data['meta'][] = $canonicalOgArray;
120007225e5Sgerardnico        }
121007225e5Sgerardnico
122007225e5Sgerardnico    }
123007225e5Sgerardnico
124007225e5Sgerardnico}
125