व्यवस्थापक पैनल में पोस्ट के लेखक के रूप में ग्राहक का चयन करें?


16

मैं व्यवस्थापक में किसी पोस्ट के एक ग्राहक का चयन करने में सक्षम होना चाहता हूं, इसलिए यह उनके नाम को पोस्ट लिखने के रूप में प्रदर्शित करता है, लेकिन मैं उन्हें कोई अतिरिक्त विशेषाधिकार नहीं देना चाहता (यदि वे केवल उसी चीज को लॉगिन करते हैं जो वे एक्सेस कर सकते हैं उनकी प्रोफ़ाइल)।

क्या भूमिकाओं और क्षमताओं को बदलने के बिना ऐसा करने का एक सरल तरीका है?

धन्यवाद

जवाबों:


17

यह एक साधारण हैक है जिसे मैंने इसी तरह की स्थिति में लिखा था। यह एडिट / ऐड पोस्ट / पेज पर ड्रॉपडाउन Subscribersमें सभी को प्रदर्शित करेगा Author, जहाँ से आप अपनी पसंद का कोई भी चयन कर सकते हैं। मुझे लगता है कि यह आपके लिए काम करना चाहिए ...

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

इसके पीछे की ट्रिक यह है कि आप इस पेज को सबमिट करने के बाद, WP केवल $ _POST एरे में इस ड्रॉप डाउन से $ user-> ID को पढ़ते हैं, और इसे पोस्ट्स लेखक के रूप में असाइन करते हैं। और यही आप चाहते हैं!


बहुत बहुत धन्यवाद Rutwick! वास्तव में मुझे क्या चाहिए! मुझे सिर्फ $ उपयोगकर्ता = get_users () बदलना पड़ा; अन्यथा यह उपयोगकर्ताओं को वहां अन्य भूमिकाओं के साथ प्रदर्शित नहीं करता था
fxfuture

आपका स्वागत है दोस्त! :) वास्तव में मैं इसे एक कस्टम भूमिका के लिए उपयोग कर रहा था, इसलिए पैरामीटर ... खुशी है कि मैं मदद कर सकता हूं!
रुटविक गांगुर्ड

मैंने अभी इसके साथ एक छोटी सी समस्या पाई है - जब मैं पोस्ट एडिट पेज को ड्रॉप डाउन डिफॉल्ट को एडमिन करने के लिए रिवाइज करता हूं, इसलिए यदि मैं बदलाव करता हूं और लेखक को रिजेक्ट किए बिना बचा लेता हूं तो यह लेखक को एडमिन में बदल देता है। इसे ठीक करने के लिए कोई भी विचार?
fxfuture

हां, आपको इस पोस्ट के लिए लेखक मिलता है, और यह जांचें कि कौन सा उपयोगकर्ता लेखक से मेल खाता है, उस विकल्प को चयनित रखें।
रुटविक गांगुर्ड

2
global $postवेरिएबल को प्रिंट करने की कोशिश करें ...
रटविक गांगुर्ड

13

वर्डप्रेस 4.4.0 के रूप में अब आप wp_dropdown_users_argsफ़िल्टर का उपयोग कर सकते हैं । कोड अब बहुत सरल है:

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
यह सही / स्वीकृत उत्तर होना चाहिए। सीधे कोडेक्स से: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren

2

यह @brasofilo के समान है। लेकिन केवल त्वरित संपादन के बजाय संपादित पोस्ट स्क्रीन में काम करता है, और इसमें सभी उपयोगकर्ता (केवल लेखक और ग्राहक नहीं) शामिल हैं।

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

यह डिफ़ॉल्ट लेखक मेटाबॉक्स की नकल करता है लेकिन कॉल तर्क wp_dropdown_usersको छोड़ देता who=>'editors'है। यह केवल अन्य मान को डिफॉल्ट करता है जो कॉल उपयोगकर्ता है।


धन्यवाद स्टीफन। मैं रुटविक के समाधान का उपयोग कर रहा हूं क्योंकि यह पहले से ही सीपीटी के साथ काम करता है लेकिन आपके उत्तर की सराहना करता है :)
fxfuture

जोड़ा गया वैश्विक $ पोस्ट; वास्तविक कार्य के बाद से यह मौजूदा लेखक को नहीं उठा रहा था जब मैंने एक पोस्ट को संपादित किया था, लेकिन यह हमेशा मुझे पोस्ट लेखक के रूप में ले गया। बहुत एनीओइंग।
danieldekay

1

इसे करने का एक बेहतर तरीका ...

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

}

मेरे लिए काम नहीं करता है: यह हमेशा पोस्ट के नए लेखक बनने के लिए व्यवस्थापक खाते का प्रस्ताव करता है, जो उपयोगकर्ताओं को वास्तव में पोस्ट अपडेट करने के लिए (और फिर स्वचालित रूप से संपादन अधिकार खो देता है) बनाता है।
danieldekay

1

यह एक कोड है जो एक टिप्पणी (समाधान) में अपने स्वयं के प्रश्न से जुड़ा है, मैंने अभी थोड़ा सा रूपांतर किया है और WP 3.3.2 (फ़ंक्शन wpse39084) में परीक्षण किया है। यह सब्सक्राइबर्स को एडिट और क्विक एडिट में पोस्ट दिखाएगा।

आसान प्रबंधन के लिए प्रकाशित क्रियाएँ मेटा बॉक्स के अंदर लेखक मेटा बॉक्स को स्थानांतरित करने के लिए कुछ क्रियाओं (फ़ंक्शन wpse50827) को जोड़ा।

सब कुछ पोस्ट से संबंधित है, न पेज और न ही सीपीटी ...

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
धन्यवाद ब्रसोफिलो। मैं रुटविक के समाधान का उपयोग कर रहा हूं क्योंकि यह पहले से ही सीपीटी के साथ काम करता है लेकिन आपके उत्तर की सराहना करता है :)
fxfuture

0

मैंने यहाँ स्वीकृत उत्तर के समान ही कुछ किया है, लेकिन केवल एक साथ एक 'निर्माता' की भूमिका में, मुझे दिखाना चाहता था कि मेरे लिए एक अच्छा और सराहनीय विषय है।

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

यह त्वरित-संपादन में त्रुटि से बचने के लिए एक समाधान हो सकता है, जहां "cpt_slug" को आपके कस्टम प्रकार के साथ बदल दिया जाना चाहिए

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' ) );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.