Ich füge eine zweite Antwort hinzu, weil mein erster Ansatz abgelehnt wurde und dieser nicht die richtige Aufmerksamkeit erhielt.
Die Idee ist, eine benutzerdefinierte Meta-Box zu erstellen, die alle Benutzer auflistet und den Autor in save_post
Hook ändert . Auf diese Weise können Sie die Benutzerfunktionen nicht beeinträchtigen und der Autorenwechsel erfolgt, wenn die Beiträge bereits gespeichert sind. Der zusätzliche Gewinn besteht auch darin, dass Sie die Liste der Benutzer steuern können, die in der Autoren-Dropdown-Liste verfügbar sind. Schritte zum folgen:
Meta-Box registrieren:
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');
Erstellen Sie ein Markup für Ihre 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
}
Haken Sie ein save_post
, um Daten zu speichern und den Autor zu überschreiben:
/**
* 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');
HINWEIS
Denken Sie daran, ein Nonce-Feld hinzuzufügen und es beim Speichern nach dem Speichern zu überprüfen. Auch können Sie mit anderen Haken statt betrachten save_post
, dh pre_post_update
oder wp_insert_post_data
speichern, zu verarbeiten Daten über neue Post.
Ich hoffe, das hilft!