1007225e5Sgerardnico<?php 2007225e5Sgerardnico 3*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 4*04fd306cSNickeauuse ComboStrap\ExecutionContext; 5007225e5Sgerardnicouse ComboStrap\LogUtility; 6*04fd306cSNickeauuse ComboStrap\MarkupPath; 7*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 8007225e5Sgerardnico 9007225e5Sgerardnico 10007225e5Sgerardnico/** 11007225e5Sgerardnico * Take the metadata description 12007225e5Sgerardnico * 13c3437056SNickeau * To known more about description and [[docs:seo:seo|search engine optimization]], see: 14c3437056SNickeau * [[https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/The_head_metadata_in_HTML#Active_learning_The_descriptions_use_in_search_engines|Active learning: The description's use in search engines]]. 15c3437056SNickeau * [[https://developers.google.com/search/docs/beginner/seo-starter-guide#use-the-description-meta-tag|Description section of the Google SEO Starter guide]] 16007225e5Sgerardnico */ 17007225e5Sgerardnicoclass action_plugin_combo_metadescription extends DokuWiki_Action_Plugin 18007225e5Sgerardnico{ 19007225e5Sgerardnico 20007225e5Sgerardnico const DESCRIPTION_META_KEY = 'description'; 21c3437056SNickeau const FACEBOOK_DESCRIPTION_PROPERTY = 'og:description'; 22007225e5Sgerardnico 23007225e5Sgerardnico public function register(Doku_Event_Handler $controller) 24007225e5Sgerardnico { 25007225e5Sgerardnico $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'description_modification', array()); 26007225e5Sgerardnico } 27007225e5Sgerardnico 28007225e5Sgerardnico /** 29007225e5Sgerardnico * Add a meta-data description 305f891b7eSNickeau * @param $event 315f891b7eSNickeau * @param $param 32007225e5Sgerardnico */ 33007225e5Sgerardnico function description_modification(&$event, $param) 34007225e5Sgerardnico { 35007225e5Sgerardnico 36*04fd306cSNickeau try { 37*04fd306cSNickeau $pageTemplate = ExecutionContext::getActualOrCreateFromEnv() 38*04fd306cSNickeau ->getExecutingPageTemplate(); 39*04fd306cSNickeau } catch (ExceptionNotFound $e) { 40*04fd306cSNickeau return; 41*04fd306cSNickeau } 42*04fd306cSNickeau 43*04fd306cSNickeau if(!$pageTemplate->isSocial()){ 44*04fd306cSNickeau return; 455f891b7eSNickeau } 46007225e5Sgerardnico 47007225e5Sgerardnico /** 48007225e5Sgerardnico * Description 49007225e5Sgerardnico * https://www.dokuwiki.org/devel:metadata 50007225e5Sgerardnico */ 51*04fd306cSNickeau try { 52*04fd306cSNickeau $wikiPath = $pageTemplate->getRequestedContextPath(); 53*04fd306cSNickeau } catch (ExceptionNotFound $e) { 54*04fd306cSNickeau LogUtility::internalError("A social template should have a path"); 55*04fd306cSNickeau return; 56*04fd306cSNickeau } 57*04fd306cSNickeau 58*04fd306cSNickeau $page = MarkupPath::createPageFromPathObject($wikiPath); 59007225e5Sgerardnico 605f891b7eSNickeau $description = $page->getDescriptionOrElseDokuWiki(); 61007225e5Sgerardnico if (empty($description)) { 62*04fd306cSNickeau $this->sendDestInfo($wikiPath->getWikiId()); 63007225e5Sgerardnico return; 64007225e5Sgerardnico } 65007225e5Sgerardnico 66007225e5Sgerardnico // Add it to the meta 67c3437056SNickeau Metadata::upsertMetaOnUniqueAttribute( 68c3437056SNickeau $event->data['meta'], 69c3437056SNickeau "name", 70c3437056SNickeau [ 71c3437056SNickeau "name" => self::DESCRIPTION_META_KEY, 72c3437056SNickeau "content" => $description 73c3437056SNickeau ] 74c3437056SNickeau ); 75c3437056SNickeau Metadata::upsertMetaOnUniqueAttribute( 76c3437056SNickeau $event->data['meta'], 77c3437056SNickeau "property", 78c3437056SNickeau [ 79c3437056SNickeau "property" => self::FACEBOOK_DESCRIPTION_PROPERTY, 80c3437056SNickeau "content" => $description 81c3437056SNickeau ] 82c3437056SNickeau ); 83c3437056SNickeau 84007225e5Sgerardnico 85007225e5Sgerardnico 86007225e5Sgerardnico } 87007225e5Sgerardnico 88007225e5Sgerardnico /** 89007225e5Sgerardnico * Just send a test info 90007225e5Sgerardnico * @param $ID 91007225e5Sgerardnico */ 92007225e5Sgerardnico public function sendDestInfo($ID) 93007225e5Sgerardnico { 94007225e5Sgerardnico if (defined('DOKU_UNITTEST')) { 95007225e5Sgerardnico // When you make a admin test call, the page ID = start and there is no meta 96007225e5Sgerardnico // When there is only an icon, there is also no meta 97007225e5Sgerardnico global $INPUT; 98007225e5Sgerardnico $showActions = ["show", ""]; // Empty for the test 99007225e5Sgerardnico if (in_array($INPUT->str("do"), $showActions)) { 100007225e5Sgerardnico LogUtility::msg("Page ($ID): The description should never be null when rendering the page", LogUtility::LVL_MSG_INFO); 101007225e5Sgerardnico } 102007225e5Sgerardnico } 103007225e5Sgerardnico } 104007225e5Sgerardnico 105007225e5Sgerardnico 106007225e5Sgerardnico} 107