xref: /template/strap/action/metatwitter.php (revision 5f891b7e09648e05e78f5882f3fdde1e9df9b0f1)
1*5f891b7eSNickeau<?php
2*5f891b7eSNickeau
3*5f891b7eSNickeauuse ComboStrap\Image;
4*5f891b7eSNickeauuse ComboStrap\LogUtility;
5*5f891b7eSNickeauuse ComboStrap\MetadataUtility;
6*5f891b7eSNickeauuse ComboStrap\PluginUtility;
7*5f891b7eSNickeauuse ComboStrap\Page;
8*5f891b7eSNickeauuse ComboStrap\Site;
9*5f891b7eSNickeauuse ComboStrap\StringUtility;
10*5f891b7eSNickeau
11*5f891b7eSNickeauif (!defined('DOKU_INC')) die();
12*5f891b7eSNickeau
13*5f891b7eSNickeaurequire_once(__DIR__ . '/../class/Site.php');
14*5f891b7eSNickeau
15*5f891b7eSNickeau/**
16*5f891b7eSNickeau *
17*5f891b7eSNickeau * For the canonical meta, see {@link action_plugin_combo_metacanonical}
18*5f891b7eSNickeau * https://github.com/twbs/bootstrap/blob/v4-dev/site/layouts/partials/social.html
19*5f891b7eSNickeau *
20*5f891b7eSNickeau * TODO: https://developer.twitter.com/en/docs/twitter-for-websites/embedded-tweets/overview
21*5f891b7eSNickeau */
22*5f891b7eSNickeauclass action_plugin_combo_metatwitter extends DokuWiki_Action_Plugin
23*5f891b7eSNickeau{
24*5f891b7eSNickeau
25*5f891b7eSNickeau
26*5f891b7eSNickeau    /**
27*5f891b7eSNickeau     * The handle name
28*5f891b7eSNickeau     */
29*5f891b7eSNickeau    const CONF_TWITTER_SITE_HANDLE = "twitterSiteHandle";
30*5f891b7eSNickeau    /**
31*5f891b7eSNickeau     * The handle id
32*5f891b7eSNickeau     */
33*5f891b7eSNickeau    const CONF_TWITTER_SITE_ID = "twitterSiteId";
34*5f891b7eSNickeau    /**
35*5f891b7eSNickeau     * The image
36*5f891b7eSNickeau     */
37*5f891b7eSNickeau    const CONF_DEFAULT_TWITTER_IMAGE = "defaultTwitterImage";
38*5f891b7eSNickeau
39*5f891b7eSNickeau    /**
40*5f891b7eSNickeau     * Don't track
41*5f891b7eSNickeau     */
42*5f891b7eSNickeau    const CONF_TWITTER_DONT_NOT_TRACK = "twitter:dnt";
43*5f891b7eSNickeau    const CONF_DONT_NOT_TRACK = "twitter:dnt";
44*5f891b7eSNickeau    const CONF_ON = "on";
45*5f891b7eSNickeau    const CONF_OFF = "off";
46*5f891b7eSNickeau
47*5f891b7eSNickeau    /**
48*5f891b7eSNickeau     * The creation ie (combostrap)
49*5f891b7eSNickeau     */
50*5f891b7eSNickeau    const COMBO_STRAP_TWITTER_HANDLE = "@combostrapweb";
51*5f891b7eSNickeau    const COMBO_STRAP_TWITTER_ID = "1283330969332842497";
52*5f891b7eSNickeau    const CANONICAL = "twitter";
53*5f891b7eSNickeau
54*5f891b7eSNickeau
55*5f891b7eSNickeau
56*5f891b7eSNickeau    function __construct()
57*5f891b7eSNickeau    {
58*5f891b7eSNickeau        // enable direct access to language strings
59*5f891b7eSNickeau        // ie $this->lang
60*5f891b7eSNickeau        $this->setupLocale();
61*5f891b7eSNickeau    }
62*5f891b7eSNickeau
63*5f891b7eSNickeau    public function register(Doku_Event_Handler $controller)
64*5f891b7eSNickeau    {
65*5f891b7eSNickeau        $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'metaTwitterProcessing', array());
66*5f891b7eSNickeau    }
67*5f891b7eSNickeau
68*5f891b7eSNickeau    /**
69*5f891b7eSNickeau     *
70*5f891b7eSNickeau     * @param $event
71*5f891b7eSNickeau     */
72*5f891b7eSNickeau    function metaTwitterProcessing($event)
73*5f891b7eSNickeau    {
74*5f891b7eSNickeau
75*5f891b7eSNickeau        global $ID;
76*5f891b7eSNickeau        if (empty($ID)) {
77*5f891b7eSNickeau            // $ID is null for media
78*5f891b7eSNickeau            return;
79*5f891b7eSNickeau        }
80*5f891b7eSNickeau
81*5f891b7eSNickeau
82*5f891b7eSNickeau        $page = new Page($ID);
83*5f891b7eSNickeau
84*5f891b7eSNickeau        /**
85*5f891b7eSNickeau         * No social for bars
86*5f891b7eSNickeau         */
87*5f891b7eSNickeau        if ($page->isBar()) {
88*5f891b7eSNickeau            return;
89*5f891b7eSNickeau        }
90*5f891b7eSNickeau
91*5f891b7eSNickeau
92*5f891b7eSNickeau        // https://datacadamia.com/marketing/twitter#html_meta
93*5f891b7eSNickeau        // https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup
94*5f891b7eSNickeau        // https://cards-dev.twitter.com/validator
95*5f891b7eSNickeau
96*5f891b7eSNickeau        $twitterMeta = array(
97*5f891b7eSNickeau            "twitter:card" => "summary",
98*5f891b7eSNickeau            "twitter:title" => StringUtility::truncateString($page->getTitleNotEmpty(), 70),
99*5f891b7eSNickeau            "twitter:description" => StringUtility::truncateString($page->getDescription(), 200),
100*5f891b7eSNickeau            "twitter:creator" => self::COMBO_STRAP_TWITTER_HANDLE,
101*5f891b7eSNickeau            "twitter:creator:id" => self::COMBO_STRAP_TWITTER_ID
102*5f891b7eSNickeau        );
103*5f891b7eSNickeau
104*5f891b7eSNickeau
105*5f891b7eSNickeau        /**
106*5f891b7eSNickeau         * Twitter site
107*5f891b7eSNickeau         */
108*5f891b7eSNickeau        $siteTwitterHandle = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_HANDLE);
109*5f891b7eSNickeau        $siteTwitterId = PluginUtility::getConfValue(self::CONF_TWITTER_SITE_ID);
110*5f891b7eSNickeau        if (!empty($siteTwitterHandle)) {
111*5f891b7eSNickeau            $twitterMeta["twitter:site"] = $siteTwitterHandle;
112*5f891b7eSNickeau
113*5f891b7eSNickeau            // Identify the Twitter profile of the page that populates the via property
114*5f891b7eSNickeau            // https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties
115*5f891b7eSNickeau            $name = str_replace("@","",$siteTwitterHandle);
116*5f891b7eSNickeau            $event->data['link'][] = array("rel" => "me", "href" => "https://twitter.com/$name");
117*5f891b7eSNickeau        }
118*5f891b7eSNickeau        if (!empty($siteTwitterId)) {
119*5f891b7eSNickeau            $twitterMeta["twitter:site:id"] = $siteTwitterId;
120*5f891b7eSNickeau        }
121*5f891b7eSNickeau
122*5f891b7eSNickeau        /**
123*5f891b7eSNickeau         * Card image
124*5f891b7eSNickeau         */
125*5f891b7eSNickeau        $twitterImages = $page->getImageSet();
126*5f891b7eSNickeau        if (empty($twitterImages)) {
127*5f891b7eSNickeau            $defaultImageIdConf = cleanID(PluginUtility::getConfValue(self::CONF_DEFAULT_TWITTER_IMAGE));
128*5f891b7eSNickeau            if (!empty($defaultImageIdConf)) {
129*5f891b7eSNickeau                $twitterImage = new Image($defaultImageIdConf);
130*5f891b7eSNickeau                if ($twitterImage->exists()) {
131*5f891b7eSNickeau                    $twitterImages[] = $twitterImage;
132*5f891b7eSNickeau                } else {
133*5f891b7eSNickeau                    if ($defaultImageIdConf != "apple-touch-icon.png") {
134*5f891b7eSNickeau                        LogUtility::msg("The default twitter image ($defaultImageIdConf) does not exist", LogUtility::LVL_MSG_ERROR, self::CANONICAL);
135*5f891b7eSNickeau                    }
136*5f891b7eSNickeau                }
137*5f891b7eSNickeau            }
138*5f891b7eSNickeau
139*5f891b7eSNickeau        }
140*5f891b7eSNickeau        if (!empty($twitterImages)) {
141*5f891b7eSNickeau            foreach ($twitterImages as $twitterImage) {
142*5f891b7eSNickeau                if ($twitterImage->exists()) {
143*5f891b7eSNickeau                    $twitterMeta["twitter:image"] = $twitterImage->getUrl();
144*5f891b7eSNickeau                    if (!empty($twitterImage->getAlt())) {
145*5f891b7eSNickeau                        $twitterMeta["twitter:image:alt"] = $twitterImage->getAlt();
146*5f891b7eSNickeau                    }
147*5f891b7eSNickeau                    // One image only
148*5f891b7eSNickeau                    break;
149*5f891b7eSNickeau                }
150*5f891b7eSNickeau            }
151*5f891b7eSNickeau        }
152*5f891b7eSNickeau
153*5f891b7eSNickeau        /**
154*5f891b7eSNickeau         * https://developer.twitter.com/en/docs/twitter-for-websites/webpage-properties
155*5f891b7eSNickeau         */
156*5f891b7eSNickeau        // don;t track
157*5f891b7eSNickeau        $twitterMeta["twitter:dnt"]=PluginUtility::getConfValue(self::CONF_TWITTER_DONT_NOT_TRACK);
158*5f891b7eSNickeau        // turn off csp warning
159*5f891b7eSNickeau        $twitterMeta["twitter:widgets:csp"]="on";
160*5f891b7eSNickeau
161*5f891b7eSNickeau        /**
162*5f891b7eSNickeau         * Embedded Tweet Theme
163*5f891b7eSNickeau         */
164*5f891b7eSNickeau
165*5f891b7eSNickeau        $twitterMeta["twitter:widgets:theme"]=PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_THEME);
166*5f891b7eSNickeau        $twitterMeta["twitter:widgets:border-color"]=PluginUtility::getConfValue(syntax_plugin_combo_blockquote::CONF_TWEET_WIDGETS_BORDER);
167*5f891b7eSNickeau
168*5f891b7eSNickeau        /**
169*5f891b7eSNickeau         * Add the properties
170*5f891b7eSNickeau         */
171*5f891b7eSNickeau        foreach ($twitterMeta as $key => $content) {
172*5f891b7eSNickeau            $event->data['meta'][] = array("name" => $key, "content" => $content);
173*5f891b7eSNickeau        }
174*5f891b7eSNickeau
175*5f891b7eSNickeau
176*5f891b7eSNickeau
177*5f891b7eSNickeau    }
178*5f891b7eSNickeau
179*5f891b7eSNickeau}
180