Selectare abonat ca autor al postării în panoul de administrare?

2 mai 2012, 03:33:09
Vizualizări: 16.9K
Voturi: 16

Doresc să pot selecta un abonat ca autor al unei postări în panoul de administrare, astfel încât numele său să apară ca autor, dar nu vreau să-i acord permisiuni suplimentare (dacă se autentifică, singurul lucru la care poate accesa este profilul său).

Există o metodă simplă de a face acest lucru fără a fi nevoie să modific rolurile și capabilitățile?

Mulțumesc

0
Toate răspunsurile la întrebare 9
10
19

Acesta este un hack simplu pe care l-am scris într-o situație similară. Va afișa toți Abonații în meniul derulant Autor din pagina de editare/adaugare articol/pagină, de unde poți selecta pe cine dorești. Cred că ar trebui să funcționeze și pentru tine...

add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser($output)
{

    //global $post este disponibil aici, deci poți verifica tipul postului
    $users = get_users('role=subscriber');

    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";

    //Păstrează administratorul în 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;
}

Smecheria din spatele acestui hack este că după ce trimiți pagina, WordPress citește doar $user->ID din acest meniu derulant în array-ul $_POST și îl atribuie ca autor al postului. Și exact asta dorești!

2 mai 2012 15:27:59
Comentarii

Mulțumesc mult Rutwick! Exact ce aveam nevoie! A trebuit doar să schimb $users = get_users(); altfel nu afișa utilizatorii cu alte roluri acolo

fxfuture fxfuture
2 mai 2012 23:42:47

Cu plăcere prietene! :) De fapt, eu îl foloseam pentru un rol personalizat, de aceea parametrii... Mă bucur că am putut ajuta!

Rutwick Gangurde Rutwick Gangurde
3 mai 2012 08:22:22

Tocmai am descoperit o mică problemă cu asta - când revin pe pagina de editare a postului, meniul drop down revine implicit la admin, așa că dacă fac modificări și salvez fără să selectez din nou autorul, acesta se schimbă în admin. Ai idee cum să rezolv asta?

fxfuture fxfuture
5 mai 2012 04:59:12

Da, obții autorul pentru acest articol și verifici care dintre utilizatori se potrivește cu autorul, păstrând acea opțiune selectată.

Rutwick Gangurde Rutwick Gangurde
5 mai 2012 08:08:32

Din anumite motive, $post->post_author nu returnează nimic în ecranul meu de editare a articolului și nu înțeleg de ce!

fxfuture fxfuture
7 mai 2012 01:06:50

Încearcă să afișezi variabila global $post...

Rutwick Gangurde Rutwick Gangurde
7 mai 2012 07:20:05

Bun venit din nou :D

Rutwick Gangurde Rutwick Gangurde
8 mai 2012 09:09:04

Rețineți că ID-ul utilizatorului 1 poate fi sau nu un administrator. Obținerea unui administrator real din WordPress ar funcționa.

fuxia fuxia
1 mar. 2013 02:41:42

Am făcut câteva ajustări minore la această soluție, în cazul în care cineva are nevoie.Așadar, dacă doriți să afișați "numele de afișare" în meniul derulant, schimbați doar a doua linie din foreach în acest fel: $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->display_name.'</option>'; Și dacă doriți să adăugați un utilizator specific (cu un rol diferit), adăugați această linie înainte de foreach: $output .= "<option value=\"[ID]\">Nume</option>"; (înlocuiți [ID] cu ID-ul real)

Marius Stuparu Marius Stuparu
5 mar. 2013 17:41:36

Face exact ceea ce trebuie să facă!!!

Rodrigo Zuluaga Rodrigo Zuluaga
3 apr. 2020 09:06:55
Arată celelalte 5 comentarii
1
16

Începând cu WordPress 4.4.0, acum poți utiliza filtrul wp_dropdown_users_args. Codul este mult mai simplu acum:

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;

}
30 ian. 2016 00:27:07
Comentarii

Acesta ar trebui să fie răspunsul corect/acceptat. Direct din Codex: https://developer.wordpress.org/reference/hooks/wp_dropdown_users_args/#user-contributed-notes

AndyWarren AndyWarren
13 nov. 2016 17:35:00
2

Aceasta este o abordare similară cu cea a lui @brasofilo. Dar funcționează doar în ecranul de editare a articolului, nu în editarea rapidă, și include toți utilizatorii (nu doar autorii și abonații).

/* Elimină caseta meta Autor din editarea articolului */
function wpse50827_author_metabox_remove() {
    remove_meta_box('authordiv', 'post', 'normal');
}
add_action('admin_menu', 'wpse50827_author_metabox_remove');


/* Înlocuiește cu caseta meta Autor personalizată */
function wpse39084_custom_author_metabox() {  
    add_meta_box( 'authordiv', __('Autor'), 'wpse39084_custom_author_metabox_insdes','post');  
 } 
add_action( 'add_meta_boxes', 'wpse39084_custom_author_metabox');  


/* Include toți utilizatorii în meniul derulant al autorului articolului */
/* Imită caseta meta implicită 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('Autor'); ?></label>

      <?php
        wp_dropdown_users( array(
             'name' => 'post_author_override',
             'selected' => empty($post->ID) ? $user_ID : $post->post_author,
             'include_selected' => true
        ) );
}

Aceasta imită caseta meta Autor implicită, dar apelul wp_dropdown_users omite argumentul who=>'editori'. În mod implicit, utilizează singura altă valoare disponibilă, care este apelarea tuturor utilizatorilor.

2 mai 2012 15:12:33
Comentarii

Mulțumesc Stephen. Am ales în final soluția lui Rutwick pentru că funcționează deja cu CPT-uri, dar apreciez răspunsul tău :)

fxfuture fxfuture
2 mai 2012 23:46:28

am adăugat global $post; în funcția efectivă deoarece nu prelua autorul existent când editați un articol, dar întotdeauna mă lua pe mine ca autor al postării. Foarte enervant.

danieldekay danieldekay
26 dec. 2013 13:20:48
1

Acesta este un cod legat de @Innate într-un comentariu (soluție) la propria întrebare, l-am adaptat puțin și testat în WP 3.3.2 (funcția wpse39084). Va afișa abonații în editarea și editarea rapidă a articolelor.

De asemenea, am adăugat câteva acțiuni (funcții wpse50827) pentru a muta caseta meta Autor în interiorul casetei meta Acțiuni de Publicare, pentru o gestionare mai ușoară.

Totul este legat de articole, nu de pagini sau tipuri personalizate de postări...

foreach( array( 'edit.php', 'post.php' ) as $hook )
    add_action( "load-$hook", 'wpse39084_replace_post_meta_author' );       

/* Afișează Abonați în meniurile derulante ale autorului - editare și editare rapidă */
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' );
}

/* Modifică meniul derulant al autorilor */
function wpse39084_showme_dropdown_users( $args = '' )
{
    $post = get_post();
    $selected = $post->post_author;
    $siteusers = get_users( 'orderby=nicename&order=ASC' ); // poți transmite filtre și opțiuni
    $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;
}

/* Elimină caseta meta Autor din editarea articolelor */
function wpse50827_author_metabox_remove()
{
    remove_meta_box( 'authordiv', 'post', 'normal' );
}


/* Mută caseta meta Autor în interiorul casetei meta Acțiuni de Publicare */
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;">Autor: ';
    post_author_meta_box( $post );
    echo '</div>';
}
2 mai 2012 14:38:08
Comentarii

Mulțumesc brasofilo. Am ajuns să folosesc soluția lui Rutwick pentru că deja funcționează cu CPT-uri, dar apreciez răspunsul tău :)

fxfuture fxfuture
2 mai 2012 23:46:50
1

O metodă mai bună de a face asta...

add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser()
{
    global $post; // elimină dacă nu este necesar
    // global $post este disponibil aici, deci poți verifica tipul postării aici
    $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>';

}
1 mar. 2013 02:37:41
Comentarii

nu funcționează pentru mine: întotdeauna propune contul de Admin să devină noul autor al postării, ceea ce face foarte dificil pentru utilizatori să actualizeze efectiv postările (și apoi să piardă automat drepturile de editare).

danieldekay danieldekay
26 dec. 2013 13:22:38
0

Am făcut ceva similar cu răspunsul acceptat aici, dar am vrut să afișez doar administratorii și, în cazul meu, un rol personalizat de 'producători', împreună.

add_filter('wp_dropdown_users', 'custom_author_select');
function custom_author_select($output){

    // variabila globală $post este disponibilă aici, deci poți verifica tipul postului
    $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=\"\">";

    // Păstrează administratorul în 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;
}
1 mar. 2015 01:10:20
0

Aceasta ar putea fi o soluție pentru a evita eroarea la editarea rapidă, unde "cpt_slug" trebuie înlocuit cu slug-ul tipului tău de postare personalizat

// Adăugăm filtrul pentru dropdown-ul de utilizatori
add_filter('wp_dropdown_users', 'MySwitchUser');

function MySwitchUser($output)
{
    global $typenow;
    // Verificăm dacă suntem pe pagina de editare sau creare și dacă tipul postării este cel dorit
    if ((is_edit_page('edit') && "cpt_slug" == $typenow)||(is_edit_page('new') && "cpt_slug" == $typenow)){
        global $post;
        // Obținem toți utilizatorii
        $users = get_users();
        $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";   
        foreach($users as $user)
        {
            // Selectăm utilizatorul curent al postării
            $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
            $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
        }
        $output .= "</select>";   
    } 
    return $output;
}

// Funcție pentru a verifica tipul paginii de editare
function is_edit_page($new_edit = null){
    global $pagenow;
    // Verificăm dacă suntem în admin
    if (!is_admin()) return false;
    // Verificăm dacă suntem pe pagina de editare
    if($new_edit == "edit")
        return in_array( $pagenow, array( 'post.php',  ) );
    // Verificăm dacă suntem pe pagina de creare
    elseif($new_edit == "new") 
        return in_array( $pagenow, array( 'post-new.php' ) );
    // Verificăm ambele cazuri
    else 
        return in_array( $pagenow, array( 'post.php', 'post-new.php' ) );
}
4 mai 2017 17:17:58
0

Este un pic haotic. Se pare că există 3 abordări posibile, în funcție de faptul că folosiți Editorul Clasic sau Gutenberg.

Dacă folosiți Editorul Clasic:

  • Puteți suprascrie HTML-ul folosind filtrul wp_dropdown_users cum au sugerat și alte răspunsuri
  • Sau puteți suprascrie parametrii interogării folosind wp_dropdown_users_args

Dacă folosiți Gutenberg, meniul derulant cu Autori este implementat diferit.

După cum a menționat Thomas Levy în această problemă pe GitHub:

Pentru ca rolul personalizat să apară în meniul derulant cu autori, trebuie să adăugați capabilitatea level_1 rolului. Nivelurile au fost înlocuite cu capabilități în WordPress 2.0 încă din 2005, dar acest comportament/bug a rămas până acum.

$role = add_role( 'mycustomrole', 'Rolul Meu Personalizat' );
$role->add_cap( 'level_1' );

Pentru a adăuga această capabilitate utilizatorilor existenți, rulați acest cod o singură dată:

$custom_role = get_users( 'role=mycustomrole' );
foreach ( $custom_role as $role ) {
    $role->add_cap( 'level_1' );
}
13 sept. 2023 15:44:29
0

Am încercat toate soluțiile de aici și altele, dar aceasta din notele utilizatorilor contribuitori din Wordpress Codex a fost singura care a funcționat pentru mine.

Se spune că trebuie să dai drepturi abonaților să o folosească, dar în cazul meu, nu am vrut asta. Voiam doar să pot să-i selectez în caseta de selectare a autorilor.

// Afișează Abonații în meniul drop-down 'autor' din editorul clasic de postări
function wpdocs_add_subscribers_to_dropdown( $query_args ) {
    $query_args['who'] = ''; // resetează interogarea
    $query_args['capability'] = ''; // resetează interogarea
    $query_args['role__in'] = array( 'administrator', 'subscriber', 'author', 'editor' );
    $query_args['capability__in'] = array( 'edit_own_posts' ); // Drept personalizat pentru abonați

    return $query_args;
}
add_filter( 'wp_dropdown_users_args', 'wpdocs_add_subscribers_to_dropdown' );

Linkul către pagina codex: https://developer.wordpress.org/reference/hooks/wp_dropdown_users_args/#user-contributed-notes

23 aug. 2024 23:29:52