¿Seleccionar suscriptor como autor de la publicación en el panel de administración?


16

Quiero poder seleccionar un suscriptor, un autor de una publicación en el administrador para que muestre su nombre como si hubiera escrito la publicación, pero no quiero darles ningún privilegio adicional (si inician sesión, lo único a lo que pueden acceder es su perfil)

¿Hay una manera simple de hacer esto sin tener que cambiar roles y capacidades?

Gracias

Respuestas:


17

Este es un truco simple que escribí en una situación similar. Mostrará todo Subscribersen el Authormenú desplegable en editar / agregar publicación / página, desde donde puede seleccionar el que desee. Creo que debería funcionar para ti ...

add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser($output)
{

    //global $post is available here, hence you can check for the post type here
    $users = get_users('role=subscriber');

    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";

    //Leave the admin in the list
    $output .= "<option value=\"1\">Admin</option>";
    foreach($users as $user)
    {
        $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
        $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
    }
    $output .= "</select>";

    return $output;
}

El truco detrás de esto es que, después de enviar enviar esta página, WP solo lee el $ user-> ID de este menú desplegable en la matriz $ _POST, y lo asigna como el autor de las publicaciones. ¡Y eso es lo que quieres!


Muchas gracias Rutwick! ¡Exactamente lo que necesitaba! Solo tuve que cambiar $ users = get_users (); de lo contrario, no exhibió los usuarios con otros papeles en no
fxfuture

De nada amigo! :) En realidad lo estaba usando para un rol personalizado, de ahí los parámetros ... ¡Me alegro de poder ayudar!
Rutwick Gangurde

Acabo de encontrar un problema menor con esto: cuando vuelvo a visitar la página de edición de publicaciones, el menú desplegable predeterminado es admin, por lo que si hago cambios y guardo sin volver a seleccionar al autor, esto cambiará el autor a admin. ¿Algúna idea de cómo arreglar esto?
fxfuture

Sí, obtienes el autor para esta publicación, y compruebas cuál de los usuarios coincide con el autor, mantén esa opción seleccionada.
Rutwick Gangurde

2
Intente imprimir la global $postvariable ...
Rutwick Gangurde

13

A partir de WordPress 4.4.0 ahora puede usar el wp_dropdown_users_argsfiltro. El código es mucho más simple ahora:

add_filter( 'wp_dropdown_users_args', 'add_subscribers_to_dropdown', 10, 2 );
function add_subscribers_to_dropdown( $query_args, $r ) {

    $query_args['who'] = '';
    return $query_args;

}

3
Esta debería ser la respuesta correcta / aceptada. Directamente desde el Codex: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren

2

Este es un enfoque similar a @brasofilo. Pero solo funciona en la pantalla de edición de publicaciones, en lugar de la edición rápida, e incluye a todos los usuarios (no solo autores y suscriptores).

/* Remove Author meta box from post editing */
function wpse50827_author_metabox_remove() {
    remove_meta_box('authordiv', 'post', 'normal');
}
add_action('admin_menu', 'wpse50827_author_metabox_remove');


/* Replace with custom Author meta box */
function wpse39084_custom_author_metabox() {  
    add_meta_box( 'authordiv', __('Author'), 'wpse39084_custom_author_metabox_insdes','post');  
 } 
add_action( 'add_meta_boxes', 'wpse39084_custom_author_metabox');  


/* Include all users in post author dropdown*/
/* Mimics the default metabox http://core.trac.wordpress.org/browser/trunk/wp-admin/includes/meta-boxes.php#L514 */
function wpse39084_custom_author_metabox_insdes() {
      global $user_ID;
      global $post;
      ?>
      <label class="screen-reader-text" for="post_author_override"><?php _e('Author'); ?></label>

      <?php
        wp_dropdown_users( array(
             'name' => 'post_author_override',
             'selected' => empty($post->ID) ? $user_ID : $post->post_author,
             'include_selected' => true
        ) );
}

Esto imita el metabox de autor predeterminado pero la llamada wp_dropdown_usersomite el who=>'editors'argumento. El valor predeterminado es el único otro valor que es llamar a los usuarios.


Gracias Stephen Terminé usando la solución de Rutwick porque ya funciona con CPT pero agradezco su respuesta :)
fxfuture

agregado global $ post; a la función real ya que no estaba recogiendo al autor existente cuando edité una publicación, pero siempre me tomó como autor de la publicación. Muy annyoing.
danieldekay

1

Una mejor manera de hacerlo ...

add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser()
{
    global $post; // remove if not needed
    //global $post is available here, hence you can check for the post type here
    $users = get_users('role=subscriber');

    echo'<select id="post_author_override" name="post_author_override" class="">';

    echo'<option value="1">Admin</option>';

    foreach($users as $user)
    {
        echo '<option value="'.$user->ID.'"';

        if ($post->post_author == $user->ID){ echo 'selected="selected"'; }

        echo'>';
        echo $user->user_login.'</option>';     
    }
    echo'</select>';

}

no funciona para mí: siempre propone que la cuenta de administrador se convierta en el nuevo autor de la publicación, lo que hace que sea muy difícil para los usuarios actualizar las publicaciones (y luego perder automáticamente los derechos de edición).
danieldekay

1

Este es un código vinculado por @Innate en un comentario (solución) a su propia pregunta, que acabo de adaptar un poco y probé en WP 3.3.2 (función wpse39084). Mostrará a los suscriptores en las publicaciones Editar y Edición rápida.

También se agregaron un par de acciones (funciones wpse50827) para mover el cuadro meta Autor dentro del cuadro meta Publicar acciones, para una administración más fácil.

Todo está relacionado con publicaciones, no hay páginas ni CPT ...

foreach( array( 'edit.php', 'post.php' ) as $hook )
    add_action( "load-$hook", 'wpse39084_replace_post_meta_author' );       

/* Show Subscribers in post author dropdowns - edit and quickEdit */
function wpse39084_replace_post_meta_author()
{
    global $typenow;
    if( 'post' != $typenow )
        return;

    add_action( 'admin_menu', 'wpse50827_author_metabox_remove' );
    add_action( 'post_submitbox_misc_actions', 'wpse50827_author_metabox_move' );
    add_filter( 'wp_dropdown_users', 'wpse39084_showme_dropdown_users' );
}

/* Modify authors dropdown */
function wpse39084_showme_dropdown_users( $args = '' )
{
    $post = get_post();
    $selected = $post->post_author;
    $siteusers = get_users( 'orderby=nicename&order=ASC' ); // you can pass filters and option
    $re = '';
    if( count( $siteusers ) > 0 )
    {
        $re = '<select name="post_author_override" id="post_author_override">';
        foreach( $siteusers as $user )
        {
            $re .= '<option value="' . $user->ID . '">' . $user->user_nicename . '</option>';
        }
        $re .= '</select>';
        $re = str_replace( 'value="' . $selected . '"', 'value="' . $selected . '" selected="selected"', $re );
    }
    echo $re;
}

/* Remove Author meta box from post editing */
function wpse50827_author_metabox_remove()
{
    remove_meta_box( 'authordiv', 'post', 'normal' );
}


/* Move Author meta box inside Publish Actions meta box */
function wpse50827_author_metabox_move()
{
    global $post;

    echo '<div id="author" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:0px;">Author: ';
    post_author_meta_box( $post );
    echo '</div>';
}

1
Gracias brasofilo. Terminé usando la solución de Rutwick porque ya funciona con CPT pero agradezco su respuesta :)
fxfuture

0

He hecho algo similar a la respuesta aceptada aquí, pero solo quería mostrar a los administradores y, en mi caso, un rol personalizado de 'productores', juntos.

add_filter('wp_dropdown_users', 'custom_author_select');
function custom_author_select($output){

    //global $post is available here, hence you can check for the post type here
    $admins = get_users('role=administrator');
    $producers = get_users('role=producer');
    $users = array_merge($admins, $producers);

    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";

    //Leave the admin in the list
    $output .= "<option value=\"1\">Admin</option>";

    foreach($users as $user){
        $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
        $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
    }

    $output .= "</select>";

    return $output;
}

0

Esta podría ser una solución para evitar el error en la edición rápida, donde "cpt_slug" debería reemplazarse con su mensaje personalizado tipo slug

add_filter('wp_dropdown_users', 'MySwitchUser');

function MySwitchUser($output)
{
    global $typenow;
if ((is_edit_page('edit') && "cpt_slug" == $typenow)||(is_edit_page('new') && "cpt_slug" == $typenow)){
    global $post;
    $users = get_users();
    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";   
    foreach($users as $user)
    {
        $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
        $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
    }
    $output .= "</select>";   
} 
return $output;
}



function is_edit_page($new_edit = null){
    global $pagenow;
    if (!is_admin()) return false;
    if($new_edit == "edit")
        return in_array( $pagenow, array( 'post.php',  ) );
    elseif($new_edit == "new") 
        return in_array( $pagenow, array( 'post-new.php' ) );
    else 
        return in_array( $pagenow, array( 'post.php', 'post-new.php' ) );
}
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.