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