web-dev-qa-db-fra.com

revenir en arrière d'une révision d'un post-progmatiquement via le code?

J'aurais pensé une question simple mais je ne trouve pas de fonction pour le faire dans l'API WordPress.

Je veux juste revenir à une révision précédente dès qu'un utilisateur met à jour un message. Cela permettrait aux administrateurs/éditeurs de passer en revue la dernière révision non en direct, tandis que l’ancienne donne l’impression de rester en direct. L'éditeur/administrateur basculerait alors le message sur la dernière révision s'il en était satisfait.

5
AdamJones

J'ai donc réussi à trouver une solution en laissant les rédacteurs/administrateurs superviser le post alors que les précédents restent en direct, ce qui est plutôt alambiqué, mais fonctionne.

L'essentiel était de créer un nouveau statut de poste que j'appelle en attente. Dans l'admin, cela apparaît comme "modifications en attente d'approbation".

// Define new awaiting status
function my_custom_post_status(){
register_post_status( 'awaiting', array(
    'label'                     => _x( 'Changes Awaiting Approval', 'custom-post-type' ),
    'public'                    => true,
    'exclude_from_search'       => false,
    'show_in_admin_all_list'    => true,
    'show_in_admin_status_list' => true,
    'label_count'               => _n_noop( 'Changes Awaiting Approval <span class="count">(%s)</span>', 'Changes Awaiting Approval <span class="count">(%s)</span>' ),
   ) );
 }
add_action( 'init', 'my_custom_post_status' );

De manière critique, il s'agit d'un type d'état public.

Je force ensuite les mises à jour par des utilisateurs spécifiques à changer le statut de la publication à ce nouveau statut via un hook à la fin du processus de publication de la mise à jour ...

function published_to_pending( $post_id ) {
    global $post, $current_user, $wp_meta_boxes ;

    if ( !is_object( $post ) )
        $post = get_post( $post_id );
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;
    // check for specific user that needs this publish to pending. otherwise exit
    if (get_current_user_role()!="custom-user-role"){
        return;
    }
    if ( $post->post_status=="publish" ) {
        global $wpdb;
        $result = $wpdb->update(
            $wpdb->posts,
            array( 'post_status' => "awaiting" ),
            array( 'ID' => $post_id )
        );
    }
}
add_action( 'post_updated', 'published_to_pending', 13, 2 );

function get_current_user_role() {
    global $wp_roles;
    $current_user = wp_get_current_user();
    $roles = $current_user->roles;
    $role = array_shift($roles);

return $role;
}

Notez qu'un moyen très courant de mettre à jour le statut de la publication via le hook "save_post" n'était pas bon pour moi. C'est parce que j'ai réalisé que l'utilisation de ce hook ne sauvegardait pas les métadonnées correctement connectées à la publication et cela ruinait mes propriétés AdvancedCustomField.

Enfin, au début de la page single.php pour afficher mes entrées, je vérifie le statut de la publication et, si elle est == "en attente", je fais ensuite une requête manuelle $ wpdb pour obtenir la révision précédente de la publication et ses méta-propriétés associées. J'espère que cela est utile aux autres.

3
AdamJones

Je doute qu'il soit facile de faire ce que vous voulez et de forcer les éditeurs à afficher automatiquement une révision tandis qu'une autre est publiée (il peut y avoir un plugin), mais voici un code autonome permettant d'identifier les révisions et de revenir à une version spécifique:

# get all revisions for post ID 1 in an array (keys = ID, val = full WP_Post object)
$revisions = wp_get_post_revisions(1);
# they're returned in reverse order (most recent first), so previous is 2nd array element
wp_restore_post_revision($revisions[1]->ID);

Remarque: il n'y aura qu'une révision lors de la première publication d'un article (sauf si l'utilisateur a enregistré un brouillon.)

Documentation: wp_restore_post_revision

2
William Turrell