xref: /plugin/combo/action/metacanonical.php (revision 85e82846b0a214bc35e62864fa49d9cad0723d0e)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnicouse ComboStrap\MetadataUtility;
4007225e5Sgerardnicouse ComboStrap\PluginUtility;
571f916b9Sgerardnicouse ComboStrap\Page;
6007225e5Sgerardnico
7007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
8007225e5Sgerardnico
9007225e5Sgerardnico/**
10007225e5Sgerardnico *
11007225e5Sgerardnico *
12007225e5Sgerardnico */
13007225e5Sgerardnicoclass action_plugin_combo_metacanonical extends DokuWiki_Action_Plugin
14007225e5Sgerardnico{
15007225e5Sgerardnico
16007225e5Sgerardnico    /**
17007225e5Sgerardnico     * The conf
18007225e5Sgerardnico     */
19007225e5Sgerardnico    const CANONICAL_LAST_NAMES_COUNT_CONF = 'MinimalNamesCountForAutomaticCanonical';
20007225e5Sgerardnico
21007225e5Sgerardnico
22007225e5Sgerardnico    function __construct()
23007225e5Sgerardnico    {
24007225e5Sgerardnico        // enable direct access to language strings
25007225e5Sgerardnico        // ie $this->lang
26007225e5Sgerardnico        $this->setupLocale();
27007225e5Sgerardnico    }
28007225e5Sgerardnico
29007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
30007225e5Sgerardnico    {
31*85e82846SNickeau        /**
32*85e82846SNickeau         * https://www.dokuwiki.org/devel:event:tpl_metaheader_output
33*85e82846SNickeau         */
34007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaCanonicalProcessing', array());
35007225e5Sgerardnico    }
36007225e5Sgerardnico
37007225e5Sgerardnico    /**
38007225e5Sgerardnico     * Dokuwiki has already a canonical methodology
39007225e5Sgerardnico     * https://www.dokuwiki.org/canonical
40007225e5Sgerardnico     *
41007225e5Sgerardnico     * @param $event
42007225e5Sgerardnico     */
43007225e5Sgerardnico    function metaCanonicalProcessing($event)
44007225e5Sgerardnico    {
45007225e5Sgerardnico
465f891b7eSNickeau        global $ID;
475f891b7eSNickeau        if (empty($ID)){
485f891b7eSNickeau            // $_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php"
499da76789Sgerardnico            // $ID is null
509da76789Sgerardnico            return;
519da76789Sgerardnico        }
529da76789Sgerardnico
53*85e82846SNickeau        $page = Page::createPageFromId($ID);
549da76789Sgerardnico
55007225e5Sgerardnico        /**
56531e725cSNickeau         * No canonical for slot page
57007225e5Sgerardnico         */
58531e725cSNickeau        if ($page->isSlot()) {
59007225e5Sgerardnico            return;
60007225e5Sgerardnico        }
61007225e5Sgerardnico
62007225e5Sgerardnico        /**
63007225e5Sgerardnico         * Where do we pick the canonical URL
64007225e5Sgerardnico         */
65007225e5Sgerardnico        /**
66007225e5Sgerardnico         * Canonical from meta
67007225e5Sgerardnico         *
68007225e5Sgerardnico         * FYI: The creation of the link was extracted from
69007225e5Sgerardnico         * {@link wl()} that call {@link idfilter()} that performs just a replacement
70007225e5Sgerardnico         * Calling the wl function will not work because
71007225e5Sgerardnico         * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true)
72007225e5Sgerardnico         */
73007225e5Sgerardnico
74007225e5Sgerardnico
755f891b7eSNickeau        $canonicalUrl = $page->getCanonicalUrlOrDefault();
76007225e5Sgerardnico
77007225e5Sgerardnico        /**
78007225e5Sgerardnico         * Replace the meta entry
79007225e5Sgerardnico         *
80007225e5Sgerardnico         * First search the key of the meta array
81007225e5Sgerardnico         */
82007225e5Sgerardnico        $canonicalKey = "";
83007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
84007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
85007225e5Sgerardnico            if ($link["rel"] == "canonical") {
86007225e5Sgerardnico                $canonicalKey = $key;
87007225e5Sgerardnico            }
88007225e5Sgerardnico        }
89007225e5Sgerardnico        if ($canonicalKey != "") {
90007225e5Sgerardnico            // Update
91007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
92007225e5Sgerardnico        } else {
93007225e5Sgerardnico            // Add
94007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
95007225e5Sgerardnico        }
96007225e5Sgerardnico
97007225e5Sgerardnico        /**
98007225e5Sgerardnico         * Add the Og canonical meta
99007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
100007225e5Sgerardnico         */
101007225e5Sgerardnico        $canonicalOgKeyKey = "";
102007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
103007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
104ebdc69ceSgerardnico        // Search if the canonical property is already present
105007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
106ebdc69ceSgerardnico            if (array_key_exists("property",$meta)) {
107ebdc69ceSgerardnico                /**
108ebdc69ceSgerardnico                 * We may have several properties
109ebdc69ceSgerardnico                 */
110007225e5Sgerardnico                if ($meta["property"] == $canonicalPropertyKey) {
111007225e5Sgerardnico                    $canonicalOgKeyKey = $key;
112007225e5Sgerardnico                }
113007225e5Sgerardnico            }
114ebdc69ceSgerardnico        }
115007225e5Sgerardnico        if ($canonicalOgKeyKey != "") {
116007225e5Sgerardnico            // Update
117007225e5Sgerardnico            $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray;
118007225e5Sgerardnico        } else {
119007225e5Sgerardnico            // Add
120007225e5Sgerardnico            $event->data['meta'][] = $canonicalOgArray;
121007225e5Sgerardnico        }
122007225e5Sgerardnico
123007225e5Sgerardnico    }
124007225e5Sgerardnico
125007225e5Sgerardnico}
126