web-dev-qa-db-ja.com

公開前にFacebookによる投稿のプレビューを許可する

私はFacebook(ユーザーエージェントfacebookexternalhit)が公開される前にスケジュールされた投稿にアクセスできるようにしたいので、ステータスをスケジュールするためにメタ情報にアクセスすることができます。現在私は一時的に投稿を公開し、Facebookのステータスをスケジュールし、そしてWordPress経由で投稿を非公開にしてスケジュールします。

WordPressの投稿が予定されている場合、編集者は事前に公開されたページにアクセスできますが、URLにアクセスすると他の人に404が表示されます。特定のユーザーエージェント(Facebookなど)が投稿前に投稿にアクセスすることを許可するにはどうすればよいですか。

2
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のボットは予定された投稿を見ることができますが、他の人は見ることができません。他のプラグインを使用している場合は、関連するキャッシュ設定を必ず更新してください。

スケジュールされた投稿のプレビューを誰にも見えるようにするには? および Facebook User-Agentの認識方法 を使用して回答を導き出します。

1
prunmit