Pilih pelanggan sebagai penulis posting di panel admin?

16

Saya ingin dapat memilih seorang pelanggan, seorang penulis posting di admin sehingga menampilkan nama mereka sebagai telah menulis posting, tetapi saya tidak ingin memberi mereka hak istimewa tambahan (jika mereka login satu-satunya hal yang dapat mereka akses adalah profil mereka).

Apakah ada cara sederhana untuk melakukan ini tanpa harus mengubah peran dan kemampuan?

Terima kasih

masa depan
sumber

Jawaban:

17

Ini adalah retasan sederhana yang saya tulis dalam situasi yang sama. Ini akan menampilkan semua Subscribersdi Authordropdown pada edit / tambahkan posting / halaman, dari mana Anda dapat memilih yang Anda inginkan. Saya pikir itu harus bekerja untuk Anda ...

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

Trik di balik ini adalah, setelah Anda mengirimkan halaman ini, WP hanya membaca $ user-> ID dari drop-down ini di $ _POST array, dan menugaskannya sebagai penulis posting. Dan itulah yang Anda inginkan!

Rutwick Gangurde
sumber
Terima kasih banyak Rutwick! Apa yang saya butuhkan! Saya hanya perlu mengubah $ users = get_users (); selain itu tidak menampilkan pengguna dengan peran lain di sana
fxfuture
Sama-sama, sobat! :) Sebenarnya saya menggunakannya untuk peran khusus, maka parameternya ... Senang saya bisa membantu!
Rutwick Gangurde
Saya baru saja menemukan masalah kecil dengan ini - ketika saya mengunjungi kembali halaman edit posting drop-down default ke admin, jadi jika saya membuat perubahan dan menyimpan tanpa memilih kembali penulis ini mengubah penulis untuk admin. Adakah cara untuk memperbaikinya?
fxfuture
Ya, Anda mendapatkan penulis untuk posting ini, dan memeriksa salah satu pengguna yang cocok dengan penulis, pilih opsi itu.
Rutwick Gangurde
2
Coba cetak global $postvariabelnya ...
Rutwick Gangurde
13

Pada WordPress 4.4.0 Anda sekarang dapat menggunakan wp_dropdown_users_argsfilter. Kode ini jauh lebih sederhana sekarang:

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
sumber
3
Ini harus menjadi jawaban yang benar / diterima. Langsung dari Codex: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren
2

Ini adalah pendekatan yang mirip dengan @brasofilo. Tetapi hanya bekerja di layar edit posting, daripada mengedit cepat, dan mencakup semua pengguna (bukan hanya penulis dan pelanggan).

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

Ini meniru metabox penulis default tetapi panggilan tersebut wp_dropdown_usersmenghilangkan who=>'editors'argumen. Ini default untuk satu-satunya nilai lain yang memanggil pengguna.

Stephen Harris
sumber
Stephen terima kasih. Saya akhirnya menggunakan solusi Rutwick karena sudah bekerja dengan CPT tetapi menghargai jawaban Anda :)
fxfuture
menambahkan $ pos global; ke fungsi sebenarnya karena tidak mengambil penulis yang ada ketika saya mengedit posting, tetapi selalu membawa saya sebagai penulis posting. Sangat Annyoing.
danieldekay
1

Cara yang lebih baik untuk melakukannya ...

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
sumber
tidak berfungsi untuk saya: selalu mengusulkan akun Admin untuk menjadi penulis posting baru, yang membuatnya sangat sulit bagi pengguna untuk benar-benar memperbarui posting (dan kemudian secara otomatis kehilangan hak mengedit).
danieldekay
1

Ini adalah kode yang ditautkan oleh @Innate dalam komentar (solusi) untuk pertanyaannya sendiri, saya baru saja beradaptasi sedikit dan diuji dalam WP 3.3.2 (fungsi wpse39084). Ini akan menampilkan pelanggan dalam posting Edit dan Edit Cepat.

Juga menambahkan beberapa tindakan (fungsi wpse50827) untuk memindahkan kotak meta Penulis di dalam kotak meta Tindakan Penerbitan, untuk pengelolaan yang lebih mudah.

Semuanya terkait pos, tidak ada halaman atau 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
sumber
1
Terima kasih brasofilo. Saya akhirnya menggunakan solusi Rutwick karena sudah bekerja dengan CPT tetapi menghargai jawaban Anda :)
fxfuture
0

Saya telah melakukan sesuatu yang mirip dengan jawaban yang diterima di sini tetapi hanya ingin menunjukkan admin dan dalam kasus saya, peran 'produsen' kebiasaan, bersama-sama.

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
sumber
0

Ini bisa menjadi solusi untuk menghindari kesalahan dalam penyuntingan cepat, di mana "cpt_slug" harus diganti dengan siput jenis pos kustom Anda

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
sumber