Die benutzerdefinierte Funktion für WordPress-Rollen ist auf „true“ gesetzt, gibt aber „false“ zurück

Lesezeit: 6 Minuten

kindischs Benutzeravatar
kindisch

Ich versuche, eine Benutzerrolle mit einigen benutzerdefinierten Funktionen zu erstellen. Das funktioniert soweit. Aber wenn ich die Benutzerberechtigungen einer bestimmten Funktion mit der Funktion überprüfen möchte current_user_can() es gibt falsch zurück. Aber innerhalb des Capabilities-Arrays der neu erstellten Rolle wird die spezifische Capability auf „true“ gesetzt.

Um meinen Worten ein bisschen mehr Codierungshintergrund zu geben:

DAS ROLLENOBJEKT

WP_Role {
  ["name"]=> "organizer"
  ["capabilities"]=> {
       ["edit_posts"]              => bool(false)
       ["delete_posts"]            => bool(false)
       ["publish_posts"]           => bool(false)
       ["upload_files"]            => bool(true)
       ["edit_event"]              => bool(true)
       ["read_event"]              => bool(true)
       ["delete_event"]            => bool(true)
       ["edit_events"]             => bool(true)
       ["edit_others_events"]      => bool(false)
       ["publish_events"]          => bool(false)
       ["read_private_events"]     => bool(true)
       ["read"]                    => bool(true)
       ["delete_events"]           => bool(true)
       ["delete_private_events"]   => bool(false)
       ["delete_published_events"] => bool(true)
       ["delete_others_events"]    => bool(false)
       ["edit_private_events"]     => bool(false)
       ["edit_published_events"]   => bool(true)
       ["manage_event_terms"]      => bool(true)
       ["edit_event_terms"]        => bool(true)
       ["delete_event_terms"]      => bool(true)
       ["assign_event_terms"]      => bool(true)
  }

MEINE ROLLE HINZUFÜGEN FUNKTION

add_role( 'organizer', __( 'Organizer', 'eventtool' ), array(
            // General
            'edit_posts'              => false,
            'delete_posts'            => false,
            'publish_posts'           => false,
            'upload_files'            => true,
            'edit_event'              => true,
            'read_event'              => true,
            'delete_event'            => true,

            // Primitive capabilities used outside of map_meta_cap():
            'edit_events'             => true,
            'edit_others_events'      => false,
            'publish_events'          => false,
            'read_private_events'     => true,

            // Primitive capabilities used within map_meta_cap():
            'read'                    => true,
            'delete_events'           => true,
            'delete_private_events'   => false,
            'delete_published_events' => true,
            'delete_others_events'    => false,
            'edit_private_events'     => false,
            'edit_published_events'   => true,
            'edit_events'             => true,

            // Terms
            'manage_event_terms'      => true,
            'edit_event_terms'        => true,
            'delete_event_terms'      => true,
            'assign_event_terms'      => true
        )
);

BENUTZERDEFINIERTER POSTTYP ARGS

register_post_type( 'event', array(
                'labels'              => $labels,
                'description'         => __( 'This is where you can add new events to your page.', 'eventtool' ),
                'public'              => true,
                'show_ui'             => true,
                'capability_type'     => 'event',
                'map_meta_cap'        => true,
                'publicly_queryable'  => true,
                'exclude_from_search' => false,
                'hierarchical'        => false,
                'rewrite'             => _x( 'event', 'slug', 'eventtool' ),
                'query_var'           => true,
                'supports'            => array( 'title', 'editor', 'excerpt', 'thumbnail' ),
                'show_in_nav_menus'   => true
            )
        );

[UPDATE]

function et_modify_map_meta_cap( $caps, $cap, $user_id, $args ) {

    var_dump($cap)

}
add_filter( 'map_meta_cap', 'et_modify_map_meta_cap', 10, 4 );

Gibt ‘edit_post’ statt ‘edit_event’ aus

Irgendwelche Vorschläge, warum dieses falsche Verhalten auftritt?

  • Sie zeigen nicht, wo Sie verwenden current_user_can… und was macht der Filter map_meta_cap hat das damit zu tun? . . . Mein var_dump($cap) zeigt an edit_events gut…

    – Brasilo

    31. Januar 2016 um 7:31 Uhr

  • Danke, brafilo. Ihre Antwort hat mich veranlasst, um die Ecke zu denken. 🙂

    – kindisch

    4. Februar 2016 um 21:52 Uhr

kindischs Benutzeravatar
kindisch

Heute habe ich es gelöst.

Für den zweiten Parameter muss dem eine Objekt-ID zugewiesen werden current_user_can() Funktion, um die korrekte Rückgabe von Single-Pointed-Fähigkeiten zu erhalten (z. B. ‘edit_post’). Andernfalls gibt die Funktion false zurück, wenn dieser Parameter nicht gesetzt ist.

Wie im Inneren der WordPress-Dokumentation:

Wenn Sie nichts auslassen, erhalten Sie möglicherweise die Warnung „Undefinierter Offset: 0“ (das liegt daran, dass die current_user_can Funktion schließlich aufruft map_meta_cap die beim Prüfen gegen Metafähigkeiten ein Array erwartet, aber nur einen einzigen Wert erhält)

Versuchen Sie, diese zu registrieren capabilities zum benutzerdefinierten Beitragstyp event zuerst , und diese dann zuweisen capabilities zu organiser

So was :

function create_my_post_types() {
    register_post_type(
        'movie',
        array(
            'public' => true,
            'capability_type' => 'movie',
            'capabilities' => array(
                'publish_posts' => 'publish_movies',
                'edit_posts' => 'edit_movies',
                'edit_others_posts' => 'edit_others_movies',
                'delete_posts' => 'delete_movies',
                'delete_others_posts' => 'delete_others_movies',
                'read_private_posts' => 'read_private_movies',
                'edit_post' => 'edit_movie',
                'delete_post' => 'delete_movie',
                'read_post' => 'read_movie',
            ),
        )
    );
}

Ändern Sie den Code in event Post-Typ.

Und überprüfen Sie stattdessen die Benutzerfunktionen mit dem folgenden Code:

add_filter( 'map_meta_cap', 'my_map_meta_cap', 10, 4 );

function my_map_meta_cap( $caps, $cap, $user_id, $args ) {

    /* If editing, deleting, or reading a movie, get the post and post type object. */
    if ( 'edit_movie' == $cap || 'delete_movie' == $cap || 'read_movie' == $cap ) {
        $post = get_post( $args[0] );
        $post_type = get_post_type_object( $post->post_type );

        /* Set an empty array for the caps. */
        $caps = array();
    }

    /* If editing a movie, assign the required capability. */
    if ( 'edit_movie' == $cap ) {
        if ( $user_id == $post->post_author )
            $caps[] = $post_type->cap->edit_posts;
        else
            $caps[] = $post_type->cap->edit_others_posts;
    }

    /* If deleting a movie, assign the required capability. */
    elseif ( 'delete_movie' == $cap ) {
        if ( $user_id == $post->post_author )
            $caps[] = $post_type->cap->delete_posts;
        else
            $caps[] = $post_type->cap->delete_others_posts;
    }

    /* If reading a private movie, assign the required capability. */
    elseif ( 'read_movie' == $cap ) {

        if ( 'private' != $post->post_status )
            $caps[] = 'read';
        elseif ( $user_id == $post->post_author )
            $caps[] = 'read';
        else
            $caps[] = $post_type->cap->read_private_posts;
    }

    /* Return the capabilities required by the user. */
    return $caps;
}

  • 1. Um ein Extra zuzuweisen capabilities Array zum register_post_type Funktion ist in diesem Fall nicht erforderlich. Das Argument capability_type wird dies für Sie tun. Dies ist beispielsweise erforderlich, wenn Sie den Beitragstyp „Erinnerung“ haben. Dann würde es automatisch generiert edit_others_memorys Anstatt von edit_others_memories. Daher können Sie das im Inneren anpassen capabilities Streit

    – kindisch

    29. Januar 2016 um 18:33 Uhr

  • 2. Das wird nicht funktionieren. Die Fähigkeiten werden auf den Organisator gesetzt und befinden sich in der Datenbank von WordPress, daher spielt es keine Rolle, ob ich die Fähigkeiten vor oder nach dem hinzufüge register_post_type Funktion zur Rolle. Was zählt, ist, dass sie innerhalb des Role-Objekts gesetzt sind, und das sind sie.

    – kindisch

    29. Januar 2016 um 18:33 Uhr

Versuchen user_can(). Sie müssen die Benutzer-ID als ersten Parameter übergeben. Du kannst es durchziehen get_current_user_id().

  • Das wird auch false zurückgeben, weil user_can() und get_current_user_id() rufen dieselbe Funktion auf, um die Fähigkeit zu überprüfen Siehe hier, Zeile 501 return call_user_func_array( array( $user, 'has_cap' ), $args );

    – kindisch

    30. Januar 2016 um 13:54 Uhr


  • Dann haben Sie zwei Möglichkeiten, dies zu tun. Behandeln Sie zunächst WP_Role als OOP-Objekt und prüfen Sie, ob ein bestimmtes Element im Property-Array „capabilities“ vorhanden ist. Oder Sie können die $wpdp-Abfrage überprüfen.

    – Loai Abdelhalim

    30. Januar 2016 um 14:10 Uhr


1400350cookie-checkDie benutzerdefinierte Funktion für WordPress-Rollen ist auf „true“ gesetzt, gibt aber „false“ zurück

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy