当分享WordPress链接到Mastodon的时候,默认的情况下,WordPress设置的精选图片和文章摘要并不能被Mastodon提取到,于是预览卡片的图片地方只会出现一个灰暗的文件图标,摘要也没有,提供的信息就很少。所以,新的折腾目标已经出现。

效果

就是把这样:↓

示例图1

变成这样。↓

示例图2

这是文章页面,此外我对其他页面分享到Mastodon的预览卡片也做了处理,包括非文章页面、分类法页面、首页。简单来讲,有精选图片就显示图片,有摘要就显示摘要。分类法(包括分类和标签)可以设置摘要但不能设图片,于是显示的图片就是其中第一篇有精选图片的文章的图片。分类法没有设置摘要的话也是显示的里面文章的摘要。如果实在没有图片和摘要的话,显示图片就用网站图标,显示摘要就用默认句子(可以是网站说明)。

操作

老样子,还是操作布景主题档案编辑器的functions.php文件。当然你用那种插入代码的插件应该也行。添加以下代码,注意标出来该改的地方要自己改:

add_action('wp_head', 'add_social_meta');

function add_social_meta() {
	
	global $post;
	
	// 设置精选图片为预览图片,如果没有精选图片,则使用网站图标

	$image = has_post_thumbnail() ? get_the_post_thumbnail_url($post->ID, 'large') : '自己网站图标的链接';	
	
	echo '<meta property="og:image" content="'.esc_url($image).'">';
	
	//设置Mastodon卡片类型
	if(has_post_thumbnail()) echo '<meta name="twitter:card" content="photo">';
	
	if(is_single()) {

		//设置文章描述为文章预览描述,如无描述,则截取前155字

		$description = get_the_excerpt() ? get_the_excerpt() :mb_substr(strip_tags($post->post_content),0,155).'...';

		echo '<meta property="og:description" conent="'.esc_attr($description).'">';

		echo '<meta name="description" content="'.esc_attr($description).'">';

		//将文章链接标题设置为文章标题 + 网站标题(与WordPress原设同,可改)
		echo '<meta property="og:title" content="'.get_the_title().' – '.get_bloginfo("name").'">';

		echo '<meta property="og:url" content="'.get_permalink().'">';

		echo '<meta property="og:type" content="article">';

	} else {

		if(is_category()) {

			//将分类页描述设为分类页预览描述

			$term = get_queried_object();
			$description = $term->description;

			echo '<meta property="og:description" content="'.esc_attr($description).'">';

		} else {

			//设置其他页面描述为页面预览描述,如无描述,则使用默认句子

			$description = has_excerpt() ? get_the_excerpt() :'默认句子';
	  
			echo '<meta property="og:description" content="'.esc_attr($description).'">';
		}

	}

}

如无差错,一共要改两个地方,一个是自己网站图标的链接,一个是默认句子

需要注意的是,如果想达成图2的效果,精选图片还需要使用横向图片,即宽大于高。如果精选图片是竖向或者正方形的图片,则会显示为图1的效果,不同的是原先灰色文件图标处会显示为1:1裁切的精选图片。因为网站图标是方形的,所以当预览图片是网站图标的时候实际上还是图1的格式。

原理

上面代码实际上就是在网页HTML的header部分创建了各种属性的<meta>标签,因为没法直接编辑HTML文档,故而通过PHP来实现。所以如果可以编辑HTML的话也可以直接写在HTML里。

Mastodon在预览卡片处提取的信息主要遵循Open Graph协议,需要我们手动增加的Open Graph标签主要是这两个:

<meta property="og:image" content="展示图片的URL">
<meta property="og:description" content="页面描述">

此外还有og:title,不过这个不用自己添加WordPress也会提供,WordPress默认的网页标题是“文章标题 - 网站名称”,如果想改也可以自己改。

还有一些og:typeog:url之类的属性,我试过都是不用自己添加也不影响预览卡片显示的,不过虽然但是我还是在代码中加了一部分。

除了遵循Open Graph协议的,还有一个重要的标签是遵循的Twitter Cards协议,就是控制你的预览卡片格式是图1还是图2。

但是这里存在一个问题是,Twitter官方提供的twitter:card卡片类型属性值是分为summarysummary_large_imageappplayer四种,所以按理说图2的效果应该是summary_large_image这种才对,但是我用这个值死活也改不了卡片格式。

不得已我去翻了Mastodon的官方文档,PreviewCard那里说格式是分为Video、Photo、Link三种,但是至于具体操作,他们给出的代码示范我没有看出来是用在哪里的,所以就还是没搞懂应该怎么改。

无计可施之际,我直接问了AI,让它使得文章链接在Mastodon中显示的preview card type为photo。于是它直接写了twitter:card属性的值为photo。一试,成了。

……啊???

这我哪儿想得到!

之前我还笑话Mastodon背地里偷偷遵循Twitter的协议,谁能想到,属性遵循了,值没遵循……

参考

有用的主要有社交媒体元标签科普Twitter卡片官方指南Mastodon PreviewCard官方文档,以及对话式AI

在〈捣腾捣腾丨美化Mastodon中WP链接的预览卡片〉中有 2 則留言

  1. 每次我作为门外汉去改一些东西,就会发觉文档写得好能让普通人看懂的话说明作者水平多么高超。😂
    PS: edge 浏览器下,鼠标移动到右边栏下方三个图标( mastodon 电邮 rss )上会疯狂抖动,看起来有点难受。(用 Firefox 的话会出现一个滑动条,倒是不会抖动了。)

    1. 谢谢反馈~我去想想怎么处理这个问题

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


无际的旅途里,我将我借来的一一归还。我归还琴,归还剑,归还战马,归还厮杀。归还流云,归还雅逸,归还骄傲,归还感伤。最终,流水将我和我的尸块扑到了月儿荒凉的野地上;离渭城远了,我听到渭水的波声也就渐渐地小了。