Erlauben Sie den Redakteuren, ausstehende Beiträge zu bearbeiten, aber keine Entwürfe

8

Ich habe eine große Anzahl von Benutzern mit Editor-Funktionen, die beim Durchgehen der Beiträge helfen. Dies ist mein aktuelles Setup für diese Rolle:

Editor-Funktionen

Wie Sie sehen können, dürfen edit_postsund dürfen edit_others_postssie nicht edit_published_posts. Dies bedeutet, dass sie Beiträge bearbeiten können, die sich im Status " Entwurf" und " Ausstehend " befinden.

Jetzt möchte ich sie darauf beschränken, nur ausstehende Beiträge bearbeiten zu können. Sie können also keine Entwurfsbeiträge berühren ( es sei denn, sie sind der Autor des Beitrags). Leider gibt es keine Fähigkeit wie edit_pending_posts... sollte es sein .

Wie löse ich das?

Christine Cooper
quelle

Antworten:

4

Das ist eigentlich nicht schwer. Rufen Sie an, um eine neue Funktion hinzuzufügen WP_Roles->add_cap(). 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 Plugin-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 nach ... filtern.

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

… Weil WordPress so prüft, ob ein Benutzer einen Beitrag bearbeiten kann. Intern wird dies der edit_others_postsFähigkeit für Beiträge anderer Autoren zugeordnet.

Wir müssen also user_has_capunsere neuen edit_pending_postsFunktionen filtern und untersuchen, wenn einige diese Funktionen nutzen edit_postmöchten.

Ich habe auch aufgenommen delete_post, weil 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;
}
Fuxia
quelle
Ich habe Tests gemacht und bin auf ein paar Probleme gestoßen. Erstens hatte ich edit_postsund edit_others_postsweiter mit dem neuen edit_pending_posts. Ich habe versucht, nur edit_pending_postsohne die anderen beiden weiterzumachen, und das Post-Menü wurde nicht angezeigt. Beim Testen stellte ich fest, dass ich einen neuen Beitrag hinzufügen, aber den Entwurf nicht speichern konnte ( You are not allowed to edit this postHinweis). Haben Sie getestet, um Ihren eigenen Beitrag in dieser Rolle zu speichern? Das Bearbeiten ausstehender Beiträge ist in Ordnung.
Christine Cooper
@ChristineCooper Dies geschah, weil $post->post_authores als Zeichenfolge , aber $args[1]als Ganzzahl übergeben wird. Manchmal. Dummes WordPress! Ich habe es behoben, indem ich beide in ganze Zahlen umgewandelt habe. Und ich erlaubte den Redakteuren, ihre eigenen veröffentlichten Beiträge zu bearbeiten. Wenn Sie das nicht möchten, entfernen Sie die returnZeile im Block danach // Let users edit their own posts.
Fuxia
Ich habs! Ein Problem bleibt bestehen. Ich habe Ihren aktualisierten Code getestet und es hat gut funktioniert! Ich möchte den Redakteuren jedoch nicht erlauben, ihre veröffentlichten Beiträge zu bearbeiten, daher habe ich diese return $allcaps;Zeile entfernt und das gleiche Berechtigungsproblem tritt beim Speichern des Entwurfs auf. Warum?
Christine Cooper
Hm, arbeitet für mich. Meine Fähigkeitseinstellungen
Fuxia
Nur um zu bestätigen, haben Sie sich darauf bezogen, die Rückleitung unter zu entfernen $allcaps[ $caps[0] ] = TRUE;? Sehr seltsam, dass ich dies erlebe, es macht logischerweise keinen Sinn, dass es für mich nicht funktionieren sollte, wenn es für Sie funktioniert. Hier ist mein Setup: i.imgur.com/X3bv9rH.png
Christine Cooper