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

12

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

¿Hay una forma sencilla de hacerlo sin tener que cambiar los roles y las capacidades?

Gracias

    
pregunta fxfuture 02.05.2012 - 02:33

7 respuestas

15

Este es un simple truco que escribí en una situación similar. Mostrará todo el Subscribers en el menú desplegable Author en editar / agregar publicación / página, desde donde puede seleccionar la 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 la página, WP solo lee la ID de $ usuario- > de este menú desplegable en la matriz $ _POST, y la asigna como el autor de las publicaciones. ¡Y eso es lo que quieres!

    
respondido por el Rutwick Gangurde 02.05.2012 - 14:27
8

A partir de WordPress 4.4.0 ahora puede usar el filtro wp_dropdown_users_args . 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;

}
    
respondido por el jg314 29.01.2016 - 23:27
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 a los 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_users omite el argumento who=>'editors' . El valor predeterminado es el único otro valor que es llamar a los usuarios.

    
respondido por el Stephen Harris 02.05.2012 - 14:12
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>';

}
    
respondido por el Andru-1983 01.03.2013 - 01:37
1

Este es un código vinculado por @Innate en un comentario (solución) a su propia pregunta, yo Acabo de adaptarlo un poco y lo probé en WP 3.3.2 (función wpse39084). Mostrará 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 de autor en el cuadro de acciones de publicación, para una administración más sencilla.

Todo está relacionado con la publicación, sin 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>';
}
    
respondido por el brasofilo 02.05.2012 - 13:38
0

He hecho algo parecido a la respuesta aceptada aquí, pero solo quería mostrar a los administradores y, en mi caso, un rol de 'productores' personalizado, 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;
}
    
respondido por el D3XT3R 01.03.2015 - 00:10
0

Esta podría ser una solución para evitar el error en la edición rápida, donde "cpt_slug" debe reemplazarse con su barra personalizada de tipo de publicación

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' ) );
}
    
respondido por el Marcello Magi Spinetti 04.05.2017 - 16:17

Lea otras preguntas en las etiquetas