Erlaube dem Mitwirkenden, den Autor seines eigenen Beitrags zu ändern?

9

Ist es möglich, dass ein Mitwirkender den Autor seiner eigenen Beiträge ändert? Mir ist klar, dass dies sie effektiv von der Post ausschließen wird, das ist was ich will. Ich möchte, dass sie den Autor ändern können, sobald sie mit der Bearbeitung fertig sind.

Michael Rogers
quelle
Ich frage mich hier nur, ob es einen anderen Weg gibt, um die geschäftlichen Anforderungen zu erfüllen. Es scheint ein wenig weit gefasst zu sein, einem Nicht-Editor / Administrator die Möglichkeit zu geben, einem anderen Autor seinen Beitrag zuzuweisen. Gibt es eine vordefinierte Liste von Autoren, die sie als "Autor" zuweisen können? Gibt es eine definierte Beziehung zwischen dem Mitwirkenden und den zugelassenen Autoren? Oder können sie einen beliebigen Autor auswählen?
Anmari
Ich stelle auch fest, dass dies ihren Beitrag nicht "veröffentlichen" wird. Es klingt daher so, als ob die Absicht darin besteht, einen Workflow nachzuahmen, bei dem der Mitwirkende den Beitrag einem Autor zuweist, anstatt zu sagen, dass ein Redakteur die "ausstehenden" Beiträge zur Überprüfung auswählt. Wenn Ihre Autoren Redakteure sein könnten, dann gehen Sie vielleicht mit wp wie es ist und verwenden Sie vielleicht Tags, um zu kommunizieren oder hervorzuheben, welche Redakteure welche Beiträge aufnehmen sollen?
Anmari
Ah, du sagst "sperr sie aus der Post, das ist was ich will". Ist das wichtiger Dass sie, sobald sie zur Überprüfung eingereicht wurden, nicht mehr bearbeiten können? Ist es notwendig, sich mit "Autoren" anzulegen? Oder würde ein nicht öffentlicher Status funktionieren? Vielleicht mit codex.wordpress.org/Post_Status#Custom_Status
anmari

Antworten:

1

Ich füge eine zweite Antwort hinzu, weil mein erster Ansatz abgelehnt wurde und dieser nicht die richtige Aufmerksamkeit erhielt.

Die Idee ist, eine benutzerdefinierte Meta-Box zu erstellen, die alle Benutzer auflistet und den Autor in save_postHook ändert . Auf diese Weise können Sie die Benutzerfunktionen nicht beeinträchtigen und der Autorenwechsel erfolgt, wenn die Beiträge bereits gespeichert sind. Der zusätzliche Gewinn besteht auch darin, dass Sie die Liste der Benutzer steuern können, die in der Autoren-Dropdown-Liste verfügbar sind. Schritte zum folgen:

Meta-Box registrieren:

function wpse313020_add_custom_box() {

    // Bail out for users other than contributors
    if ( ! user_can( get_current_user_id(), 'contributor' ) ) {
        return;
    } 

    // Register custom meta box
    add_meta_box(
        'wpse313020_author_override',
        'Change Author', // metabox title
        'wpse313020_author_ovveride_box_html', // callbac function
        'post' // a post type you want to show the metabox on
    );
}
add_action('add_meta_boxes', 'wpse313020_add_custom_box');

Erstellen Sie ein Markup für Ihre Meta-Box:

/**
 * HTML for custom meta box
 */
 function wpse313020_author_ovveride_box_html() {
    // you can modify the list of users by passing additional args to get_users()
    $users = get_users();
    ?>
    <label for="wpse313020_author_override_id">Select post author</label><br />
    <select name="wpse313020_author_override_id" id="wpse313020_author_override_id" class="postbox">
        <option value="">Select user...</option>
        <?php
        // get post ID on admin edit screen and retrieve saved post meta
        $post_id     = is_admin() && isset( $_GET['post'] ) ? absint( wp_unslash( $_GET['post'] ) ) : '';
        $saved_value = ! empty( $post_id ) ? get_post_meta( $post_id, 'wpse313020_author_override', true ) : '';

        foreach ( $users as $user ) {
            echo sprintf( '<option value="%1$d" %2$s>%3$s</option>', absint( $user->ID ), selected( $saved_value, absint($user->ID, false ) ), esc_html( $user->display_name ) );
        }
        ?>
    </select>
    <?php
 }

Haken Sie ein save_post, um Daten zu speichern und den Autor zu überschreiben:

/**
 * Save custom post meta and override the post author
 */
function wpse313020_save_postdata( $post_id ) {

    if ( array_key_exists('wpse313020_author_override_id', $_POST ) ) {
        // save post meta with author ID
        update_post_meta( $post_id, 'wpse313020_author_override', absint( $_POST['wpse313020_author_override_id'] ) );

        // now modify the post author, we need to unhook the current function to prevent infinite loop
        // you could add additional check here to see if the current author is not the same as chosen author

        remove_action( 'save_post', 'wpse313020_save_postdata' );

        $updated_data = [
            'ID'          => $post_id,
            'post_author' => absint( $_POST['wpse313020_author_override_id'] ),
        ];

        wp_update_post( $updated_data );

        add_action( 'save_post', 'wpse313020_save_postdata' );
    }
}
add_action('save_post', 'wpse313020_save_postdata');

HINWEIS Denken Sie daran, ein Nonce-Feld hinzuzufügen und es beim Speichern nach dem Speichern zu überprüfen. Auch können Sie mit anderen Haken statt betrachten save_post, dh pre_post_updateoder wp_insert_post_dataspeichern, zu verarbeiten Daten über neue Post.

Ich hoffe, das hilft!

Levi Dulstein
quelle
1

Tücken:

Obwohl es möglich ist, einem Autor (oder Mitwirkenden) zu erlauben, einen anderen Autor mit user_has_capFilter Hook und einem verwandten CODE seinem eigenen Beitrag zuzuweisen , ist dieser Ansatz selbst grundlegend fehlerhaft . Selbst wenn Sie alle erforderlichen Sicherheitsmaßnahmen ergreifen, handelt es sich dennoch um eine Sicherheitsanfälligkeit, da dadurch die Funktionsarchitektur insgesamt zerstört wird.

Lassen Sie mich ein Beispielszenario geben: Angenommen, ein Benutzer mit Autorenrolle hat weniger als ehrenwerte Absichten und spammt einen anderen Autor mit vielen Posts (möglicherweise mithilfe eines Skripts). Wenn sich der Zielautor das nächste Mal anmeldet, sieht er alle diese Beiträge in seinem Namen! Dies wird fortgesetzt, da der andere Autor keine Möglichkeit hat, es zu stoppen! Wir müssen also einen alternativen Ansatz finden, der diesen Fehler nicht aufweist.

Ein besserer Ansatz:

Wenn die Autorenänderung eine notwendige Funktion ist, besteht ein besserer Ansatz darin, den anderen Autor (oder einen Benutzer mit höherer Leistung wie andere Editoren oder Administratoren) in den Prozess der Autorenänderung einzubeziehen, sodass der initiierende Autor möglicherweise nicht in der Lage ist, Spam zu versenden Zielautor.

Um dies zu erreichen, lassen wir den einleitenden Autor den Zielautor aus dem Editor auswählen, aber wir werden den Autor des Beitrags nicht direkt ändern. Stattdessen speichern wir zum Zeitpunkt des Autorenwechsels ein benutzerdefiniertes Post-Meta, in dem die Zielautoren-ID gespeichert wird. Im Admin-Bereich wird dann ein Beitrags-Untermenü angezeigt, in dem alle Beiträge mit der Anforderung zum Ändern des Autors angezeigt werden. Nur der Zielautor und Benutzer mit edit_others_postFunktionen (wie Editoren, Administratoren usw.) haben Zugriff auf diese Benutzeroberfläche für Autorenänderungsanforderungen. Über die Benutzeroberfläche genehmigt der Benutzer mit ordnungsgemäßem Zugriff die Änderung, und erst dann erfolgt die endgültige Änderung des Autors.

Was passiert mit Posts in der Genehmigungswarteschlange?

Die CODE-Implementierung kann je nach Anforderung variieren. Ohne eine andere CODE-Implementierung können die einleitenden Autoren den Beitrag jedoch ändern oder sogar die Autorenänderungsanforderung innerhalb des Fensters des Genehmigungsprozesses zurücksetzen. Sie werden von der Post ausgeschlossen, sobald die Änderungsanforderung des Autors genehmigt wurde.

Fayaz
quelle
0

Das Dropdown-Feld Autor wird nur angezeigt , wenn der Benutzer über die entsprechenden edit_others_postsFunktionen verfügt. Aus offensichtlichen Gründen möchten Sie Autoren diese Funktion jedoch nicht standardmäßig geben. Die Lösung besteht darin, diese Funktion nur unter bestimmten Umständen bereitzustellen, nämlich wenn er einen seiner eigenen Beiträge bearbeitet. Da die Funktion in die Datenbank geschrieben wird, müssen Sie auch sicherstellen, dass sie auf jeder anderen Seite entfernt wird.

Dies ist eine Frage des genauen Timings. Sie möchten die Funktion ändern, nachdem WP entschieden hat, dass der Mitwirkende das Recht hat, den Beitrag zu bearbeiten, aber bevor das Formular der Bearbeitungsseite ( post.php) generiert wird. Ein geeigneter Haken ist admin_init.

So was:

add_action ('admin_init', 'wpse313020_change_author');
function wpse313020_change_author () {
  global $pagenow;
  $current_user = wp_get_current_user();
  // only do this if current user is contributor
  if ('contributor' == $current_user->roles[0]) {
    // add capability when we're editing a post, remove it when we're not
    if ('post.php' == $pagenow)
       $current_user->add_cap('edit_others_posts')
    else
       $current_user->remove_cap('edit_others_posts');
    }
  }

Ich habe den Code nicht getestet, daher ist er möglicherweise fehlerhaft, aber Sie haben die Idee.

cjbj
quelle
-1

Ich habe versucht, das zu erreichen, was Sie brauchen, indem ich die Meta-Funktionen der Mitwirkenden gefiltert habe, und es scheint gut zu funktionieren. Alles, was ich hier mache, ist das Hinzufügen der edit_others_postsFunktion für Mitwirkende, wenn WordPress dies anfordert.

Ich würde jedoch sagen, dass es eine etwas hackige Lösung für mich ist und ich bin mir nicht sicher, ob es völlig sicher ist. Nach dem, was ich nach dem Einfügen meines Filters in functions.phpWordPress überprüft habe, können Mitwirkende keine Beiträge anderer Benutzer in anderen Kontexten als dem von Ihnen gewünschten bearbeiten. Es scheint in Ordnung zu sein, aber wir können nicht explizit prüfen, ob der aktuelle Benutzer der Autor des aktuell bearbeiteten Beitrags ist (Sie könnten den Beitrag nicht als anderen Benutzer speichern, wenn diese bedingte Prüfung der Funktion hinzugefügt würde) - das das besorgt mich.

/**
 * author_cap_filter()
 *
 * Filter on the current_user_can() function.
 * This function is used to explicitly allow contributors to change post authors
 *
 * @param array $allcaps All the capabilities of the user
 * @param array $cap     [0] Required capability
 * @param array $args    [0] Requested capability
 *                       [1] User ID
 */
function author_cap_filter( $allcaps, $cap, $args ) {

    // Bail out if we're not dealing with right capability:
    if ( ! in_array( $args[0], [ 'edit_others_posts' ] ) ) {
        return $allcaps;
    }

    // Bail out for users who are not contributors
    if ( ! user_can( $args[1], 'contributor' ) ) {
        return $allcaps;
    }

    // Bail out for users who can already edit others posts:
    if ( isset( $allcaps['edit_others_posts'] ) && $allcaps['edit_others_posts'] ) {
        return $allcaps;
    }

    // overwrite 'edit_others_posts' capability
    $allcaps[ $args[0] ] = true;

    return $allcaps;
}
add_filter( 'user_has_cap', 'author_cap_filter', 100, 3 );
Levi Dulstein
quelle
2
Bitte beachten Sie, dass Autoren durch die Gewährung von edit_others_postsFunktionen im Wesentlichen die Beiträge anderer bearbeiten können. Wir können den Autor genauso gut zu einem Redakteur machen, das ist wahrscheinlich besser, als ihm eine höhere Fähigkeit zu geben. Die zweite Lösung ist eine Möglichkeit, erfordert aber meiner Meinung nach etwas mehr Arbeit.
Scott
Ich bin der Meinung, dass die Ablehnung hier nicht fair ist. Ich weise in meiner Antwort auf beide Dinge hin, dass die erste Lösung nicht sicher ist und dass die zweite mehr Arbeit benötigt, aber ich glaube, dass sie hilfreich ist, da sie eine funktionierende Lösung zeigt dass sich das OP verbessern kann (ich denke nicht, dass die Beantwortung einer Frage zu WPSE die Bereitstellung eines produktionsfertigen Code-Snippets bedeuten sollte). Es wäre auch nützlich, wenn Sie genauer sein und darauf hinweisen könnten, was verbessert werden könnte, oder sogar meinen Beitrag bearbeiten könnten, wenn Sie einige kleine Änderungen meinen. Prost!
Levi Dulstein
Außerdem haben Sie nicht ganz Recht edit_others_postsdamit, die Bearbeitung der Beiträge anderer Benutzer immer zuzulassen. Bitte testen Sie den Code aus meiner Antwort - auch wenn der Filter vorhanden ist, gibt die Funktionsprüfung if ( ! current_user_can( 'edit_post', $post_id ) )in github.com/WordPress/WordPress/blob/… immer noch false zurück. Auch hier stimme ich zu, dass es nicht die sichere Lösung ist, wie in meiner Antwort erwähnt, aber ich dachte, es ist erwähnenswert, da es tatsächlich funktioniert. (Entschuldigung für zwei Kommentare hintereinander, ich habe das Charachter-Limit nicht erreicht)
Levi Dulstein
-2

Installieren Sie zunächst den Plugin User Role Editor ( https://wordpress.org/plugins/user-role-editor/ ).

Zweitens erstellen Sie mit dem Plugin eine neue Rolle namens Post Manager, zum Beispiel:

Geben Sie hier die Bildbeschreibung ein

Nach dem Erstellen der neuen Rolle können Sie deren Funktionen bearbeiten. Jetzt ist der Moment, in dem Sie Ihr Problem lösen, aber Sie müssen sich zwischen zwei Optionen entscheiden:

(Mach dir noch keine Sorgen um die Rolle des Mitwirkenden)

Zuerst:

  • Geben Sie Ihrer neuen Rolle zwei zusätzliche Funktionen edit_others_postsund publish_posts.
  • Auf diese Weise kann Ihr Mitwirkender nur Beiträge bearbeiten, die nicht veröffentlicht wurden (nur ausstehende und Entwurfsbeiträge). Wenn der Mitwirkende also nur den Autor des Beitrags ändert, kann er den Beitrag weiterhin bearbeiten. Sie können den Beitrag erst nach der Veröffentlichung bearbeiten. Dies bedeutet auch, dass der Autor, der den Beitrag veröffentlicht und vergisst, den Autor zu ändern, die Möglichkeit verliert, den Autor des Beitrags zu ändern.

Zweite:

  • Geben Sie Ihrer neuen Rolle nur eine zusätzliche Funktion edit_others_posts.
  • Diese Methode funktioniert wie die erste, ABER hier kann Ihr Mitwirkender nicht veröffentlichen, was bedeutet, dass er nicht veröffentlichen kann und vergisst, den Autor zu ändern. Hier müsste jemand den Beitrag veröffentlichen.

Nach der Entscheidung klicken Sie auf "Update". Ihre neue Rolle sollte nun die readFähigkeit plus die von Ihnen gewählte (n) haben.

Wechseln Sie jetzt zu Ihrer Benutzerprofilseite für Mitwirkende und geben Sie ihnen am Ende der Seite zusätzliche Rollen (Funktion "Benutzerrollen-Editor"):

Geben Sie hier die Bildbeschreibung ein

Jetzt kann jeder Benutzer, der Mitwirkender und Postmanager ist, den Postautor nicht veröffentlichter Posts ändern. Abhängig von Ihrer vorherigen Auswahl kann der Benutzer auch Beiträge veröffentlichen, und wenn dies der Fall ist, kann er den Beitrag nicht mehr bearbeiten.

WICHTIG!!!

Ich habe Ihnen eine Lösung gezeigt, mit der eine neue Rolle erstellt wird, um die Standardfunktionen des Mitwirkenden beizubehalten. Wenn Sie möchten (nicht weise), können Sie die Post-Manager-Erstellung überspringen und mit dem Benutzerrollen-Editor die Contributor-Funktionen direkt bearbeiten .

Und nur zur Veranschaulichung: WordPress erlaubt standardmäßig nur die edit_others_postsMöglichkeit, den Autor des Beitrags zu ändern. Siehe https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php Zeile 1483.

filipecsweb
quelle
1
Dies macht den Benutzer zu einem Editor, für den keine Plugins installiert werden müssen. Verwenden Sie einfach den Benutzer admin. Dies ist jedenfalls nicht das, was das OP verlangt.
Mark Kaplun
Diese Lösung ermöglicht es dem Mitwirkenden ausdrücklich, den Autor des Beitrags zu ändern. Also, ja, darum hat er gebeten. Zweitens sind dem Editor standardmäßig mehr als 20 Funktionen zugewiesen. Meine Lösung macht den Mitwirkenden nicht zum Editor. Lassen Sie denjenigen, der gefragt hat, entscheiden, ob meine Antwort ihr Problem löst. Bitte denken Sie zweimal über Ihre Ablehnung nach.
Filipecsweb
Das OP bittet einen Mitwirkenden , Dinge zu tun. Ihre Lösung besteht darin, ihn zum Redakteur zu machen , der die Autoren jederzeit ändern kann, wenn die Sicherheit
unterbrochen wird