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 global $ID; 45007225e5Sgerardnico global $conf; 46007225e5Sgerardnico 47007225e5Sgerardnico 48007225e5Sgerardnico /** 49007225e5Sgerardnico * No canonical for bars 50007225e5Sgerardnico */ 51*c25e802bSgerardnico $page = new Page($ID); 52*c25e802bSgerardnico 53*c25e802bSgerardnico if ($page->isBar()) { 54007225e5Sgerardnico return; 55007225e5Sgerardnico } 56007225e5Sgerardnico 57007225e5Sgerardnico /** 58007225e5Sgerardnico * Where do we pick the canonical URL 59007225e5Sgerardnico */ 60007225e5Sgerardnico /** 61007225e5Sgerardnico * Canonical from meta 62007225e5Sgerardnico * 63007225e5Sgerardnico * FYI: The creation of the link was extracted from 64007225e5Sgerardnico * {@link wl()} that call {@link idfilter()} that performs just a replacement 65007225e5Sgerardnico * Calling the wl function will not work because 66007225e5Sgerardnico * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true) 67007225e5Sgerardnico */ 68007225e5Sgerardnico 6971f916b9Sgerardnico $canonical = MetadataUtility::getMeta(Page::CANONICAL_PROPERTY); 70007225e5Sgerardnico 71007225e5Sgerardnico /** 72007225e5Sgerardnico * The last part of the id as canonical 73007225e5Sgerardnico */ 74007225e5Sgerardnico // How many last parts are taken into account in the canonical processing (2 by default) 75007225e5Sgerardnico $canonicalLastNamesCount = $this->getConf(self::CANONICAL_LAST_NAMES_COUNT_CONF, 0); 76007225e5Sgerardnico if ($canonical == null && $canonicalLastNamesCount > 0) { 77007225e5Sgerardnico /** 78007225e5Sgerardnico * Takes the last names part 79007225e5Sgerardnico */ 80*c25e802bSgerardnico $names = $page->getNames(); 81*c25e802bSgerardnico $namesLength = sizeof($names); 82007225e5Sgerardnico if ($namesLength > $canonicalLastNamesCount) { 83007225e5Sgerardnico $names = array_slice($names, $namesLength - $canonicalLastNamesCount); 84007225e5Sgerardnico } 85007225e5Sgerardnico /** 86007225e5Sgerardnico * If this is a start page, delete the name 87007225e5Sgerardnico * ie javascript:start will become javascript 88007225e5Sgerardnico */ 89*c25e802bSgerardnico if ($page->isStartPage()) { 90007225e5Sgerardnico $names = array_slice($names, 0, $namesLength - 1); 91007225e5Sgerardnico } 92007225e5Sgerardnico $canonical = implode(":", $names); 9371f916b9Sgerardnico p_set_metadata($ID, array(Page::CANONICAL_PROPERTY => $canonical)); 94007225e5Sgerardnico } 95007225e5Sgerardnico 9671f916b9Sgerardnico $canonicalUrl = Page::getUrl($canonical); 97007225e5Sgerardnico 98007225e5Sgerardnico /** 99007225e5Sgerardnico * Replace the meta entry 100007225e5Sgerardnico * 101007225e5Sgerardnico * First search the key of the meta array 102007225e5Sgerardnico */ 103007225e5Sgerardnico $canonicalKey = ""; 104007225e5Sgerardnico $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl); 105007225e5Sgerardnico foreach ($event->data['link'] as $key => $link) { 106007225e5Sgerardnico if ($link["rel"] == "canonical") { 107007225e5Sgerardnico $canonicalKey = $key; 108007225e5Sgerardnico } 109007225e5Sgerardnico } 110007225e5Sgerardnico if ($canonicalKey != "") { 111007225e5Sgerardnico // Update 112007225e5Sgerardnico $event->data['link'][$canonicalKey] = $canonicalRelArray; 113007225e5Sgerardnico } else { 114007225e5Sgerardnico // Add 115007225e5Sgerardnico $event->data['link'][] = $canonicalRelArray; 116007225e5Sgerardnico } 117007225e5Sgerardnico 118007225e5Sgerardnico /** 119007225e5Sgerardnico * Add the Og canonical meta 120007225e5Sgerardnico * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/ 121007225e5Sgerardnico */ 122007225e5Sgerardnico $canonicalOgKeyKey = ""; 123007225e5Sgerardnico $canonicalPropertyKey = "og:url"; 124007225e5Sgerardnico $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl); 125007225e5Sgerardnico foreach ($event->data['meta'] as $key => $meta) { 126007225e5Sgerardnico if ($meta["property"] == $canonicalPropertyKey) { 127007225e5Sgerardnico $canonicalOgKeyKey = $key; 128007225e5Sgerardnico } 129007225e5Sgerardnico } 130007225e5Sgerardnico if ($canonicalOgKeyKey != "") { 131007225e5Sgerardnico // Update 132007225e5Sgerardnico $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray; 133007225e5Sgerardnico } else { 134007225e5Sgerardnico // Add 135007225e5Sgerardnico $event->data['meta'][] = $canonicalOgArray; 136007225e5Sgerardnico } 137007225e5Sgerardnico 138007225e5Sgerardnico } 139007225e5Sgerardnico 140007225e5Sgerardnico} 141