2017-10-10 115 views
0

我想要一个自定义字段能够从列表中选择多个用户。WordPress的:自定义字段选择多个用户

我已经可以选择多个作者的插件,但这是针对发布商网站的,我想标记具有其他角色的用户(例如编辑者) 。

到目前为止,我只得到一个结果。

/** 
* Create the metabox 
* @link https://developer.wordpress.org/reference/functions/add_meta_box/ 
*/ 
function _namespace_create_metabox() { 

// Can only be used on a single post type (ie. page or post or a custom post type). 
// Must be repeated for each post type you want the metabox to appear on. 
add_meta_box(
    '_namespace_metabox', // Metabox ID 
    'Some Metabox', // Title to display 
    '_namespace_render_metabox', // Function to call that contains the metabox content 
    'product', // Post type to display metabox on 
    'normal', // Where to put it (normal = main colum, side = sidebar, etc.) 
    'default' // Priority relative to other metaboxes 
); 
} 
add_action('add_meta_boxes', '_namespace_create_metabox'); 

/** 
* Render the metabox markup 
* This is the function called in `_namespace_create_metabox()` 
*/ 
function _namespace_render_metabox() { 
    // Variables 
    global $post; // Get the current post data 

    $details = $post->_namespace; // Get the saved values 
    // query array 
    $args = array('role' => 'author'); 

    $users = get_users($args); 
    if(empty($users)) 
     return; 

    echo'<select name="_namespace_custom_metabox" id="_namespace_custom_metabox" multiple="mulitiple" >'; 
    foreach($users as $user){ 
     echo '<option value="'.$user->data->user_login.'">'.$user->data->display_name.'</option>'; 
    } 
    echo'</select>'; 
    echo $details; 
    echo '<br>'; 
    print_r($details); 

// Security field 
// This validates that submission came from the 
// actual dashboard and not the front end or 
// a remote server. 
    wp_nonce_field('_namespace_form_metabox_nonce', '_namespace_form_metabox_process'); 
} 
/** 
* Save the metabox 
* @param Number $post_id The post ID 
* @param Array $post The post data 
*/ 
function _namespace_save_metabox($post_id, $post) { 

// Verify that our security field exists. If not, bail. 
if (!isset($_POST['_namespace_form_metabox_process'])) return; 

// Verify data came from edit/dashboard screen 
if (!wp_verify_nonce($_POST['_namespace_form_metabox_process'], '_namespace_form_metabox_nonce')) { 
    return $post->ID; 
    } 

// Verify user has permission to edit post 
if (!current_user_can('edit_post', $post->ID)) { 
    return $post->ID; 
    } 

// Check that our custom fields are being passed along 
// This is the `name` value array. We can grab all 
// of the fields and their values at once. 
if (!isset($_POST['_namespace_custom_metabox'])) { 
    return $post->ID; 
    } 
/** 
* Sanitize the submitted data 
* This keeps malicious code out of our database. 
* `wp_filter_post_kses` strips our dangerous server values 
* and allows through anything you can include a post. 
*/ 
$sanitized = wp_filter_post_kses($_POST['_namespace_custom_metabox']); 
// Save our submissions to the database 
update_post_meta($post->ID, '_namespace', $sanitized); 

    } 
add_action('save_post', '_namespace_save_metabox', 1, 2); 
/** 
* Save events data to revisions 
* @param Number $post_id The post ID 
*/ 
function _namespace_save_revisions($post_id) { 

    // Check if it's a revision 
$parent_id = wp_is_post_revision($post_id); 

    // If is revision 
    if ($parent_id) { 

    // Get the saved data 
    $parent = get_post($parent_id); 
    $details = $post->_namespace; 

    // If data exists and is an array, add to revision 
    if (!empty($details)) { 
     add_metadata('post', $post_id, '_namespace', $details); 
    } 

    } 

    } 
    add_action('save_post', '_namespace_save_revisions'); 
    /** 
    * Restore events data with post revisions 
    * @param Number $post_id  The post ID 
    * @param Number $revision_id The revision ID 
    */ 
function _namespace_restore_revisions($post_id, $revision_id) { 

    // Variables 
    $post = get_post($post_id); // The post 
    $revision = get_post($revision_id); // The revision 
    $details = $post->_namespace; // The historic version 

// Replace our saved data with the old version 
update_post_meta($post_id, '_namespace', $details); 

} 
add_action('wp_restore_post_revision', '_namespace_restore_revisions', 10, 2); 

/** 
* Get the data to display on the revisions page 
* @param Array $fields The fields 
* @return Array The fields 
*/ 
function _namespace_get_revisions_fields($fields) { 
    // Set a title 
    $fields['_namespace'] = 'Some Item'; 
    return $fields; 
} 
add_filter('_wp_post_revision_fields', '_namespace_get_revisions_fields'); 

/** 
* Display the data on the revisions page 
* @param String|Array $value The field value 
* @param Array  $field The field 
*/ 
function _namespace_display_revisions_fields($value, $field) { 
global $revision; 
return get_metadata('post', $revision->ID, $field, true); 
} 
add_filter('_wp_post_revision_field_my_meta', '_namespace_display_revisions_fields', 10, 2); 

任何帮助,将不胜感激。

由于@misha
我得到了它与这个

add_action('admin_menu', 'editor_metabox'); 
add_action('save_post', 'editor_save_metaboxdata', 10, 2); 


function editor_metabox() { 
add_meta_box('editor_select2', 'Editor(s)', 'editor_display_metabox', 'product', 'normal', 'default'); 
} 


function editor_display_metabox($post_object) { 

$html = ''; 

$appended_tags = get_post_meta($post_object->ID, 'en_editor',true); 

$args = array(
    'role' => 'author' 
); 

if($tags = get_users($args)) { 
    $html .= '<p><label for="en_editor">Editor(s):</label><br /><select id="en_editor" name="en_editor[]" multiple="multiple" style="width:99%;max-width:25em;" >'; 
    foreach($tags as $tag) { 
     $selected = (is_array($appended_tags) && in_array($tag->user_login, $appended_tags)) ? ' selected="selected"' : ''; 
     $html .= '<option value="'.$tag->data->user_login.'"' . $selected . '>'.$tag->data->display_name.'</option>'; 
    } 
    $html .= '<select></p>'; 
} 

echo $html; 
foreach ($appended_tags as $appended_tags){ 
$user = get_user_by('login', $appended_tags); 
echo $user->display_name; 
echo '<br>'; 
wp_nonce_field('en_editor_form_metabox_nonce', 'en_editor_form_metabox_process'); 
} 
} 


function editor_save_metaboxdata($post_id, $post) { 

if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id; 


// check permissions 
if ('product' == $_POST['post_type']) { 
    if (!current_user_can('edit_page', $post_id)) 
     return $post_id; 
    } elseif (!current_user_can('edit_post', $post_id)) { 
     return $post_id; 
} 

if ($post->post_type == 'product') { 
    if(isset($_POST['en_editor'])) 
     update_post_meta($post_id, 'en_editor', $_POST['en_editor']); 
    else 
     delete_post_meta($post_id, 'en_editor'); 


} 
return $post_id; 
} 

回答

0

如果你想PHP定义$_POST['_namespace_custom_metabox']作为一组选项,你必须方括号添加到选择元素的name属性工作像这样:echo'<select name="_namespace_custom_metabox[]" ...

+0

我在你指出的地方添加了方括号,现在函数不会回显任何东西。 我需要在多个地方添加[]吗? –

+0

请注意,$ _POST ['_ namespace_custom_metabox']现在是数组。 –

+0

米沙 - 你能指点我一个类似的例子吗?我很难找到任何在线。 –