1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3007225e5Sgerardnicouse ComboStrap\MetadataUtility; 4007225e5Sgerardnicouse ComboStrap\PluginUtility; 5*71f916b9Sgerardnicouse 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 global $ID; 45007225e5Sgerardnico global $conf; 46007225e5Sgerardnico 47007225e5Sgerardnico /** 48007225e5Sgerardnico * Split the id by : 49007225e5Sgerardnico */ 50007225e5Sgerardnico $names = preg_split("/:/", $ID); 51007225e5Sgerardnico $namesLength = sizeOf($names); 52007225e5Sgerardnico 53007225e5Sgerardnico /** 54007225e5Sgerardnico * No canonical for bars 55007225e5Sgerardnico */ 56007225e5Sgerardnico $bars = array($conf['sidebar']); 57007225e5Sgerardnico $strapTemplateName = 'strap'; 58007225e5Sgerardnico if ($conf['template'] === $strapTemplateName) { 59007225e5Sgerardnico $bars[] = $conf['tpl'][$strapTemplateName]['headerbar']; 60007225e5Sgerardnico $bars[] = $conf['tpl'][$strapTemplateName]['footerbar']; 61007225e5Sgerardnico $bars[] = $conf['tpl'][$strapTemplateName]['sidekickbar']; 62007225e5Sgerardnico } 63007225e5Sgerardnico if (in_array($names[$namesLength - 1], $bars)) { 64007225e5Sgerardnico return; 65007225e5Sgerardnico } 66007225e5Sgerardnico 67007225e5Sgerardnico /** 68007225e5Sgerardnico * Where do we pick the canonical URL 69007225e5Sgerardnico */ 70007225e5Sgerardnico 71007225e5Sgerardnico 72007225e5Sgerardnico /** 73007225e5Sgerardnico * Canonical from meta 74007225e5Sgerardnico * 75007225e5Sgerardnico * FYI: The creation of the link was extracted from 76007225e5Sgerardnico * {@link wl()} that call {@link idfilter()} that performs just a replacement 77007225e5Sgerardnico * Calling the wl function will not work because 78007225e5Sgerardnico * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true) 79007225e5Sgerardnico */ 80007225e5Sgerardnico 81*71f916b9Sgerardnico $canonical = MetadataUtility::getMeta(Page::CANONICAL_PROPERTY); 82007225e5Sgerardnico 83007225e5Sgerardnico /** 84007225e5Sgerardnico * The last part of the id as canonical 85007225e5Sgerardnico */ 86007225e5Sgerardnico // How many last parts are taken into account in the canonical processing (2 by default) 87007225e5Sgerardnico $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0); 88007225e5Sgerardnico if ($canonical == null && $canonicalLastNamesCount > 0) { 89007225e5Sgerardnico /** 90007225e5Sgerardnico * Takes the last names part 91007225e5Sgerardnico */ 92007225e5Sgerardnico if ($namesLength > $canonicalLastNamesCount) { 93007225e5Sgerardnico $names = array_slice($names, $namesLength - $canonicalLastNamesCount); 94007225e5Sgerardnico } 95007225e5Sgerardnico /** 96007225e5Sgerardnico * If this is a start page, delete the name 97007225e5Sgerardnico * ie javascript:start will become javascript 98007225e5Sgerardnico */ 99007225e5Sgerardnico if ($names[$namesLength - 1] == $conf['start']) { 100007225e5Sgerardnico $names = array_slice($names, 0, $namesLength - 1); 101007225e5Sgerardnico } 102007225e5Sgerardnico $canonical = implode(":", $names); 103*71f916b9Sgerardnico p_set_metadata($ID, array(Page::CANONICAL_PROPERTY => $canonical)); 104007225e5Sgerardnico } 105007225e5Sgerardnico 106*71f916b9Sgerardnico $canonicalUrl = Page::getUrl($canonical); 107007225e5Sgerardnico 108007225e5Sgerardnico /** 109007225e5Sgerardnico * Replace the meta entry 110007225e5Sgerardnico * 111007225e5Sgerardnico * First search the key of the meta array 112007225e5Sgerardnico */ 113007225e5Sgerardnico $canonicalKey = ""; 114007225e5Sgerardnico $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl); 115007225e5Sgerardnico foreach ($event->data['link'] as $key => $link) { 116007225e5Sgerardnico if ($link["rel"] == "canonical") { 117007225e5Sgerardnico $canonicalKey = $key; 118007225e5Sgerardnico } 119007225e5Sgerardnico } 120007225e5Sgerardnico if ($canonicalKey != "") { 121007225e5Sgerardnico // Update 122007225e5Sgerardnico $event->data['link'][$canonicalKey] = $canonicalRelArray; 123007225e5Sgerardnico } else { 124007225e5Sgerardnico // Add 125007225e5Sgerardnico $event->data['link'][] = $canonicalRelArray; 126007225e5Sgerardnico } 127007225e5Sgerardnico 128007225e5Sgerardnico /** 129007225e5Sgerardnico * Add the Og canonical meta 130007225e5Sgerardnico * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/ 131007225e5Sgerardnico */ 132007225e5Sgerardnico $canonicalOgKeyKey = ""; 133007225e5Sgerardnico $canonicalPropertyKey = "og:url"; 134007225e5Sgerardnico $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl); 135007225e5Sgerardnico foreach ($event->data['meta'] as $key => $meta) { 136007225e5Sgerardnico if ($meta["property"] == $canonicalPropertyKey) { 137007225e5Sgerardnico $canonicalOgKeyKey = $key; 138007225e5Sgerardnico } 139007225e5Sgerardnico } 140007225e5Sgerardnico if ($canonicalOgKeyKey != "") { 141007225e5Sgerardnico // Update 142007225e5Sgerardnico $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray; 143007225e5Sgerardnico } else { 144007225e5Sgerardnico // Add 145007225e5Sgerardnico $event->data['meta'][] = $canonicalOgArray; 146007225e5Sgerardnico } 147007225e5Sgerardnico 148007225e5Sgerardnico } 149007225e5Sgerardnico 150007225e5Sgerardnico} 151