Yönetici panelinde yazarın yazarı olarak abone seçilsin mi?


16

Bir aboneyi yönetici içinde bir gönderinin yazarını seçebilmek istiyorum, böylece adını yazıyı yazmış olarak görüntülüyorlar, ancak onlara ek ayrıcalıklar vermek istemiyorum (erişebildikleri tek şey varsa, profilleri).

Rolleri ve yetenekleri değiştirmek zorunda kalmadan bunu yapmanın basit bir yolu var mı?

Teşekkürler

Yanıtlar:


17

Bu, benzer bir durumda yazdığım basit bir kesmek. Her şey gösterecektir Subscribersiçinde Authoristediğiniz herhangi birini seçebilirsiniz yerden post / sayfa eklemek / düzenlemek açılır listede. Bence senin için işe yaramalı ...

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

Bunun arkasında yatan püf noktası, bu sayfayı gönderdikten sonra WP, $ _POST dizisindeki bu açılır menüden yalnızca $ user-> ID değerini okur ve yayın yazarı olarak atar. Ve istediğin bu!


Çok teşekkürler Rutwick! Tam olarak ihtiyacım olan şey! Sadece $ users = get_users () değiştirmek zorunda kaldı; Aksi takdirde orada başka rolleri olan kullanıcıları göstermedi
fxfuture

Rica ederim dostum! :) Aslında özel bir rol için kullanıyordum, dolayısıyla parametreler ... Yardımcı olabilirim sevindim!
Rutwick Gangurde

Ben sadece bu konuda küçük bir sorun buldum - Ben yazı düzenleme sayfasını tekrar açtığımda aşağı açılan yönetici için varsayılan, bu yüzden değişiklikler yapmak ve yazar yeniden seçmeden kaydetmek, bu yönetici için yazar değiştirir. Bunu nasıl düzeltebileceğine dair bir fikrin var mı?
fxfuture

Evet, bu gönderinin yazarını alıyorsunuz ve hangi kullanıcılardan yazarla eşleştiğini kontrol edip bu seçeneği işaretli tutuyorsunuz.
Rutwick Gangurde

2
global $postDeğişkeni yazdırmayı deneyin ...
Rutwick Gangurde

13

WordPress 4.4.0'dan itibaren wp_dropdown_users_argsfiltreyi kullanabilirsiniz . Kod şimdi çok daha basit:

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
Bu doğru / kabul edilen cevap olmalıdır. Doğrudan
Codex'tan

2

Bu, brasofilo'ya benzer bir yaklaşımdır. Ancak hızlı düzenleme yerine yalnızca yazı düzenleme ekranında çalışır ve tüm kullanıcıları içerir (yalnızca yazarları ve aboneleri değil).

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

Bu, varsayılan yazar meta kutusunu taklit eder, ancak çağrı bağımsız değişkeni wp_dropdown_usersatlar who=>'editors'. Varsayılan olarak çağrı kullanıcıları olan diğer tek değerdir.


Teşekkürler Stephen. Rutwick'in çözümünü kullandım çünkü zaten CPT'lerle çalışıyor ama cevabınızı takdir ediyorum :)
fxfuture

global $ post eklendi; bir gönderiyi düzenlediğimde mevcut yazarı almamaya başladığımdan beri gerçek işlevine, ama beni her zaman yazar olarak aldı. Çok Annyoing.
danieldekay

1

Bunu yapmanın daha iyi bir yolu ...

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

}

benim için çalışmıyor: Yönetici hesabının her zaman yayının yeni yazarı olmasını önerir, bu da kullanıcıların yayınları gerçekten güncellemelerini (ve ardından düzenleme haklarını otomatik olarak kaybetmelerini) zorlaştırır.
danieldekay

1

Bu, kendi sorusuna bir yorumda (çözüm) @Innate tarafından bağlanan bir kod , sadece biraz adapte oldum ve WP 3.3.2'de test ettim (işlev wpse39084). Aboneleri, Düzenle ve Hızlı Düzenleme yayınlarında gösterecektir.

Ayrıca, daha kolay yönetim için Yazar meta kutusunu İşlemleri Yayınla meta kutusunun içine taşımak için birkaç eylem (işlevler wpse50827) eklendi.

Her şey yazı ile ilgilidir, sayfa veya CPT yoktur ...

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
Teşekkürler brasofilo. Rutwick'in çözümünü kullandım çünkü zaten CPT'lerle çalışıyor, ancak cevabınızı takdir ediyorum :)
fxfuture

0

Burada kabul edilen cevaba benzer bir şey yaptım ama sadece yöneticileri ve benim durumumda özel bir 'yapımcılar' rolünü birlikte göstermek istedim.

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

Bu, "cpt_slug" un özel yazı tipi slug ile değiştirilmesi gereken hızlı düzenlemedeki hatayı önlemek için bir çözüm olabilir.

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' ) );
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.