Consenti ai redattori di modificare i post in sospeso ma non quelli di bozza


8

Ho un gran numero di utenti con capacità di editor che aiutano a passare attraverso i post inviati. Questa è la mia configurazione attuale per questo ruolo:

Funzionalità dell'editor

Come si può vedere, essi sono autorizzati a edit_postse edit_others_postsma non possono edit_published_posts. Ciò significa che possono modificare i post in stato Bozza e In sospeso .

Ora, voglio limitarle al solo essere in grado di modificare in attesa di messaggi. Pertanto, non avranno la possibilità di toccare le bozze di post (a meno che non siano l'autore del post). Sfortunatamente non ci sono capacità come edit_pending_posts... ci dovrebbe essere .

Come lo risolvo?

Risposte:


4

Questo in realtà non è difficile. Per aggiungere una nuova funzionalità, chiama WP_Roles->add_cap(). Devi farlo solo una volta, perché sarà archiviato nel database. Quindi usiamo un hook di attivazione del plugin.

Nota per gli altri lettori: tutto il codice seguente è il territorio del plug-in .

register_activation_hook( __FILE__, 'epp_add_cap' );

/**
 * Add new capability to "editor" role.
 *
 * @wp-hook "activate_" . __FILE__
 * @return  void
 */
function epp_add_cap()
{
    global $wp_roles;

    if ( ! isset( $wp_roles ) )
        $wp_roles = new WP_Roles;

    $wp_roles->add_cap( 'editor', 'edit_pending_posts' );
}

Ora dobbiamo filtrare tutte le chiamate per ...

current_user_can( $post_type_object->cap->edit_post, $post->ID );

... perché è così che WordPress controlla se un utente può modificare un post. Internamente, questo sarà mappato sulla edit_others_postscapacità di post di altri autori.

Quindi dobbiamo filtrare user_has_caped esaminare la nostra nuova edit_pending_postscapacità quando qualcuno vuole usare la edit_postcapacità.

Ho incluso delete_postanche, perché anche questa è una specie di modifica.

Sembra complicato, ma è davvero semplice:

add_filter( 'user_has_cap', 'epp_filter_cap', 10, 3 );

/**
 * Allow editing others pending posts only with "edit_pending_posts" capability.
 * Administrators can still edit those posts.
 *
 * @wp-hook user_has_cap
 * @param   array $allcaps All the capabilities of the user
 * @param   array $caps    [0] Required capability ('edit_others_posts')
 * @param   array $args    [0] Requested capability
 *                         [1] User ID
 *                         [2] Post ID
 * @return  array
 */
function epp_filter_cap( $allcaps, $caps, $args )
{
    // Not our capability
    if ( ( 'edit_post' !== $args[0] && 'delete_post' !== $args[0] )
        or empty ( $allcaps['edit_pending_posts'] )
    )
        return $allcaps;

    $post = get_post( $args[2] );


    // Let users edit their own posts
    if ( (int) $args[1] === (int) $post->post_author
        and in_array(
            $post->post_status,
            array ( 'draft', 'pending', 'auto-draft' )
        )
    )
    {
        $allcaps[ $caps[0] ] = TRUE;
    }
    elseif ( 'pending' !== $post->post_status )
    { // Not our post status
        $allcaps[ $caps[0] ] = FALSE;
    }

    return $allcaps;
}

Ho fatto dei test e ho riscontrato alcuni problemi. In primo luogo, ho avuto edit_postse edit_others_postsavanti con il nuovo edit_pending_posts. Ho provato ad avere solo edit_pending_postssenza gli altri due e il menu dei post non è stato visualizzato. Durante il test, ho scoperto che potevo aggiungere un nuovo post, ma non sono riuscito a salvare la bozza ( You are not allowed to edit this postavviso). Hai testato per salvare il tuo post in questo ruolo? La modifica dei post in sospeso va bene.
Christine Cooper

@ChristineCooper Questo è successo perché $post->post_authorè passato come una stringa , ma $args[1]come un numero intero. Qualche volta. Stupido WordPress! L'ho risolto lanciando entrambi in numeri interi. E ho permesso agli editori di modificare i propri post pubblicati. Se non lo desideri, rimuovi la returnriga nel blocco dopo // Let users edit their own posts.
fuxia

Fatto! Rimane un problema. Ho testato il tuo codice aggiornato e ha funzionato bene! Tuttavia, non voglio consentire agli editori di modificare i loro post pubblicati, quindi ho rimosso quella return $allcaps;riga e lo stesso problema di autorizzazione appare con il salvataggio della bozza. Perché?
Christine Cooper


Solo per confermare, ti riferivi per rimuovere la linea di ritorno sotto $allcaps[ $caps[0] ] = TRUE;? Molto strano che lo stia vivendo, non ha senso logicamente che non dovrebbe funzionare per me se lo fa per te, ecco la mia configurazione: i.imgur.com/X3bv9rH.png
Christine Cooper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.