Wordpress:自定义字段 Select 多个用户

Wordpress: Custom Field Select Multiple Users

我希望自定义字段能够 select 列表中的多个用户。

我已经能够使用 co-authors-plus 中的插件为 post select 多位作者,但这是针对出版商网站的,我想标记拥有其他角色,例如给定出版物的编辑。

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

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

如果您希望 PHP 将 $_POST['_namespace_custom_metabox'] 定义为选项数组,您必须将方括号添加到 select 元素的名称属性,如下所示:echo'<select name="_namespace_custom_metabox[]" ...