Abonnent als Autor des Beitrags im Admin-Bereich auswählen?


16

Ich möchte in der Lage sein, einen Abonnenten als Autor eines Beitrags im Administrator auszuwählen, sodass sein Name so angezeigt wird, als hätte er den Beitrag geschrieben. Ich möchte ihm jedoch keine zusätzlichen Berechtigungen erteilen (wenn er sich anmeldet, kann er nur darauf zugreifen) ihr Profil).

Gibt es eine einfache Möglichkeit, dies zu tun, ohne die Rollen und Funktionen ändern zu müssen?

Vielen Dank

Antworten:


17

Dies ist ein einfacher Hack, den ich in einer ähnlichen Situation geschrieben habe. Es werden alle Einträge Subscribersin der AuthorDropdown-Liste zum Bearbeiten / Hinzufügen von Beiträgen / Seiten angezeigt, von denen Sie die gewünschten auswählen können. Ich denke, es sollte für Sie arbeiten ...

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

Der Trick dahinter ist, dass WP nach dem Senden dieser Seite nur die $ user-> ID aus dieser Dropdown-Liste im $ _POST-Array liest und sie als Autor des Posts zuweist. Und genau das wollen Sie!


Vielen Dank Rutwick! Genau das was ich brauchte! Ich musste nur $ users = get_users () ändern. sonst hat es da nicht mit anderen Rollen Benutzer anzeigen
fxfuture

Gern geschehen, Kumpel! :) Eigentlich habe ich es für eine benutzerdefinierte Rolle verwendet, daher die Parameter ... Ich bin froh, dass ich helfen konnte!
Rutwick Gangurde

Ich habe gerade ein kleines Problem gefunden: Wenn ich die Post-Edit-Seite erneut besuche, ist die Dropdown-Liste standardmäßig auf admin eingestellt. Wenn ich also Änderungen vornehme und speichere, ohne den Autor erneut auszuwählen, ändert sich der Autor in admin. Irgendeine Idee, wie man das behebt?
fxfuture

Ja, Sie erhalten den Autor für diesen Beitrag und überprüfen, welcher der Benutzer mit dem Autor übereinstimmt. Lassen Sie diese Option ausgewählt.
Rutwick Gangurde

2
Versuchen Sie, die global $postVariable zu drucken ...
Rutwick Gangurde

13

Ab WordPress 4.4.0 können Sie den wp_dropdown_users_argsFilter jetzt verwenden . Der Code ist jetzt viel einfacher:

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
Dies sollte die richtige / akzeptierte Antwort sein. Direkt aus dem Codex: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren

2

Dies ist ein ähnlicher Ansatz wie bei @brasofilo. Funktioniert jedoch nur im Bearbeitungsbildschirm und nicht in der Schnellbearbeitung und umfasst alle Benutzer (nicht nur Autoren und Abonnenten).

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

Dies ahmt die Metabox des Standardautors nach, aber der Aufruf wp_dropdown_userslässt das who=>'editors'Argument aus. Der Standardwert ist der einzige andere Wert, der Anrufbenutzer ist.


Danke Stephen. Am Ende habe ich Rutwicks Lösung verwendet, weil sie bereits mit CPTs funktioniert, aber ich schätze Ihre Antwort :)
fxfuture

globales $ post hinzugefügt; zur eigentlichen Funktion, da der vorhandene Autor beim Bearbeiten eines Beitrags nicht übernommen wurde, ich aber immer als Autor des Beitrags fungierte. Sehr nervig.
Danieldekay

1

Ein besserer Weg, es zu tun ...

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

}

Funktioniert bei mir nicht: Es wird immer vorgeschlagen, dass das Administratorkonto neuer Autor des Posts wird, was es für Benutzer sehr schwierig macht, Posts tatsächlich zu aktualisieren (und dann automatisch die Bearbeitungsrechte zu verlieren).
Danieldekay

1

Dies ist ein Code, der von @Innate in einem Kommentar (Lösung) zu seiner eigenen Frage verlinkt wurde. Ich habe ihn gerade ein wenig angepasst und in WP 3.3.2 (Funktion wpse39084) getestet. Die Abonnenten werden in den Beiträgen Bearbeiten und Schnellbearbeitung angezeigt.

Außerdem wurden einige Aktionen hinzugefügt (Funktionen wpse50827), um das Meta-Feld "Autor" in das Meta-Feld "Aktionen veröffentlichen" zu verschieben und die Verwaltung zu vereinfachen.

Alles ist postbezogen, keine Seiten oder CPTs ...

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
Vielen Dank, Brasofilo. Am Ende habe ich Rutwicks Lösung verwendet, weil sie bereits mit CPTs funktioniert, aber ich schätze Ihre Antwort :)
fxfuture

0

Ich habe hier etwas Ähnliches wie die akzeptierte Antwort gemacht, wollte aber nur Administratoren und in meinem Fall eine benutzerdefinierte "Produzenten" -Rolle zeigen.

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

Dies könnte eine Lösung sein, um den Fehler bei der Schnellbearbeitung zu vermeiden, bei der "cpt_slug" durch Ihren benutzerdefinierten Beitragstyp "slug" ersetzt werden sollte

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' ) );
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.