允许Facebook在发布前预览帖子

时间:2015-07-24 作者:prunmit

我想允许Facebook(用户代理facebookexternalhit) 在发布前访问计划的帖子,以便访问元信息以计划状态。目前我暂时发布帖子,安排Facebook状态,然后通过WordPress取消发布和安排帖子。

安排WordPress帖子时,编辑可以访问预发布的页面,但访问URL时,其他所有人都会看到404。我如何允许某个用户代理(即Facebook)在发布帖子之前也访问帖子?

1 个回复
SO网友:prunmit

使用以下代码创建新插件:

class Facebook_Peeker {
    private static $facebook_bots = [
        \'facebookexternalhit/1.1 (+https://www.facebook.com/externalhit_uatext.php)\',
        \'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)\'
    ];

    private $original_posts;

    public function make_scheduled_post_public() {
        add_filter( \'posts_results\', [ &$this, \'peek_into_private\' ], null, 2 );
    }

    public function peek_into_private( $posts, &$query ) {
        if ( sizeof( $posts ) != 1 ) {
            return $posts;
        }

        $status = get_post_status_object( get_post_status( $posts[0] ) );
        if ( $status->public ) {
            return $posts;
        }

        $this->original_posts = $posts;
        add_filter( \'the_posts\', [ &$this, \'override_private\' ], null, 2 );
    }

    public function override_private( $posts, &$query ) {
        remove_filter( \'the_posts\', [ &$this, \'peek_into_private\' ], null, 2 );
        return $this->original_posts;
    }

    private function is_facebook_seeking() {
        return in_array( $_SERVER[ \'HTTP_USER_AGENT\' ], self::$facebook_bots );
    }

    public static function init() {
        if ( ! self::is_facebook_seeking() ) {
            return;
        }

        $peeker = new Facebook_Peeker();
        $peeker->make_scheduled_post_public();
    }
}

add_action( \'plugins_loaded\', [ \'Facebook_Peeker\', \'init\' ] );
这允许Facebook机器人查看预定的帖子,但不允许其他公众查看。如果使用其他插件,请记住更新任何相关的缓存设置。

在以下帮助下得出的答案How to make scheduled post preview visible to anyone?How to recognize Facebook User-Agent.

结束

相关推荐

获取社交分享总数(Facebook、Twitter、Google+。Pinterest)

我在我的主题函数中使用以下代码片段来计算我提到的社交媒体的个人份额。php:$facebook_like_share_count = function ( $url ) { $api = file_get_contents( \'http://graph.facebook.com/?id=\' . $url ); $count = json_decode( $api ); return $count->shares;&#x