xref: /plugin/combo/action/metafacebook.php (revision 522065429f1f017315dfb89e81fe72fea6ca1c90)
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