Warum benötigt meine benutzerdefinierte WP-Rolle edit_posts, um Bilder zu bearbeiten?

7

Dies kann für andere als mich offensichtlich sein. Ich denke, ich erinnere mich, dass ich irgendwo gelesen habe, dass ein "Bild" tatsächlich eine Form von "Post" ist.

  • Ich habe einen benutzerdefinierten Beitragstyp namens "Auflistung".
  • Ich habe eine benutzerdefinierte WP-Rolle von "Client"

Wenn ich als "Client" angemeldet bin und das Medien-Popup starte, zu einem Bild navigiere, auf "Anzeigen" klicke, um es zu öffnen, und dann auf "Bild bearbeiten" klicke, erhalte ich eine -1. Dh. nichts anderes wird angezeigt als "-1".

Ich kann dieses Problem beheben, indem ich meiner benutzerdefinierten Rolle die Funktion "edit_posts" zuweisen. Warum ist das? Sobald ich dies tue, habe ich ein anderes Problem: Die Benutzerrolle "Client" hat jetzt Zugriff auf Beiträge, Kommentare und Tools, die ich nicht möchte.

Vielleicht habe ich meinen benutzerdefinierten Beitragstyp mit den Funktionen nicht richtig eingerichtet? Wie kann ich dem "Kunden" erlauben, die Bilder zu bearbeiten, aber keinen Zugriff auf Beiträge zu haben?

      $args = array(
    'label' => 'Listing',
    'description' => '',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'show_in_nav_menus' => true,
    'map_meta_cap' => true,
    'capability_type' => 'listing',
    'capabilities' => array(
                    'edit_post' => 'edit_listing',
                    'read_post' => 'read_listing',
                    'delete_post' => 'delete_listing',
                    'edit_posts' => 'edit_listings',
                    'edit_others_posts' => 'edit_others_listings',
                    'publish_posts' => 'publish_listings',
                    'read_private_posts' => 'read_private_listings',
                    'delete_posts' => 'delete_listings',
                    'delete_private_posts' => 'delete_private_listings',
                    'delete_published_posts' => 'delete_published_listings',
                    'delete_others_posts' => 'delete_others_listings',
                    'edit_private_posts' => 'edit_private_listings',
                    'edit_published_posts' => 'edit_published_listings',
                ),
    'menu_position' => 5, 
    'hierarchical' => false,
    'has_archive' => false, 
    'rewrite' => array('slug' => 'listing'), 
    'query_var' => true,
    'supports' => array('title'),
    'labels' => $labels
  ); 
Andrew
quelle
Hier sind die Funktionen, die ich meiner benutzerdefinierten WordPress-Rolle zuweisen werde, falls jemand etwas erkennen kann. delete_listing delete_listings delete_published_listings edit_listing edit_listings edit_published_listings publish_listing publish_listings read read_listing upload_files Und ich brauche anscheinend Folgendes, um die Bilder zu bearbeiten und zu löschen. Dachte, diese würden zu edit_listings und delete_listings neu zugeordnet edit_posts delete_posts
Andrew
Ich habe den folgenden Beitrag gefunden, den ich gerade untersuche. Scheint ein größeres Problem zu sein, als ich dachte, wo edit_posts erforderlich ist. Anscheinend gibt es ein allgemeines Problem bei der Verwendung von benutzerdefinierten Beitragstypen + benutzerdefinierten Rollen + Taxonomien wordpress.org/support/topic/…
Andrew

Antworten:

0

Wenn ich zu erraten: denn Bilder sind Attachments und Anhänge sind ein Post-Typ . Um ein Bild zu bearbeiten, das ein Anhang ist, der ein Beitrag ist, ist daher die edit_postFähigkeit erforderlich .

BEARBEITEN

Haben Sie Ihre capabilityMapping-Array-Schlüssel / -Werte nicht umgekehrt?

zB hast du 'edit_posts' => 'edit_listings'. Sollte es nicht stattdessen sein 'edit_listings' => 'edit_posts'?

Chip Bennett
quelle
In meinem obigen Setup für benutzerdefinierte Post-Typen habe ich edit_posts edit_listings neu zugeordnet, und der benutzerdefinierten WordPress-Rolle wurden "edit_listings" zugewiesen. Ich dachte, das wäre der Zweck, sie neu zuzuordnen, vielleicht habe ich mich geirrt?
Andrew
Siehe Bearbeiten in aktualisierter Antwort.
Chip Bennett
Bennett Ich habe sie umgekehrt, aber es schien keine Auswirkungen zu haben und ich brauche immer noch edit_posts, um das Bild bearbeiten zu können. Zeigt immer noch -1 ohne. Ich habe ursprünglich Justin Tadlocks Beispiel "Einrichten Ihres benutzerdefinierten Beitragstyps" unten befolgt, in dem er links die _posts und rechts die neu zugeordneten Funktionen hat. justintadlock.com/archives/2010/07/10/…
Andrew
Nach einiger Zeit der Arbeit mit benutzerdefinierten Beitragstypen, Rollen und Funktionen glaube ich, dass ich sie viel besser verstehe. Sie hatten Recht, ein Bild ist ein Beitrag. Damit ein Benutzer ein hochgeladenes Bild bearbeiten kann, muss er es bearbeiten edit_posts. Damit sie ein Bild löschen können, benötigen sie delete_posts. Ich bin edit_listingsmir nicht sicher, warum ich überhaupt nicht richtig zugeordnet habe edit_posts.
Andrew
6

Ich weiß, dass diese Frage jetzt ein Jahr alt ist, aber ich habe gerade herausgefunden, dass es tatsächlich einen Weg gibt, dies zu erreichen. Veröffentlichen Sie sie hier, falls sie für andere nützlich ist:

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

function my_user_has_cap( $user_caps, $req_cap, $args ) {

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

    if ( 'attachment' != $post->post_type )
        return $user_caps;

    if ( 'delete_post' == $args[0] ) {

        if ( $user_caps['delete_others_posts'] )
            return $user_caps;

        if ( !isset( $user_caps['delete_others_listings'] ) or !$user_caps['delete_others_listings'] )
            return $user_caps;

        $user_caps[$req_cap[0]] = true;

    }

    if ( 'edit_post' == $args[0] ) {

        if ( $user_caps['edit_others_posts'] )
            return $user_caps;

        if ( !isset( $user_caps['edit_others_listings'] ) or !$user_caps['edit_others_listings'] )
            return $user_caps;

        $user_caps[$req_cap[0]] = true;

    }

    return $user_caps;

}

Dies basiert hauptsächlich auf diesem Codex-Artikel .

Ich bekomme immer noch meine Head-Round-Funktionen-Filter und es ist 2:04 Uhr morgens, daher kann mein Code möglicherweise verbessert werden ...

Simon Blackbourn
quelle
Das hat bei mir funktioniert. Nur eine Anmerkung, in der ersten Codezeile steht ein zusätzliches ")". In meinem Fall, da ich ein Plugin verwende, um Leuten nur ihre eigenen Uploads anzuzeigen, brauchte ich nur die if-Anweisung, um dies zu überprüfen. Dies ist ein Anhang.
Coopersita
Ich bin froh, dass es für Sie nützlich ist - ich habe jetzt die überflüssige Halterung entfernt, danke, dass Sie das entdeckt haben.
Simon Blackbourn