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 455f891b7eSNickeau global $ID; 465f891b7eSNickeau if (empty($ID)){ 475f891b7eSNickeau // $_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php" 489da76789Sgerardnico // $ID is null 499da76789Sgerardnico return; 509da76789Sgerardnico } 519da76789Sgerardnico 529da76789Sgerardnico $page = new Page($ID); 539da76789Sgerardnico 54007225e5Sgerardnico /** 55*531e725cSNickeau * No canonical for slot page 56007225e5Sgerardnico */ 57*531e725cSNickeau if ($page->isSlot()) { 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 73007225e5Sgerardnico 745f891b7eSNickeau $canonicalUrl = $page->getCanonicalUrlOrDefault(); 75007225e5Sgerardnico 76007225e5Sgerardnico /** 77007225e5Sgerardnico * Replace the meta entry 78007225e5Sgerardnico * 79007225e5Sgerardnico * First search the key of the meta array 80007225e5Sgerardnico */ 81007225e5Sgerardnico $canonicalKey = ""; 82007225e5Sgerardnico $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl); 83007225e5Sgerardnico foreach ($event->data['link'] as $key => $link) { 84007225e5Sgerardnico if ($link["rel"] == "canonical") { 85007225e5Sgerardnico $canonicalKey = $key; 86007225e5Sgerardnico } 87007225e5Sgerardnico } 88007225e5Sgerardnico if ($canonicalKey != "") { 89007225e5Sgerardnico // Update 90007225e5Sgerardnico $event->data['link'][$canonicalKey] = $canonicalRelArray; 91007225e5Sgerardnico } else { 92007225e5Sgerardnico // Add 93007225e5Sgerardnico $event->data['link'][] = $canonicalRelArray; 94007225e5Sgerardnico } 95007225e5Sgerardnico 96007225e5Sgerardnico /** 97007225e5Sgerardnico * Add the Og canonical meta 98007225e5Sgerardnico * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/ 99007225e5Sgerardnico */ 100007225e5Sgerardnico $canonicalOgKeyKey = ""; 101007225e5Sgerardnico $canonicalPropertyKey = "og:url"; 102007225e5Sgerardnico $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl); 103ebdc69ceSgerardnico // Search if the canonical property is already present 104007225e5Sgerardnico foreach ($event->data['meta'] as $key => $meta) { 105ebdc69ceSgerardnico if (array_key_exists("property",$meta)) { 106ebdc69ceSgerardnico /** 107ebdc69ceSgerardnico * We may have several properties 108ebdc69ceSgerardnico */ 109007225e5Sgerardnico if ($meta["property"] == $canonicalPropertyKey) { 110007225e5Sgerardnico $canonicalOgKeyKey = $key; 111007225e5Sgerardnico } 112007225e5Sgerardnico } 113ebdc69ceSgerardnico } 114007225e5Sgerardnico if ($canonicalOgKeyKey != "") { 115007225e5Sgerardnico // Update 116007225e5Sgerardnico $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray; 117007225e5Sgerardnico } else { 118007225e5Sgerardnico // Add 119007225e5Sgerardnico $event->data['meta'][] = $canonicalOgArray; 120007225e5Sgerardnico } 121007225e5Sgerardnico 122007225e5Sgerardnico } 123007225e5Sgerardnico 124007225e5Sgerardnico} 125