J'ajoute une deuxième réponse parce que ma première approche a été rejetée et que celle-ci n'a pas retenu l'attention.
L'idée est de créer une méta-boîte personnalisée qui répertorie tous les utilisateurs et modifie l'auteur en save_post
crochet. De cette façon, vous ne jouez pas avec les capacités des utilisateurs et le changement d'auteur se produit lorsque les messages sont déjà enregistrés. Le bénéfice supplémentaire est également que vous pouvez contrôler la liste des utilisateurs disponibles dans la liste déroulante des auteurs. Étapes à suivre:
Enregistrer la méta-boîte:
function wpse313020_add_custom_box() {
// Bail out for users other than contributors
if ( ! user_can( get_current_user_id(), 'contributor' ) ) {
return;
}
// Register custom meta box
add_meta_box(
'wpse313020_author_override',
'Change Author', // metabox title
'wpse313020_author_ovveride_box_html', // callbac function
'post' // a post type you want to show the metabox on
);
}
add_action('add_meta_boxes', 'wpse313020_add_custom_box');
Construisez un balisage pour votre meta box:
/**
* HTML for custom meta box
*/
function wpse313020_author_ovveride_box_html() {
// you can modify the list of users by passing additional args to get_users()
$users = get_users();
?>
<label for="wpse313020_author_override_id">Select post author</label><br />
<select name="wpse313020_author_override_id" id="wpse313020_author_override_id" class="postbox">
<option value="">Select user...</option>
<?php
// get post ID on admin edit screen and retrieve saved post meta
$post_id = is_admin() && isset( $_GET['post'] ) ? absint( wp_unslash( $_GET['post'] ) ) : '';
$saved_value = ! empty( $post_id ) ? get_post_meta( $post_id, 'wpse313020_author_override', true ) : '';
foreach ( $users as $user ) {
echo sprintf( '<option value="%1$d" %2$s>%3$s</option>', absint( $user->ID ), selected( $saved_value, absint($user->ID, false ) ), esc_html( $user->display_name ) );
}
?>
</select>
<?php
}
Accrochez-vous save_post
pour enregistrer les données et remplacer l'auteur:
/**
* Save custom post meta and override the post author
*/
function wpse313020_save_postdata( $post_id ) {
if ( array_key_exists('wpse313020_author_override_id', $_POST ) ) {
// save post meta with author ID
update_post_meta( $post_id, 'wpse313020_author_override', absint( $_POST['wpse313020_author_override_id'] ) );
// now modify the post author, we need to unhook the current function to prevent infinite loop
// you could add additional check here to see if the current author is not the same as chosen author
remove_action( 'save_post', 'wpse313020_save_postdata' );
$updated_data = [
'ID' => $post_id,
'post_author' => absint( $_POST['wpse313020_author_override_id'] ),
];
wp_update_post( $updated_data );
add_action( 'save_post', 'wpse313020_save_postdata' );
}
}
add_action('save_post', 'wpse313020_save_postdata');
REMARQUE
N'oubliez pas d'ajouter un champ nonce et de le vérifier lors de la sauvegarde. Vous pouvez également envisager d'utiliser d'autres crochets au lieu de save_post
, c'est-à-dire pre_post_update
ou wp_insert_post_data
, pour traiter les données lors de la sauvegarde initiale.
J'espère que cela pourra aider!