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); 665f891b7eSNickeau 675f891b7eSNickeau /** 685f891b7eSNickeau * No social for bars 695f891b7eSNickeau */ 705f891b7eSNickeau if ($page->isBar()) { 715f891b7eSNickeau return; 725f891b7eSNickeau } 735f891b7eSNickeau 745f891b7eSNickeau 755f891b7eSNickeau /** 765f891b7eSNickeau * "og:url" is already created in the {@link action_plugin_combo_metacanonical} 775f891b7eSNickeau * "og:description" is already created in the {@link action_plugin_combo_metadescription} 785f891b7eSNickeau */ 795f891b7eSNickeau $facebookMeta = array( 805f891b7eSNickeau "og:title" => StringUtility::truncateString($page->getTitleNotEmpty(), 70), 81*52206542Sgerardnico "og:description" => $page->getDescriptionOrElseDokuWiki(), 825f891b7eSNickeau ); 835f891b7eSNickeau 845f891b7eSNickeau $title = Site::getTitle(); 855f891b7eSNickeau if (!empty($title)) { 865f891b7eSNickeau $facebookMeta["og:site_name"] = $title; 875f891b7eSNickeau } 885f891b7eSNickeau 895f891b7eSNickeau /** 905f891b7eSNickeau * Type of page 915f891b7eSNickeau */ 925f891b7eSNickeau $ogType = $page->getType(); 935f891b7eSNickeau if (!empty($ogType)) { 945f891b7eSNickeau $facebookMeta["og:type"] = $ogType; 955f891b7eSNickeau } else { 965f891b7eSNickeau // The default facebook value 975f891b7eSNickeau $facebookMeta["og:type"] = Page::WEBSITE_TYPE; 985f891b7eSNickeau } 995f891b7eSNickeau 1005f891b7eSNickeau if ($ogType == Page::ARTICLE_TYPE) { 1015f891b7eSNickeau // https://ogp.me/#type_article 1025f891b7eSNickeau $facebookMeta["article:published_time"] = date("c", $page->getPublishedElseCreationTimeStamp()); 1035f891b7eSNickeau $facebookMeta["article:modified_time"] = date("c", $page->getModifiedTimestamp()); 1045f891b7eSNickeau } 1055f891b7eSNickeau 1065f891b7eSNickeau /** 1075f891b7eSNickeau * @var Image[] 1085f891b7eSNickeau */ 1095f891b7eSNickeau $facebookImages = $page->getImageSet(); 1105f891b7eSNickeau if (empty($facebookImages)) { 1115f891b7eSNickeau $defaultFacebookImage = cleanID(PluginUtility::getConfValue(self::CONF_DEFAULT_FACEBOOK_IMAGE)); 1125f891b7eSNickeau if (!empty($defaultFacebookImage)) { 1135f891b7eSNickeau $image = new Image($defaultFacebookImage); 1145f891b7eSNickeau if ($image->exists()) { 1155f891b7eSNickeau $facebookImages[] = $image; 1165f891b7eSNickeau } else { 1175f891b7eSNickeau if ($defaultFacebookImage != "logo-facebook.png") { 1185f891b7eSNickeau LogUtility::msg("The default facebook image ($defaultFacebookImage) does not exist", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1195f891b7eSNickeau } 1205f891b7eSNickeau } 1215f891b7eSNickeau 1225f891b7eSNickeau 1235f891b7eSNickeau } 1245f891b7eSNickeau } 1255f891b7eSNickeau if (!empty($facebookImages)) { 1265f891b7eSNickeau foreach ($facebookImages as $facebookImage) { 1275f891b7eSNickeau 1285f891b7eSNickeau if (!$facebookImage->exists()) { 1295f891b7eSNickeau LogUtility::msg("The image ($facebookImage) does not exist and was not added", LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1305f891b7eSNickeau } else { 1315f891b7eSNickeau 1325f891b7eSNickeau $toSmall = false; 1335f891b7eSNickeau if ($facebookImage->isAnalyzable()) { 1345f891b7eSNickeau 1355f891b7eSNickeau // There is a minimum size constraint of 200px by 200px 1365f891b7eSNickeau if ($facebookImage->getWidth() < 200) { 1375f891b7eSNickeau $toSmall = true; 1385f891b7eSNickeau } else { 1395f891b7eSNickeau $facebookMeta["og:image:width"] = $facebookImage->getWidth(); 1405f891b7eSNickeau if ($facebookImage->getHeight() < 200) { 1415f891b7eSNickeau $toSmall = true; 1425f891b7eSNickeau } else { 1435f891b7eSNickeau $facebookMeta["og:image:height"] = $facebookImage->getHeight(); 1445f891b7eSNickeau } 1455f891b7eSNickeau } 1465f891b7eSNickeau } 1475f891b7eSNickeau 1485f891b7eSNickeau if ($toSmall) { 1495f891b7eSNickeau $message = "The facebook image ($facebookImage) is too small (" . $facebookImage->getWidth() . " x " . $facebookImage->getHeight() . "). The minimum size constraint is 200px by 200px"; 1505f891b7eSNickeau if ($facebookImage->getId() != $page->getFirstImage()->getId()) { 1515f891b7eSNickeau LogUtility::msg($message, LogUtility::LVL_MSG_ERROR, self::CANONICAL); 1525f891b7eSNickeau } else { 1535f891b7eSNickeau LogUtility::log2BrowserConsole($message); 1545f891b7eSNickeau } 1555f891b7eSNickeau } 1565f891b7eSNickeau 1575f891b7eSNickeau 1585f891b7eSNickeau /** 1595f891b7eSNickeau * We may don't known the dimensions 1605f891b7eSNickeau */ 1615f891b7eSNickeau if (!$toSmall) { 1625f891b7eSNickeau $mime = $facebookImage->getMime(); 1635f891b7eSNickeau if (!empty($mime)) { 1645f891b7eSNickeau $facebookMeta["og:image:type"] = $mime[1]; 1655f891b7eSNickeau } 1665f891b7eSNickeau $facebookMeta["og:image"] = $facebookImage->getUrl(); 1675f891b7eSNickeau // One image only 1685f891b7eSNickeau break; 1695f891b7eSNickeau } 1705f891b7eSNickeau } 1715f891b7eSNickeau 1725f891b7eSNickeau } 1735f891b7eSNickeau } 1745f891b7eSNickeau 1755f891b7eSNickeau 1765f891b7eSNickeau $facebookMeta["fb:app_id"] = self::FACEBOOK_APP_ID; 1775f891b7eSNickeau 1785f891b7eSNickeau $lang = $page->getLang(); 1795f891b7eSNickeau if (!empty($lang)) { 1805f891b7eSNickeau 1815f891b7eSNickeau $country = $page->getCountry(); 1825f891b7eSNickeau if (empty($country)) { 1835f891b7eSNickeau $country = $lang; 1845f891b7eSNickeau } 1855f891b7eSNickeau $facebookMeta["og:locale"] = $lang . "_" . strtoupper($country); 1865f891b7eSNickeau 1875f891b7eSNickeau } else { 1885f891b7eSNickeau 1895f891b7eSNickeau // The Facebook default 1905f891b7eSNickeau $facebookMeta["og:locale"] = "en_US"; 1915f891b7eSNickeau 1925f891b7eSNickeau } 1935f891b7eSNickeau 1945f891b7eSNickeau /** 1955f891b7eSNickeau * Add the properties 1965f891b7eSNickeau */ 1975f891b7eSNickeau foreach ($facebookMeta as $property => $content) { 1985f891b7eSNickeau $event->data['meta'][] = array("property" => $property, "content" => $content); 1995f891b7eSNickeau } 2005f891b7eSNickeau 2015f891b7eSNickeau 2025f891b7eSNickeau } 2035f891b7eSNickeau 2045f891b7eSNickeau} 205