web-dev-qa-db-fra.com

Autoriser Facebook à prévisualiser les publications avant publication

Je souhaite autoriser Facebook (agent utilisateur facebookexternalhit) à accéder aux publications planifiées avant leur publication afin de pouvoir accéder aux méta-informations afin de planifier un statut. Actuellement, je publie temporairement des publications, planifie les statuts Facebook, puis annule et publie des publications via WordPress.

Lorsqu'une publication WordPress est programmée, les éditeurs peuvent accéder à la page pré-publiée, mais tous les autres utilisateurs reçoivent un 404 lors de la visite de l'URL. Comment puis-je autoriser un certain agent utilisateur (Facebook, par exemple) à accéder également aux publications avant leur publication?

2
prunmit

Créez un nouveau plugin avec le code suivant:

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' ] );

Cela permet au bot Facebook de voir les messages programmés, mais empêche le reste du public de le voir. N'oubliez pas de mettre à jour tous les paramètres de cache pertinents si vous utilisez d'autres plugins.

Réponse dérivée à l'aide de Comment rendre l'aperçu de publication programmé visible par quiconque? et Comment reconnaître l'utilisateur Facebook - Agent .

1
prunmit