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[]" ...
我希望自定义字段能够 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[]" ...