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 45007225e5Sgerardnico 46*9da76789Sgerardnico if ($_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php"){ 47*9da76789Sgerardnico // $ID is null 48*9da76789Sgerardnico return; 49*9da76789Sgerardnico } 50*9da76789Sgerardnico 51*9da76789Sgerardnico global $ID; 52*9da76789Sgerardnico $page = new Page($ID); 53*9da76789Sgerardnico 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 7371f916b9Sgerardnico $canonical = MetadataUtility::getMeta(Page::CANONICAL_PROPERTY); 74007225e5Sgerardnico 75007225e5Sgerardnico /** 76007225e5Sgerardnico * The last part of the id as canonical 77007225e5Sgerardnico */ 78007225e5Sgerardnico // How many last parts are taken into account in the canonical processing (2 by default) 79007225e5Sgerardnico $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0); 80007225e5Sgerardnico if ($canonical == null && $canonicalLastNamesCount > 0) { 81007225e5Sgerardnico /** 82007225e5Sgerardnico * Takes the last names part 83007225e5Sgerardnico */ 84c25e802bSgerardnico $names = $page->getNames(); 85c25e802bSgerardnico $namesLength = sizeof($names); 86007225e5Sgerardnico if ($namesLength > $canonicalLastNamesCount) { 87007225e5Sgerardnico $names = array_slice($names, $namesLength - $canonicalLastNamesCount); 88007225e5Sgerardnico } 89007225e5Sgerardnico /** 90007225e5Sgerardnico * If this is a start page, delete the name 91007225e5Sgerardnico * ie javascript:start will become javascript 92007225e5Sgerardnico */ 93c25e802bSgerardnico if ($page->isStartPage()) { 94007225e5Sgerardnico $names = array_slice($names, 0, $namesLength - 1); 95007225e5Sgerardnico } 96007225e5Sgerardnico $canonical = implode(":", $names); 9771f916b9Sgerardnico p_set_metadata($ID, array(Page::CANONICAL_PROPERTY => $canonical)); 98007225e5Sgerardnico } 99007225e5Sgerardnico 10071f916b9Sgerardnico $canonicalUrl = Page::getUrl($canonical); 101007225e5Sgerardnico 102007225e5Sgerardnico /** 103007225e5Sgerardnico * Replace the meta entry 104007225e5Sgerardnico * 105007225e5Sgerardnico * First search the key of the meta array 106007225e5Sgerardnico */ 107007225e5Sgerardnico $canonicalKey = ""; 108007225e5Sgerardnico $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl); 109007225e5Sgerardnico foreach ($event->data['link'] as $key => $link) { 110007225e5Sgerardnico if ($link["rel"] == "canonical") { 111007225e5Sgerardnico $canonicalKey = $key; 112007225e5Sgerardnico } 113007225e5Sgerardnico } 114007225e5Sgerardnico if ($canonicalKey != "") { 115007225e5Sgerardnico // Update 116007225e5Sgerardnico $event->data['link'][$canonicalKey] = $canonicalRelArray; 117007225e5Sgerardnico } else { 118007225e5Sgerardnico // Add 119007225e5Sgerardnico $event->data['link'][] = $canonicalRelArray; 120007225e5Sgerardnico } 121007225e5Sgerardnico 122007225e5Sgerardnico /** 123007225e5Sgerardnico * Add the Og canonical meta 124007225e5Sgerardnico * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/ 125007225e5Sgerardnico */ 126007225e5Sgerardnico $canonicalOgKeyKey = ""; 127007225e5Sgerardnico $canonicalPropertyKey = "og:url"; 128007225e5Sgerardnico $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl); 129007225e5Sgerardnico foreach ($event->data['meta'] as $key => $meta) { 130007225e5Sgerardnico if ($meta["property"] == $canonicalPropertyKey) { 131007225e5Sgerardnico $canonicalOgKeyKey = $key; 132007225e5Sgerardnico } 133007225e5Sgerardnico } 134007225e5Sgerardnico if ($canonicalOgKeyKey != "") { 135007225e5Sgerardnico // Update 136007225e5Sgerardnico $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray; 137007225e5Sgerardnico } else { 138007225e5Sgerardnico // Add 139007225e5Sgerardnico $event->data['meta'][] = $canonicalOgArray; 140007225e5Sgerardnico } 141007225e5Sgerardnico 142007225e5Sgerardnico } 143007225e5Sgerardnico 144007225e5Sgerardnico} 145