wake-up-neo.net

Erlauben Sie den Redakteuren, ausstehenden Beiträgen zu bearbeiten, jedoch keine Entwürfe

Ich habe eine große Anzahl von Benutzern mit Editor Fähigkeiten , die beim Durchlaufen der Post-Einreichungen helfen. Dies ist mein aktuelles Setup für diese Rolle:

Editor Capabilities

Wie Sie sehen, dürfen sie edit_posts und edit_others_posts, aber nicht edit_published_posts. Dies bedeutet, dass sie Posts bearbeiten können, die sich im Status Entwurf und Ausstehend befinden.

Jetzt möchte ich sie auf only beschränken, um ausstehende Posts bearbeiten zu können. Daher können sie Entwurfspostings nicht berühren (sofern sie nicht der Autor des Posts sind). Leider gibt es keine Funktionen wie edit_pending_posts... sollte es geben.

Wie löse ich das?

8

Das ist eigentlich nicht schwer. Rufen Sie WP_Roles->add_cap() auf, um eine neue Funktion hinzuzufügen. Sie müssen dies nur einmal tun, da es in der Datenbank gespeichert wird. Also verwenden wir einen Plugin-Aktivierungs-Hook.

Hinweis für andere Leser: Der gesamte folgende Code ist Plug-in-Gebiet .

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

Jetzt müssen wir alle Anrufe filtern für ...

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

… Denn so prüft WordPress, ob ein Benutzer einen Beitrag bearbeiten kann. Intern wird dies der edit_others_posts -Funktion für Beiträge anderer Autoren zugeordnet.

Wir müssen also user_has_cap filtern und unsere neue edit_pending_posts -Funktion untersuchen, wenn einige die edit_post -Funktion verwenden möchten.

Ich habe auch delete_post eingefügt, da dies auch eine Art Bearbeitung ist.

Klingt kompliziert, ist aber ganz einfach:

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;
}
4
fuxia