Czy wybrać subskrybenta jako autora posta w panelu administracyjnym?

16

Chcę mieć możliwość wybrania subskrybenta, autora postu w adminie, aby wyświetlał on swoją nazwę jako napisaną przez posta, ale nie chcę im przyznawać żadnych dodatkowych uprawnień (jeśli zalogują się, jedyną rzeczą, do której mają dostęp, jest dostęp ich profil).

Czy istnieje prosty sposób na zrobienie tego bez konieczności zmiany ról i możliwości?

Dzięki

fxfuture
źródło

Odpowiedzi:

17

To prosty hack, który napisałem w podobnej sytuacji. Wyświetli się wszystko Subscribersw Authormenu rozwijanym / dodaj post / stronę, z którego możesz wybrać dowolną. Myślę, że to powinno dla ciebie zadziałać ...

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

Sztuczka tego polega na tym, że po przesłaniu tej strony WP odczytuje tylko $ user-> ID z tego menu rozwijanego w tablicy $ _POST i przypisuje go jako autora postów. I tego właśnie chcesz!

Rutwick Gangurde
źródło
Dzięki bardzo Rutwick! Dokładnie to, czego potrzebowałem! Po prostu musiałem zmienić $ users = get_users (); w przeciwnym razie nie wyświetlałby się użytkowników z innymi rolami
fxfuture
Nie ma za co, kolego! :) Właściwie użyłem go do roli niestandardowej, stąd parametry ... Cieszę się, że mogłem pomóc!
Rutwick Gangurde
Właśnie znalazłem z tym drobny problem - kiedy ponownie odwiedzam stronę edycji postów, domyślnie jest rozwijana lista administratora, więc jeśli dokonam zmian i zapiszę bez ponownego wyboru autora, zmieni to autora na administratora. Jakiś pomysł jak to naprawić?
fxfuture
Tak, dostajesz autora tego postu i sprawdzasz, który z użytkowników pasuje do autora, zaznacz tę opcję.
Rutwick Gangurde
2
Spróbuj wydrukować global $postzmienną ...
Rutwick Gangurde,
13

Począwszy od WordPress 4.4.0 możesz teraz używać wp_dropdown_users_argsfiltra. Kod jest teraz znacznie prostszy:

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;

}
jg314
źródło
3
To powinna być poprawna / zaakceptowana odpowiedź. Bezpośrednio z Codex: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren
2

Jest to podobne podejście do @brasofilo. Ale działa tylko na ekranie edycji postu, a nie szybkiej edycji i obejmuje wszystkich użytkowników (nie tylko autorów i subskrybentów).

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

To naśladuje domyślny metaboks autora, ale wywołanie wp_dropdown_userspomija who=>'editors'argument. Domyślnie jest to jedyna inna wartość, czyli użytkownicy połączeń.

Stephen Harris
źródło
Dzięki Stephen. Skończyło się na rozwiązaniu Rutwicka, ponieważ już działa z CPT, ale doceniam twoją odpowiedź :)
fxfuture
dodano globalny $ post; do faktycznej funkcji, ponieważ nie redagowałem istniejącego autora, kiedy edytowałem post, ale zawsze zajmowało mnie to jako autora postu. Very Annyoing.
danieldekay
1

Lepszy sposób na zrobienie tego ...

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

}
Andru-1983
źródło
nie działa dla mnie: zawsze proponuje, aby konto administratora zostało nowym autorem postu, co bardzo utrudnia użytkownikom aktualizację postów (a następnie automatyczne utratę uprawnień do edycji).
danieldekay
1

To jest kod połączony przez @Innate w komentarzu (rozwiązaniu) do jego własnego pytania, właśnie trochę dostosowałem i przetestowałem w WP 3.3.2 (funkcja wpse39084). Pokaże subskrybentów w postach Edytuj i Szybka edycja.

Dodano także kilka akcji (funkcje wpse50827), aby przenieść meta pole Autor w polu meta Publikuj akcje, aby ułatwić zarządzanie.

Wszystko jest związane z postami, nie ma stron ani 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>';
}
brasofilo
źródło
1
Dzięki brasofilo. Skończyło się na rozwiązaniu Rutwicka, ponieważ już działa z CPT, ale doceniam twoją odpowiedź :)
fxfuture
0

Zrobiłem tutaj coś podobnego do przyjętej odpowiedzi, ale chciałem tylko pokazać administratorom, aw moim przypadku niestandardową rolę „producentów” razem.

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;
}
D3XT3R
źródło
0

Może to być rozwiązanie pozwalające uniknąć błędu podczas szybkiej edycji, w którym „cpt_slug” należy zastąpić niestandardowym typem postu

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' ) );
}
Marcello Magi Spinetti
źródło