web-dev-qa-db-fra.com

Comment laisser le rôle de contributeur prévisualiser les publications non publiées?

Les contributeurs sur notre site wordpress ne peuvent pas prévisualiser les messages. J'aimerais qu'ils puissent prévisualiser n'importe quel message (pas seulement le leur), ce qui devrait inclure des types de message personnalisés.

Je ne trouve pas de capacité spécifique à ajouter au rôle de contributeur, contrairement à d'autres capacités.

2
RailsTweeter

Malheureusement, WordPress n'utilise pas de fonctionnalité distincte pour prévisualiser les publications. Un utilisateur a besoin de la capacité de edit a post pour pouvoir en avoir un aperçu. Comme vu dans la méthode WP_Query :: get_posts () :

// User must have edit permissions on the draft to preview.
if ( ! current_user_can($edit_cap, $this->posts[0]->ID) ) {
    $this->posts = array();
}

Ce que vous pouvez faire est d'utiliser une combinaison du filtre posts_results (appliqué avant le traitement des publications non publiées) et du filtre the_posts (appliqué ensuite), pour remplir à nouveau le tableau de publications si l'utilisateur est un contributeur.

Vérifiez cette information à la recherche d’implications de sécurité permettant à des utilisateurs de niveau inférieur d’avoir un aperçu du contenu non publié.

Exemple non testé:

class wpse_196050 {

    protected $posts = array();

    public function __construct() {
        add_filter( 'posts_results', array( $this, 'filter_posts_results' ), 10, 2 );
        add_filter( 'the_posts',     array( $this, 'filter_the_posts' ), 10, 2 );
    }

    public function filter_posts_results( array $posts, WP_Query $query ) {
        if ( $query->is_preview ) {
            $this->posts = $posts;
        }
        return $posts;
    }

    public function filter_the_posts( array $posts, WP_Query $query ) {
        if ( ! empty( $this->posts ) && current_user_can( 'edit_posts' ) ) {
            $posts = $this->posts;
        }
        return $posts;
    }

}

new wpse_196050;
1
John Blackbourn

En utilisant un plugin personnalisé, et basé sur this answer:

//allow post preview if you are the post owner, whatever role you might have (e.g. contributor)
function jv_change_post( $posts ) {
    if(is_preview() && !empty($posts)){
        if(user_can('contributor')) 
            $posts[0]->post_status = 'publish';
    }

    return $posts;
}
add_filter( 'posts_results', 'jv_change_post', 10, 2 );

En gros, cela fait croire aux publications "futures" qu'elles sont déjà publiées (mais uniquement dans le contexte de la requête en cours), ce qui permet au contributeur de les visualiser.

1
Horakiri Suo