¿Permitir que el Colaborador cambie el autor de su propia publicación?


9

¿Es posible dejar que un colaborador cambie el autor de sus propias publicaciones? Me doy cuenta de que esto los bloqueará efectivamente de la publicación, eso es lo que quiero. Quiero que puedan cambiar el autor una vez que hayan terminado de editar.


Solo me pregunto si hay otra forma de lograr la necesidad comercial. Dar una capacidad de no editor / administrador para asignar a cualquier otro autor su publicación parece un poco amplio. ¿Existe una lista predefinida de autores que puedan asignar como 'autor'? ¿Existe alguna relación definida entre el contribuyente y los autores permitidos? ¿O pueden elegir cualquier autor que les guste?
anmari

También noto que esto no 'publicará' su publicación. Por lo tanto, parece que la intención es imitar algún tipo de flujo de trabajo en el que el contribuyente asigna la publicación a un autor en lugar de decir que un editor selecciona las publicaciones 'pendientes' para su revisión. Si sus autores podrían ser editores, entonces tal vez use wp tal cual y use etiquetas en lugar de comunicarse o resaltar qué editores deberían elegir qué publicaciones.
anmari

Ah, dices "bloquearlos de la publicación, eso es lo que quiero". ¿Eso es más importante? ¿Que una vez que se 'envían para revisión', ya no pueden editar? ¿Es necesario meterse con los 'autores'? ¿O funcionaría algún estado no público? Tal vez usando codex.wordpress.org/Post_Status#Custom_Status
anmari

Respuestas:


1

Estoy agregando una segunda respuesta porque mi primer enfoque fue rechazado y este no recibió la atención adecuada.

La idea es crear metacuadros personalizados que enumeren todos los usuarios y cambien el autor en save_postgancho. De esta manera, no te metas con las capacidades de los usuarios y el cambio de autor ocurre cuando las publicaciones ya están guardadas. Además, el beneficio adicional es que puede controlar la lista de usuarios que están disponibles en el menú desplegable de autor. Pasos a seguir:

Registrar meta box:

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

Crear marcado para su 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
 }

Conéctate save_postpara guardar datos y anular al autor:

/**
 * 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');

NOTA Recuerde agregar un campo nonce y verificarlo al guardar el mensaje. También puede considerar usar otros ganchos en lugar de save_post, es decir , pre_post_updateo wp_insert_post_data, para procesar datos en el guardado inicial de la publicación.

¡Espero que ayude!


1

Trampas:

Aunque es posible permitir que un autor (o colaborador) asigne a otro autor a su propia publicación usando el user_has_capenlace de filtro y algún CÓDIGO relacionado, este enfoque en sí mismo es fundamentalmente defectuoso . Entonces, incluso si toma todas las medidas de seguridad necesarias, sigue siendo una vulnerabilidad porque rompe la arquitectura de capacidad por completo.

Permíteme darte un escenario de ejemplo: digamos que un usuario con rol de autor tiene una intención menos que honorable y hace que otro autor tenga muchas publicaciones (tal vez usando un script). ¡La próxima vez que el autor de destino inicie sesión, verá todas esas publicaciones en su nombre! ¡Esto continuará ya que el otro autor no tiene forma de detenerlo! Por lo tanto, debemos encontrar un enfoque alternativo que no tenga este defecto.

Un mejor enfoque:

Si el cambio de autor es una característica necesaria, entonces un mejor enfoque es involucrar al otro autor (o un usuario con mayor poder como otros editores o administradores) en el proceso de cambio de autor, de modo que el autor iniciador no pueda enviar spam autor de destino.

Para lograr eso, dejaremos que el autor inicial elija el autor de destino del editor, pero no cambiaremos el autor de la publicación directamente. En cambio, en el momento del cambio de autor, guardaremos una meta de publicación personalizada que guardará la identificación del autor de destino. Luego, dentro del panel de administración, tendremos un submenú de publicaciones, donde aparecerán todas las publicaciones con la solicitud de cambio de autor. Solo el autor de destino y los usuarios con edit_others_postcapacidad (como editores, administradores, etc.) tendrán acceso a esta IU de solicitud de cambio de autor. Desde la interfaz de usuario, el usuario con acceso adecuado aprobará el cambio y solo entonces sucederá el cambio de autor final.

¿Qué les sucede a las publicaciones mientras están en la cola de aprobación?

La implementación del CÓDIGO puede variar según el requisito, sin embargo, sin ninguna otra implementación del CÓDIGO, los autores iniciadores podrán modificar la publicación o incluso revertir la solicitud de cambio de autor dentro de la ventana del proceso de aprobación. Se bloquearán la publicación tan pronto como se apruebe la solicitud de cambio de autor.


0

El cuadro desplegable del autor solo se mostrará cuando el usuario tenga la edit_others_postscapacidad. Sin embargo, no desea dar esta capacidad a los autores de forma predeterminada, por razones obvias. La solución es dar esta capacidad solo en circunstancias específicas, es decir, cuando está editando una de sus propias publicaciones. Debido a que la capacidad está escrita en la base de datos, también debe asegurarse de que se elimine en cualquier otra página.

Esta es una cuestión de tiempo preciso. Desea cambiar la capacidad después de que WP haya decidido que el contribuyente tiene derecho a editar la publicación, pero antes de que post.phpse genere el formulario de la página de edición ( ). Un gancho adecuado es admin_init.

Me gusta esto:

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

No he probado el código, por lo que puede tener errores, pero se entiende la idea.


-1

Traté de lograr lo que necesita filtrando las capacidades meta del contribuyente y parece funcionar bien. Todo lo que hago aquí es agregar la edit_others_postscapacidad para los contribuyentes cuando WordPress lo solicita.

Sin embargo, diría que es una solución un poco extraña para mí y no estoy seguro de si es completamente segura. Por lo que he comprobado después de poner mi filtro en functions.phpWordPress, no permite a los contribuyentes editar las publicaciones de otros usuarios en otros contextos que el que usted solicitó. Parece estar bien, pero no podemos verificar explícitamente si el usuario actual es el autor de la publicación editada actualmente (no podría guardar la publicación como un usuario diferente si esa verificación condicional se agregara a la función). me preocupa.

/**
 * 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 );

2
Tenga en cuenta que, otorgar a los autores la edit_others_postscapacidad esencialmente les permitirá editar las publicaciones de otros. También podemos hacer que el autor sea un editor, eso es probablemente mejor que darle una mayor capacidad. La segunda solución es una posibilidad, pero necesita más trabajo, en mi humilde opinión.
Scott

Siento que el voto negativo aquí no es justo, en realidad estoy señalando ambas cosas en mi respuesta indicando que la primera solución no es segura y señalando que la segunda necesita más trabajo, pero creo que es útil, ya que muestra una solución que funciona que el OP puede mejorar (no creo que responder una pregunta en WPSE deba significar proporcionar fragmentos de código listos para producción). Además, sería útil si pudieras ser más preciso y señalar lo que podría mejorarse o incluso editar mi publicación si te refieres a algunos pequeños ajustes. ¡Salud!
Levi Dulstein

Además, no tiene toda la razón al edit_others_postspermitir siempre editar las publicaciones de otros usuarios. Pruebe el código de mi respuesta, incluso con el filtro en su lugar, la verificación de capacidad if ( ! current_user_can( 'edit_post', $post_id ) )en github.com/WordPress/WordPress/blob/… todavía devuelve falso. Una vez más, estoy de acuerdo en que no es la solución segura como se menciona en mi respuesta, pero pensé que vale la pena mencionarlo ya que realmente funciona. (perdón por dos comentarios seguidos, no encajé en el límite de caracteres)
Levi Dulstein

-2

En primer lugar, instale el complemento Editor de roles de usuario ( https://wordpress.org/plugins/user-role-editor/ ).

En segundo lugar, con el complemento, cree una nueva función llamada Administrador de correos, por ejemplo:

ingrese la descripción de la imagen aquí

Después de crear el nuevo rol, podrá editar sus capacidades. Ahora, es el momento en que resuelve su problema, pero debe decidir entre dos opciones:

(no te preocupes por el rol de contribuidor, todavía)

Primero:

  • Dele a su nuevo rol dos capacidades adicionales, edit_others_postsy publish_posts.
  • De esta manera, su colaborador podrá editar solo las publicaciones que no están publicadas (solo publicaciones pendientes y borradores). Entonces, si el colaborador simplemente cambia el autor de la publicación, aún podrá editar la publicación. Solo se les bloqueará la edición de la publicación después de publicarla. También significa que si el colaborador publica la publicación y olvida cambiar el autor, perderá la oportunidad de cambiar el autor de la publicación.

Segundo:

  • Dar a su nuevo papel sólo una capacidad adicional, edit_others_posts.
  • De esta manera funciona como el primero, PERO aquí su colaborador no puede publicar, lo que significa que no puede publicar y se olvida de cambiar el autor. Aquí, alguien tendría que publicar la publicación.

Después de decidir, haga clic en "Actualizar". Su nueva función ahora debe tener la readcapacidad más la (s) que eligió.

Ahora, vaya a la página de perfil de usuario de su colaborador y, al final de la página, asigne roles adicionales (función Editor de roles de usuario):

ingrese la descripción de la imagen aquí

Ahora, cada usuario que sea Colaborador y Administrador de publicaciones podrá cambiar el autor de la publicación de publicaciones no publicadas. Y dependiendo de su elección anterior, el usuario también puede publicar publicaciones, y si lo hacen, ya no podrán editar la publicación.

¡¡¡IMPORTANTE!!!

Le mostré una solución que crea un nuevo rol para preservar las capacidades predeterminadas del Colaborador. Si lo desea (no es prudente), puede omitir la creación del Administrador de publicaciones y usar el Editor de roles de usuario simplemente editaría las capacidades de Colaborador directamente .

Y solo para el registro, por defecto WordPress solo permite la edit_others_postscapacidad de cambiar el autor de la publicación. Ver https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-posts-list-table.php línea 1483.


1
esto hace que el usuario sea un editor, no es necesario instalar complementos para eso, solo use el administrador de usuario. De todos modos, esto no es lo que pide el OP.
Mark Kaplun

Esta solución permite explícitamente que el Colaborador cambie el autor de la publicación. Entonces, sí, es lo que pidió. Segundo, por defecto, el Editor tiene más de 20 capacidades asignadas. Mi solución no convierte al Colaborador en un Editor. Deje que quien pregunta decida si mi respuesta resuelve su problema. Por favor, piense dos veces sobre su voto negativo.
filipecsweb

el OP pide un colaborador para hacer cosas. Su solución es convertirlo en editor que pueda cambiar a los autores cada vez que rompan la seguridad
Mark Kaplun
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.