xref: /plugin/combo/action/metacanonical.php (revision 007225e5fb2d3f64edaccd3bd447ca26effb9d68)
1*007225e5Sgerardnico<?php
2*007225e5Sgerardnico
3*007225e5Sgerardnicouse ComboStrap\MetadataUtility;
4*007225e5Sgerardnicouse ComboStrap\PluginUtility;
5*007225e5Sgerardnicouse ComboStrap\UrlCanonical;
6*007225e5Sgerardnico
7*007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
8*007225e5Sgerardnico
9*007225e5Sgerardnico/**
10*007225e5Sgerardnico *
11*007225e5Sgerardnico *
12*007225e5Sgerardnico *   * The name of the file should be the last name of the class
13*007225e5Sgerardnico *   * There should be only one name
14*007225e5Sgerardnico */
15*007225e5Sgerardnicoclass action_plugin_combo_metacanonical extends DokuWiki_Action_Plugin
16*007225e5Sgerardnico{
17*007225e5Sgerardnico
18*007225e5Sgerardnico    /**
19*007225e5Sgerardnico     * The conf
20*007225e5Sgerardnico     */
21*007225e5Sgerardnico    const CANONICAL_LAST_NAMES_COUNT_CONF = 'MinimalNamesCountForAutomaticCanonical';
22*007225e5Sgerardnico
23*007225e5Sgerardnico
24*007225e5Sgerardnico    function __construct()
25*007225e5Sgerardnico    {
26*007225e5Sgerardnico        // enable direct access to language strings
27*007225e5Sgerardnico        // ie $this->lang
28*007225e5Sgerardnico        $this->setupLocale();
29*007225e5Sgerardnico    }
30*007225e5Sgerardnico
31*007225e5Sgerardnico    public function register(Doku_Event_Handler $controller)
32*007225e5Sgerardnico    {
33*007225e5Sgerardnico        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaCanonicalProcessing', array());
34*007225e5Sgerardnico    }
35*007225e5Sgerardnico
36*007225e5Sgerardnico    /**
37*007225e5Sgerardnico     * Dokuwiki has already a canonical methodology
38*007225e5Sgerardnico     * https://www.dokuwiki.org/canonical
39*007225e5Sgerardnico     *
40*007225e5Sgerardnico     * @param $event
41*007225e5Sgerardnico     */
42*007225e5Sgerardnico    function metaCanonicalProcessing($event)
43*007225e5Sgerardnico    {
44*007225e5Sgerardnico        global $ID;
45*007225e5Sgerardnico        global $conf;
46*007225e5Sgerardnico
47*007225e5Sgerardnico        /**
48*007225e5Sgerardnico         * Split the id by :
49*007225e5Sgerardnico         */
50*007225e5Sgerardnico        $names = preg_split("/:/", $ID);
51*007225e5Sgerardnico        $namesLength = sizeOf($names);
52*007225e5Sgerardnico
53*007225e5Sgerardnico        /**
54*007225e5Sgerardnico         * No canonical for bars
55*007225e5Sgerardnico         */
56*007225e5Sgerardnico        $bars = array($conf['sidebar']);
57*007225e5Sgerardnico        $strapTemplateName = 'strap';
58*007225e5Sgerardnico        if ($conf['template'] === $strapTemplateName) {
59*007225e5Sgerardnico            $bars[] = $conf['tpl'][$strapTemplateName]['headerbar'];
60*007225e5Sgerardnico            $bars[] = $conf['tpl'][$strapTemplateName]['footerbar'];
61*007225e5Sgerardnico            $bars[] = $conf['tpl'][$strapTemplateName]['sidekickbar'];
62*007225e5Sgerardnico        }
63*007225e5Sgerardnico        if (in_array($names[$namesLength - 1], $bars)) {
64*007225e5Sgerardnico            return;
65*007225e5Sgerardnico        }
66*007225e5Sgerardnico
67*007225e5Sgerardnico        /**
68*007225e5Sgerardnico         * Where do we pick the canonical URL
69*007225e5Sgerardnico         */
70*007225e5Sgerardnico
71*007225e5Sgerardnico
72*007225e5Sgerardnico        /**
73*007225e5Sgerardnico         * Canonical from meta
74*007225e5Sgerardnico         *
75*007225e5Sgerardnico         * FYI: The creation of the link was extracted from
76*007225e5Sgerardnico         * {@link wl()} that call {@link idfilter()} that performs just a replacement
77*007225e5Sgerardnico         * Calling the wl function will not work because
78*007225e5Sgerardnico         * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true)
79*007225e5Sgerardnico         */
80*007225e5Sgerardnico
81*007225e5Sgerardnico        $canonical = MetadataUtility::getMeta(UrlCanonical::CANONICAL_PROPERTY);
82*007225e5Sgerardnico
83*007225e5Sgerardnico        /**
84*007225e5Sgerardnico         * The last part of the id as canonical
85*007225e5Sgerardnico         */
86*007225e5Sgerardnico        // How many last parts are taken into account in the canonical processing (2 by default)
87*007225e5Sgerardnico        $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0);
88*007225e5Sgerardnico        if ($canonical == null && $canonicalLastNamesCount > 0) {
89*007225e5Sgerardnico            /**
90*007225e5Sgerardnico             * Takes the last names part
91*007225e5Sgerardnico             */
92*007225e5Sgerardnico            if ($namesLength > $canonicalLastNamesCount) {
93*007225e5Sgerardnico                $names = array_slice($names, $namesLength - $canonicalLastNamesCount);
94*007225e5Sgerardnico            }
95*007225e5Sgerardnico            /**
96*007225e5Sgerardnico             * If this is a start page, delete the name
97*007225e5Sgerardnico             * ie javascript:start will become javascript
98*007225e5Sgerardnico             */
99*007225e5Sgerardnico            if ($names[$namesLength - 1] == $conf['start']) {
100*007225e5Sgerardnico                $names = array_slice($names, 0, $namesLength - 1);
101*007225e5Sgerardnico            }
102*007225e5Sgerardnico            $canonical = implode(":", $names);
103*007225e5Sgerardnico            p_set_metadata($ID, array(UrlCanonical::CANONICAL_PROPERTY => $canonical));
104*007225e5Sgerardnico        }
105*007225e5Sgerardnico
106*007225e5Sgerardnico        $canonicalUrl = UrlCanonical::getUrl($canonical);
107*007225e5Sgerardnico
108*007225e5Sgerardnico        /**
109*007225e5Sgerardnico         * Replace the meta entry
110*007225e5Sgerardnico         *
111*007225e5Sgerardnico         * First search the key of the meta array
112*007225e5Sgerardnico         */
113*007225e5Sgerardnico        $canonicalKey = "";
114*007225e5Sgerardnico        $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl);
115*007225e5Sgerardnico        foreach ($event->data['link'] as $key => $link) {
116*007225e5Sgerardnico            if ($link["rel"] == "canonical") {
117*007225e5Sgerardnico                $canonicalKey = $key;
118*007225e5Sgerardnico            }
119*007225e5Sgerardnico        }
120*007225e5Sgerardnico        if ($canonicalKey != "") {
121*007225e5Sgerardnico            // Update
122*007225e5Sgerardnico            $event->data['link'][$canonicalKey] = $canonicalRelArray;
123*007225e5Sgerardnico        } else {
124*007225e5Sgerardnico            // Add
125*007225e5Sgerardnico            $event->data['link'][] = $canonicalRelArray;
126*007225e5Sgerardnico        }
127*007225e5Sgerardnico
128*007225e5Sgerardnico        /**
129*007225e5Sgerardnico         * Add the Og canonical meta
130*007225e5Sgerardnico         * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/
131*007225e5Sgerardnico         */
132*007225e5Sgerardnico        $canonicalOgKeyKey = "";
133*007225e5Sgerardnico        $canonicalPropertyKey = "og:url";
134*007225e5Sgerardnico        $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl);
135*007225e5Sgerardnico        foreach ($event->data['meta'] as $key => $meta) {
136*007225e5Sgerardnico            if ($meta["property"] == $canonicalPropertyKey) {
137*007225e5Sgerardnico                $canonicalOgKeyKey = $key;
138*007225e5Sgerardnico            }
139*007225e5Sgerardnico        }
140*007225e5Sgerardnico        if ($canonicalOgKeyKey != "") {
141*007225e5Sgerardnico            // Update
142*007225e5Sgerardnico            $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray;
143*007225e5Sgerardnico        } else {
144*007225e5Sgerardnico            // Add
145*007225e5Sgerardnico            $event->data['meta'][] = $canonicalOgArray;
146*007225e5Sgerardnico        }
147*007225e5Sgerardnico
148*007225e5Sgerardnico    }
149*007225e5Sgerardnico
150*007225e5Sgerardnico}
151