1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3007225e5Sgerardnicouse ComboStrap\MetadataUtility; 4007225e5Sgerardnicouse ComboStrap\PluginUtility; 571f916b9Sgerardnicouse ComboStrap\Page; 6007225e5Sgerardnico 7007225e5Sgerardnicoif (!defined('DOKU_INC')) die(); 8007225e5Sgerardnico 9007225e5Sgerardnico/** 10007225e5Sgerardnico * 11007225e5Sgerardnico * 12007225e5Sgerardnico */ 13007225e5Sgerardnicoclass action_plugin_combo_metacanonical extends DokuWiki_Action_Plugin 14007225e5Sgerardnico{ 15007225e5Sgerardnico 16007225e5Sgerardnico /** 17007225e5Sgerardnico * The conf 18007225e5Sgerardnico */ 19007225e5Sgerardnico const CANONICAL_LAST_NAMES_COUNT_CONF = 'MinimalNamesCountForAutomaticCanonical'; 20007225e5Sgerardnico 21007225e5Sgerardnico 22007225e5Sgerardnico function __construct() 23007225e5Sgerardnico { 24007225e5Sgerardnico // enable direct access to language strings 25007225e5Sgerardnico // ie $this->lang 26007225e5Sgerardnico $this->setupLocale(); 27007225e5Sgerardnico } 28007225e5Sgerardnico 29007225e5Sgerardnico public function register(Doku_Event_Handler $controller) 30007225e5Sgerardnico { 31*85e82846SNickeau /** 32*85e82846SNickeau * https://www.dokuwiki.org/devel:event:tpl_metaheader_output 33*85e82846SNickeau */ 34007225e5Sgerardnico $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaCanonicalProcessing', array()); 35007225e5Sgerardnico } 36007225e5Sgerardnico 37007225e5Sgerardnico /** 38007225e5Sgerardnico * Dokuwiki has already a canonical methodology 39007225e5Sgerardnico * https://www.dokuwiki.org/canonical 40007225e5Sgerardnico * 41007225e5Sgerardnico * @param $event 42007225e5Sgerardnico */ 43007225e5Sgerardnico function metaCanonicalProcessing($event) 44007225e5Sgerardnico { 45007225e5Sgerardnico 465f891b7eSNickeau global $ID; 475f891b7eSNickeau if (empty($ID)){ 485f891b7eSNickeau // $_SERVER['SCRIPT_NAME']== "/lib/exe/mediamanager.php" 499da76789Sgerardnico // $ID is null 509da76789Sgerardnico return; 519da76789Sgerardnico } 529da76789Sgerardnico 53*85e82846SNickeau $page = Page::createPageFromId($ID); 549da76789Sgerardnico 55007225e5Sgerardnico /** 56531e725cSNickeau * No canonical for slot page 57007225e5Sgerardnico */ 58531e725cSNickeau if ($page->isSlot()) { 59007225e5Sgerardnico return; 60007225e5Sgerardnico } 61007225e5Sgerardnico 62007225e5Sgerardnico /** 63007225e5Sgerardnico * Where do we pick the canonical URL 64007225e5Sgerardnico */ 65007225e5Sgerardnico /** 66007225e5Sgerardnico * Canonical from meta 67007225e5Sgerardnico * 68007225e5Sgerardnico * FYI: The creation of the link was extracted from 69007225e5Sgerardnico * {@link wl()} that call {@link idfilter()} that performs just a replacement 70007225e5Sgerardnico * Calling the wl function will not work because 71007225e5Sgerardnico * {@link wl()} use the constant DOKU_URL that is set before any test via getBaseURL(true) 72007225e5Sgerardnico */ 73007225e5Sgerardnico 74007225e5Sgerardnico 755f891b7eSNickeau $canonicalUrl = $page->getCanonicalUrlOrDefault(); 76007225e5Sgerardnico 77007225e5Sgerardnico /** 78007225e5Sgerardnico * Replace the meta entry 79007225e5Sgerardnico * 80007225e5Sgerardnico * First search the key of the meta array 81007225e5Sgerardnico */ 82007225e5Sgerardnico $canonicalKey = ""; 83007225e5Sgerardnico $canonicalRelArray = array("rel" => "canonical", "href" => $canonicalUrl); 84007225e5Sgerardnico foreach ($event->data['link'] as $key => $link) { 85007225e5Sgerardnico if ($link["rel"] == "canonical") { 86007225e5Sgerardnico $canonicalKey = $key; 87007225e5Sgerardnico } 88007225e5Sgerardnico } 89007225e5Sgerardnico if ($canonicalKey != "") { 90007225e5Sgerardnico // Update 91007225e5Sgerardnico $event->data['link'][$canonicalKey] = $canonicalRelArray; 92007225e5Sgerardnico } else { 93007225e5Sgerardnico // Add 94007225e5Sgerardnico $event->data['link'][] = $canonicalRelArray; 95007225e5Sgerardnico } 96007225e5Sgerardnico 97007225e5Sgerardnico /** 98007225e5Sgerardnico * Add the Og canonical meta 99007225e5Sgerardnico * https://developers.facebook.com/docs/sharing/webmasters/getting-started/versioned-link/ 100007225e5Sgerardnico */ 101007225e5Sgerardnico $canonicalOgKeyKey = ""; 102007225e5Sgerardnico $canonicalPropertyKey = "og:url"; 103007225e5Sgerardnico $canonicalOgArray = array("property" => $canonicalPropertyKey, "content" => $canonicalUrl); 104ebdc69ceSgerardnico // Search if the canonical property is already present 105007225e5Sgerardnico foreach ($event->data['meta'] as $key => $meta) { 106ebdc69ceSgerardnico if (array_key_exists("property",$meta)) { 107ebdc69ceSgerardnico /** 108ebdc69ceSgerardnico * We may have several properties 109ebdc69ceSgerardnico */ 110007225e5Sgerardnico if ($meta["property"] == $canonicalPropertyKey) { 111007225e5Sgerardnico $canonicalOgKeyKey = $key; 112007225e5Sgerardnico } 113007225e5Sgerardnico } 114ebdc69ceSgerardnico } 115007225e5Sgerardnico if ($canonicalOgKeyKey != "") { 116007225e5Sgerardnico // Update 117007225e5Sgerardnico $event->data['meta'][$canonicalOgKeyKey] = $canonicalOgArray; 118007225e5Sgerardnico } else { 119007225e5Sgerardnico // Add 120007225e5Sgerardnico $event->data['meta'][] = $canonicalOgArray; 121007225e5Sgerardnico } 122007225e5Sgerardnico 123007225e5Sgerardnico } 124007225e5Sgerardnico 125007225e5Sgerardnico} 126