15f891b7eSNickeau<?php 25f891b7eSNickeau 35f891b7eSNickeauuse ComboStrap\Image; 45f891b7eSNickeauuse ComboStrap\LogUtility; 55f891b7eSNickeauuse ComboStrap\MetadataUtility; 65f891b7eSNickeauuse ComboStrap\PluginUtility; 75f891b7eSNickeauuse ComboStrap\Page; 85f891b7eSNickeauuse ComboStrap\Site; 95f891b7eSNickeauuse ComboStrap\StringUtility; 105f891b7eSNickeau 115f891b7eSNickeauif (!defined('DOKU_INC')) die(); 125f891b7eSNickeau 135f891b7eSNickeaurequire_once(__DIR__ . '/../class/Site.php'); 145f891b7eSNickeaurequire_once(__DIR__ . '/../class/Image.php'); 155f891b7eSNickeau 165f891b7eSNickeau/** 175f891b7eSNickeau * 185f891b7eSNickeau * For the canonical meta, see {@link action_plugin_combo_metacanonical} 195f891b7eSNickeau * 205f891b7eSNickeau * Inspiration, reference: 215f891b7eSNickeau * https://developers.facebook.com/docs/sharing/webmasters 225f891b7eSNickeau * https://github.com/twbs/bootstrap/blob/v4-dev/site/layouts/partials/social.html 235f891b7eSNickeau * https://github.com/mprins/dokuwiki-plugin-socialcards/blob/master/action.php 245f891b7eSNickeau */ 255f891b7eSNickeauclass action_plugin_combo_metafacebook extends DokuWiki_Action_Plugin 265f891b7eSNickeau{ 275f891b7eSNickeau 285f891b7eSNickeau const FACEBOOK_APP_ID = "486120022012342"; 295f891b7eSNickeau 305f891b7eSNickeau /** 315f891b7eSNickeau * The image 325f891b7eSNickeau */ 335f891b7eSNickeau const CONF_DEFAULT_FACEBOOK_IMAGE = "defaultFacebookImage"; 345f891b7eSNickeau 355f891b7eSNickeau 365f891b7eSNickeau const CANONICAL = "facebook"; 375f891b7eSNickeau 385f891b7eSNickeau 395f891b7eSNickeau function __construct() 405f891b7eSNickeau { 415f891b7eSNickeau // enable direct access to language strings 425f891b7eSNickeau // ie $this->lang 435f891b7eSNickeau $this->setupLocale(); 445f891b7eSNickeau } 455f891b7eSNickeau 465f891b7eSNickeau public function register(Doku_Event_Handler $controller) 475f891b7eSNickeau { 485f891b7eSNickeau $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaFacebookProcessing', array()); 495f891b7eSNickeau } 505f891b7eSNickeau 515f891b7eSNickeau /** 525f891b7eSNickeau * 535f891b7eSNickeau * @param $event 545f891b7eSNickeau */ 555f891b7eSNickeau function metaFacebookProcessing($event) 565f891b7eSNickeau { 575f891b7eSNickeau 585f891b7eSNickeau global $ID; 595f891b7eSNickeau if (empty($ID)) { 605f891b7eSNickeau // $ID is null for media 615f891b7eSNickeau return; 625f891b7eSNickeau } 635f891b7eSNickeau 645f891b7eSNickeau 655f891b7eSNickeau $page = new Page($ID); 66*dd39a644Sgerardnico if(!$page->existInFs()){ 67*dd39a644Sgerardnico return; 68*dd39a644Sgerardnico } 695f891b7eSNickeau /** 705f891b7eSNickeau * No social for bars 715f891b7eSNickeau */ 725f891b7eSNickeau if ($page->isBar()) { 735f891b7eSNickeau return; 745f891b7eSNickeau } 755f891b7eSNickeau 765f891b7eSNickeau 775f891b7eSNickeau /** 785f891b7eSNickeau * "og:url" is already created in the {@link action_plugin_combo_metacanonical} 795f891b7eSNickeau * "og:description" is already created in the {@link action_plugin_combo_metadescription} 805f891b7eSNickeau */ 815f891b7eSNickeau $facebookMeta = array( 825f891b7eSNickeau "og:title" => StringUtility::truncateString($page->getTitleNotEmpty(), 70), 8352206542Sgerardnico "og:description" => $page->getDescriptionOrElseDokuWiki(), 845f891b7eSNickeau ); 855f891b7eSNickeau 865f891b7eSNickeau $title = Site::getTitle(); 875f891b7eSNickeau if (!empty($title)) { 885f891b7eSNickeau $facebookMeta["og:site_name"] = $title; 895f891b7eSNickeau } 905f891b7eSNickeau 915f891b7eSNickeau /** 925f891b7eSNickeau * Type of page 935f891b7eSNickeau */ 945f891b7eSNickeau $ogType = $page->getType(); 955f891b7eSNickeau if (!empty($ogType)) { 965f891b7eSNickeau $facebookMeta["og:type"] = $ogType; 975f891b7eSNickeau } else { 985f891b7eSNickeau // The default facebook value 995f891b7eSNickeau $facebookMeta["og:type"] = Page::WEBSITE_TYPE; 1005f891b7eSNickeau } 1015f891b7eSNickeau 1025f891b7eSNickeau if ($ogType == Page::ARTICLE_TYPE) { 1035f891b7eSNickeau // https://ogp.me/#type_article 1045f891b7eSNickeau $facebookMeta["article:published_time"] = date("c", $page->getPublishedElseCreationTimeStamp()); 1055f891b7eSNickeau $facebookMeta["article:modified_time"] = date("c", $page->getModifiedTimestamp()); 1065f891b7eSNickeau } 1075f891b7eSNickeau 1085f891b7eSNickeau /** 1095f891b7eSNickeau * @var Image[] 1105f891b7eSNickeau */ 1115f891b7eSNickeau $facebookImages = $page->getImageSet(); 1125f891b7eSNickeau if (empty($facebookImages)) { 1135f891b7eSNickeau $defaultFacebookImage = cleanID(PluginUtility::getConfValue(self::CONF_DEFAULT_FACEBOOK_IMAGE)); 1145f891b7eSNickeau if (!empty($defaultFacebookImage)) { 1155f891b7eSNickeau $image = new Image($defaultFacebookImage); 1165f891b7eSNickeau if ($image->exists()) { 1175f891b7eSNickeau $facebookImages[] = $image; 1185f891b7eSNickeau } else { 1195f891b7eSNickeau if ($defaultFacebookImage != "logo-facebook.png") { 1205f891b7eSNickeau LogUtility::msg("The default facebook image ($defaultFacebookImage) does not exist", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1215f891b7eSNickeau } 1225f891b7eSNickeau } 1235f891b7eSNickeau 1245f891b7eSNickeau 1255f891b7eSNickeau } 1265f891b7eSNickeau } 1275f891b7eSNickeau if (!empty($facebookImages)) { 1285f891b7eSNickeau foreach ($facebookImages as $facebookImage) { 1295f891b7eSNickeau 1305f891b7eSNickeau if (!$facebookImage->exists()) { 1315f891b7eSNickeau LogUtility::msg("The image ($facebookImage) does not exist and was not added", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1325f891b7eSNickeau } else { 1335f891b7eSNickeau 1345f891b7eSNickeau $toSmall = false; 1355f891b7eSNickeau if ($facebookImage->isAnalyzable()) { 1365f891b7eSNickeau 1375f891b7eSNickeau // There is a minimum size constraint of 200px by 200px 1385f891b7eSNickeau if ($facebookImage->getWidth() < 200) { 1395f891b7eSNickeau $toSmall = true; 1405f891b7eSNickeau } else { 1415f891b7eSNickeau $facebookMeta["og:image:width"] = $facebookImage->getWidth(); 1425f891b7eSNickeau if ($facebookImage->getHeight() < 200) { 1435f891b7eSNickeau $toSmall = true; 1445f891b7eSNickeau } else { 1455f891b7eSNickeau $facebookMeta["og:image:height"] = $facebookImage->getHeight(); 1465f891b7eSNickeau } 1475f891b7eSNickeau } 1485f891b7eSNickeau } 1495f891b7eSNickeau 1505f891b7eSNickeau if ($toSmall) { 1515f891b7eSNickeau $message = "The facebook image ($facebookImage) is too small (" . $facebookImage->getWidth() . " x " . $facebookImage->getHeight() . "). The minimum size constraint is 200px by 200px"; 1525f891b7eSNickeau if ($facebookImage->getId() != $page->getFirstImage()->getId()) { 1535f891b7eSNickeau LogUtility::msg($message, LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1545f891b7eSNickeau } else { 1555f891b7eSNickeau LogUtility::log2BrowserConsole($message); 1565f891b7eSNickeau } 1575f891b7eSNickeau } 1585f891b7eSNickeau 1595f891b7eSNickeau 1605f891b7eSNickeau /** 1615f891b7eSNickeau * We may don't known the dimensions 1625f891b7eSNickeau */ 1635f891b7eSNickeau if (!$toSmall) { 1645f891b7eSNickeau $mime = $facebookImage->getMime(); 1655f891b7eSNickeau if (!empty($mime)) { 1665f891b7eSNickeau $facebookMeta["og:image:type"] = $mime[1]; 1675f891b7eSNickeau } 1685f891b7eSNickeau $facebookMeta["og:image"] = $facebookImage->getUrl(); 1695f891b7eSNickeau // One image only 1705f891b7eSNickeau break; 1715f891b7eSNickeau } 1725f891b7eSNickeau } 1735f891b7eSNickeau 1745f891b7eSNickeau } 1755f891b7eSNickeau } 1765f891b7eSNickeau 1775f891b7eSNickeau 1785f891b7eSNickeau $facebookMeta["fb:app_id"] = self::FACEBOOK_APP_ID; 1795f891b7eSNickeau 1805f891b7eSNickeau $lang = $page->getLang(); 1815f891b7eSNickeau if (!empty($lang)) { 1825f891b7eSNickeau 1835f891b7eSNickeau $country = $page->getCountry(); 1845f891b7eSNickeau if (empty($country)) { 1855f891b7eSNickeau $country = $lang; 1865f891b7eSNickeau } 1875f891b7eSNickeau $facebookMeta["og:locale"] = $lang . "_" . strtoupper($country); 1885f891b7eSNickeau 1895f891b7eSNickeau } else { 1905f891b7eSNickeau 1915f891b7eSNickeau // The Facebook default 1925f891b7eSNickeau $facebookMeta["og:locale"] = "en_US"; 1935f891b7eSNickeau 1945f891b7eSNickeau } 1955f891b7eSNickeau 1965f891b7eSNickeau /** 1975f891b7eSNickeau * Add the properties 1985f891b7eSNickeau */ 1995f891b7eSNickeau foreach ($facebookMeta as $property => $content) { 2005f891b7eSNickeau $event->data['meta'][] = array("property" => $property, "content" => $content); 2015f891b7eSNickeau } 2025f891b7eSNickeau 2035f891b7eSNickeau 2045f891b7eSNickeau } 2055f891b7eSNickeau 2065f891b7eSNickeau} 207