如何在共享单个帖子时将作者的头像用作Facebook帖子预览图像

时间:2013-05-10 作者:Drai

我想使用帖子作者的头像(如果可用)作为Facebook共享帖子的帖子预览图像。如果这不可用,接下来将是一个特色图像,然后是一个默认图像作为后备。是否有插件或函数可以实现这一点?

这个Yoast SEO plugin 还有很多人可以插入默认图像,但我还没有找到一个可以从作者的头像中提取图像的图像。

*注意,我还使用Simple Local Avatars 对于没有与电子邮件关联的头像的用户

2 个回复
最合适的回答,由SO网友:Ralf912 整理而成

从你的评论来看,似乎你想取代facebook上的帖子预览。这可能很困难,因为您试图修改另一个网页的行为。使用opengraph protocol 这是可以做到的。

add_action( \'wp_head\', \'get_facebook_meta_tags\', 10, 0 );

function get_facebook_meta_tags() {
    global $post;

    // bail if the post is not in single view
    if ( ! is_single() )
        return;

    // get the url from post authors avatar (if available) or the url of post thumbnail
    // bails if no image was found
    $img_url = set_facebook_preview_image();
    if ( empty( $img_url) )
        return;

    // set description. use the first 97 chars from post excerpt (if available) or post content (alternativly)
    // add \'...\' to description
    $description = ( ! empty( $post->post_excerpt ) ) ? $post->post_excerpt : $post->post_content;
    if ( strlen( $description ) > 100 )
        $description = substr( $description, 0, 97 ) . \'...\';

    // create meta tags
    $format = \'
    <meta property="og:title" content="%s" />
    <meta property="og:type" content="article" />
    <meta property="og:url" content="%s" />
    <meta property="og:image" content="%s" />
    <meta property="og:site_name" content="%s"/>
    <meta property="og:description" content="%s" />\';

    printf(
        $format,
        esc_attr( $post->post_title ),
        esc_attr( get_permalink( $post->ID ) ),
        esc_attr( $img_url ),
        esc_attr( get_bloginfo( \'name\', \'raw\') ),
        esc_attr( $description )
    );

}


function set_facebook_preview_image() {
    global $post;
    if ( ! is_object( $post ) || empty( $post ) )
        return false;

    // get the autor id and url from authors avatar (if available)
    // add a filter on get_avatar. this filter returns an empty string if a default avatar is returned
    add_filter( \'get_avatar\', \'no_avatar_for_fb_preview_image\', 0, 5 );
    $author_id = isset( $post->post_author ) ? $post->post_author : \'\';
    if ( empty( $author_id) )
        return false;
    $author_avatar_html = get_avatar( $author_id );
    // do not forget to remove the filter!!
    remove_filter( \'get_avatar\', \'no_avatar_for_fb_preview_image\', 0, 5 );

    // grab avatar url from avatar html string
    if ( ! empty( $author_avatar_html ) ) {
        preg_match( \'#(?<=src\\=["|\\\']).+(?=["|\\\'](\\s|\\/\\>))#Uuis\', $author_avatar_html, $url );
        $author_avatar_url = ( isset( $url[0] ) && ! empty( $url[0] ) ) ? $url[0] : \'\';
    }

    // get the url fromj post thumbnail
    $post_thumb_url  = wp_get_attachment_url( get_post_thumbnail_id( $post->ID ) );

    // set url to author avatar url with fallback to post thumbnail url
    $img_url = \'\';
    if ( ! empty( $author_avatar_url ) )
        $img_url = $author_avatar_url;

    if ( empty( $img_url ) && ! empty( $post_thumb_url ) )
        $img_url = $post_thumb_url;

    return $img_url;
}

function no_avatar_for_fb_preview_image( $avatar, $id_or_email, $size, $default, $alt ) {
    if ( ! empty( $default ) )
        return \'\';
}
第一个函数钩住wp_head 并检查页面是否为单个视图。如果是这样,它会尝试获取图像url(发布缩略图或作者头像url)。如果它可以获取url,它将显示所需的元标记
第二个函数获取化身url和发布缩略图url。对于用户没有化身的情况,它使用过滤器。在这种情况下,它将返回一个空字符串,并返回帖子缩略图的url。

SO网友:Ralf912

此函数用于从facebook帖子链接中提取作者,并获取作者facebook头像的url

function get_fb_avatarurl_from_fb_post( $fb_post_link ) {

    $avatar_template = \'http://graph.facebook.com/%username%/picture\';
    $user            = \'\';
    $avatar_url      = false;

    $parsed_url = parse_url( $fb_post_link );

    if ( isset( $parsed_url[\'path\'] ) ) {
        $path = trim( $parsed_url[\'path\'], \'/\' );
        preg_match( \'#^.+/#Uuis\', $path, $user );

        if ( ! empty( $user ) && isset( $user[0] ) )
            $avatar_url = str_replace( \'%username%\', trim( $user[0], \'/\' ), $avatar_template );
    }

    return $avatar_url;
}
函数需要以下格式的链接https://www.facebook.com/the.facebook.post.author/posts/123456789123456

要显示facebook头像或帖子缩略图,可以使用以下代码片段

global $post;
$avatar_img_url = get_fb_avatarurl_from_fb_post( [the facebook post url] );
$post_img_html  = get_the_post_thumbnail( $post->ID, \'thumbnail\' );

if ( empty( $post_img_html ) )
    $post_img_html = \'<img src="" />\'; // modify the html to whatever you want

if ( ! empty( $avatar_img_url ) )
    $post_img_html = preg_replace( \'#(?<=src\\=["|\\\']).+(?=["|\\\'](\\s|\\/\\>))#Uuis\', $avatar_img_url, $post_img_html );

echo $post_img_html;
我不知道你从哪里得到facebook的帖子链接,但我想你已经在任何地方得到了它。代码片段首先尝试获取fb头像url。然后尝试获取帖子缩略图。get_the_post_thumbnail() 提供完整的html代码,如<img width="150" height="150" src="[some url]" class="attachment-thumbnail wp-post-image" alt="Uploaded image your title here" />.
如果没有可用的帖子缩略图,则使用html模板(您必须对其进行编辑)。如果有帖子缩略图可用and fb化身url,图像的源被fb化身url替换。如果帖子缩略图可用,但没有fb头像url,则会显示帖子缩略图。

如果要修改alt-属性,还可以扩展if-陈述

if ( empty( $post_img_html ) )
    $post_img_html = \'<img src="" alt="" />\';

if ( ! empty( $avatar_img_url ) ) {
    $fb_alt_attrb = \'The new text for alt attrb if a fb avatar is displayed\';
    $post_img_html = preg_replace( \'#(?<=src\\=["|\\\']).+(?=["|\\\'](\\s|\\/\\>))#Uuis\', $avatar_img_url, $post_img_html );
    $post_img_html = preg_replace( \'#(?<=alt\\=["|\\\']).+(?=["|\\\'](\\s|\\/\\>))#Uuis\', $fb_alt_attrb, $post_img_html );
}
我希望它能帮助你。

Edit 这将改变post thumbnail / featured image 使用facebook头像。

结束

相关推荐

Fetching Gravatar

如何获取任何人的gravatar图像?我需要向用户显示gravatar图像上的自定义配置文件页正在制作。到目前为止,我已经集成了Facebook个人资料图片(自动抓取)选项,并且允许用户分配自己的照片(根据自己的意愿)。我需要做的是,如果此人不是来自FB,那么可能应该使用他的电子邮件或其他东西来查看他/她是否有gravatar,如果是,则显示它。我该怎么做?谢谢