[plugin] Twitter cards update

This commit is contained in:
Elixcz 2022-10-01 20:13:35 +02:00
parent e4569677c4
commit 72dca22ebd
No known key found for this signature in database
GPG key ID: 5DEC9DC9750F899A
4 changed files with 105 additions and 26 deletions

View file

@ -0,0 +1,13 @@
{
"plugin-data":
{
"name": "Twitter Cards",
"description": "With Twitter Cards, you can attach rich photos, videos and media experiences to Tweets, helping to drive traffic to your website."
},
"default-image": "Výchozí obrázek",
"twitter-site-profile": "Profil stránky na Twitteru",
"twitter-author-profile": "Profil autora příspěvku na Twitteru",
"minimum-image-dimensions": "Minimální rozměry obrázku jsou 300x157px a maximum 4096x4096px.",
"image-must-be-less": "Obrázek musí být menší než 5MB.",
"formats-are-supported": "Jsou podporovány formáty pouze JPG, PNG, WEBP a GIF."
}

View file

@ -4,5 +4,10 @@
"name": "Twitter Cards",
"description": "With Twitter Cards, you can attach rich photos, videos and media experiences to Tweets, helping to drive traffic to your website."
},
"default-image": "Default image"
}
"default-image": "Default image",
"twitter-site-profile": "Twitter site profile",
"twitter-author-profile": "Twitter author profile",
"minimum-image-dimensions": "The minimum image dimensions are 300x157px and the maximum 4096x4096px.",
"image-must-be-less": "Image must be less than 5MB in size.",
"formats-are-supported": "JPG, PNG, WEBP and GIF formats are supported."
}

View file

@ -3,8 +3,8 @@
"email": "",
"website": "https://plugins.bludit.com",
"version": "4.0.0",
"releaseDate": "2021-05-23",
"releaseDate": "2022-10-01",
"license": "MIT",
"compatible": "4.0.0",
"notes": ""
}
}

View file

@ -6,7 +6,9 @@ class pluginTwitterCards extends Plugin {
{
// Fields and default values for the database of this plugin
$this->dbFields = array(
'defaultImage'=>''
'defaultImage' => '',
'twitterSite' => '',
'twitterCreator' => ''
);
}
@ -14,9 +16,24 @@ class pluginTwitterCards extends Plugin {
{
global $L;
$html = '<div>';
$html = '<div class="alert alert-primary" role="alert">';
$html .= $this->description();
$html .= '</div>';
$html .= '<div>';
$html .= '<label>'.$L->get('Default image').'</label>';
$html .= '<input id="jsdefaultImage" name="defaultImage" type="text" value="'.$this->getValue('defaultImage').'" placeholder="https://">';
$html .= '<p class="text-muted small">' . $L->get('minimum-image-dimensions') . ' ' . $L->get('image-must-be-less') . ' ' . $L->get('formats-are-supported') . '</p>';
$html .= '</div>';
$html .= '<div>';
$html .= '<label>'.$L->get('Twitter site profile').'</label>';
$html .= '<input id="jstwitterSite" name="twitterSite" type="text" value="'.$this->getValue('twitterSite').'" placeholder="@yourSiteProfile">';
$html .= '</div>';
$html .= '<div>';
$html .= '<label>'.$L->get('Twitter author profile').'</label>';
$html .= '<input id="jstwitterCreator" name="twitterCreator" type="text" value="'.$this->getValue('twitterCreator').'" placeholder="@authorProfile">';
$html .= '</div>';
return $html;
@ -31,19 +48,20 @@ class pluginTwitterCards extends Plugin {
global $page;
$data = array(
'card' =>'summary',
'site' =>'',
'title' =>$site->title(),
'description' =>$site->description(),
'image' =>''
'card' => 'summary_large_image',
'twitterSite' => $this->getValue('twitterSite'),
'twitterCreator' => $this->getValue('twitterCreator'),
'title' => $site->title(),
'description' => $site->description(),
'image' => ''
);
switch($WHERE_AM_I) {
switch( $WHERE_AM_I ) {
// The user filter by page
case 'page':
$data['title'] = $page->title();
$data['description'] = $page->description();
$data['image'] = $page->coverImage($absolute=true);
$data['title'] = $page->title();
$data['description'] = $page->description();
$data['image'] = $page->coverImage( $absolute = true );
$pageContent = $page->content();
break;
@ -53,32 +71,75 @@ class pluginTwitterCards extends Plugin {
$pageContent = '';
// The image it's from the first page
if(isset($content[0]) ) {
$data['image'] = $content[0]->coverImage($absolute=true);
$data['image'] = $content[0]->coverImage( $absolute = true );
$pageContent = $content[0]->content();
}
break;
}
$html = PHP_EOL.'<!-- Twitter Cards -->'.PHP_EOL;
$html .= '<meta property="twitter:card" content="'.$data['card'].'">'.PHP_EOL;
$html .= '<meta property="twitter:site" content="'.$data['site'].'">'.PHP_EOL;
$html .= '<meta property="twitter:title" content="'.$data['title'].'">'.PHP_EOL;
$html .= '<meta property="twitter:description" content="'.$data['description'].'">'.PHP_EOL;
$html .= '<meta name="twitter:card" content="' . $data['card'] . '">'.PHP_EOL;
$html .= '<meta name="twitter:site" content="' . $data['site'] . '">'.PHP_EOL;
$html .= '<meta name="twitter:title" content="' . $data['title'] . '">'.PHP_EOL;
$html .= '<meta name="twitter:creator" content="' . $data['twitterCreator'] . '">'.PHP_EOL;
// If the page doesn't have a description try to get excerpt from content
if( empty( $data['description'] ) )
{
$data['description'] = $this->content_excerpt( $pageContent , 150, '...');
}
$html .= '<meta name="twitter:description" content="' . $data['description'] . '">'.PHP_EOL;
// If the page doesn't have a coverImage try to get an image from the HTML content
if( empty($data['image']) ) {
if( empty( $data['image'] ) ) {
// Get the image from the content
$src = DOM::getFirstImage($pageContent);
if ($src!==false) {
$src = DOM::getFirstImage( $pageContent );
if ( $src !== false ) {
$data['image'] = $src;
} else {
if (Text::isNotEmpty($this->getValue('defaultImage'))) {
if ( Text::isNotEmpty( $this->getValue('defaultImage') ) ) {
$data['image'] = $this->getValue('defaultImage');
}
}
}
$html .= '<meta property="twitter:image" content="'.$data['image'].'">'.PHP_EOL;
$html .= '<meta name="twitter:image" content="'.$data['image'].'">'.PHP_EOL;
$html .= '<!-- /Twitter Cards -->'.PHP_EOL.PHP_EOL;
unset( $pageContent );
unset( $data );
return $html;
}
}
/** Return excerpt from full content of post
*
* @param string $str Post content
* @param int $n Number of characters
* @param string $endChar End char append to after excerpt (default "...")
* @return string
*/
private function content_excerpt( string $str, int $n = 500, string $endChar = '&#8230;' ): string
{
$str = strip_tags( $str );
if ( mb_strlen( $str ) < $n )
{
return $str;
}
$str = preg_replace('/ {2,}/', ' ', str_replace(["\r", "\n", "\t", "\x0B", "\x0C"], ' ', $str));
if ( mb_strlen( $str ) <= $n )
{
return $str;
}
$out = '';
foreach ( explode( ' ', trim( $str ) ) as $val )
{
$out .= $val . ' ';
if ( mb_strlen( $out ) >= $n )
{
$out = trim( $out );
break;
}
}
return ( mb_strlen( $out ) === mb_strlen( $str ) ) ? $out : $out . $endChar;
}
}