WordPress: Autoren im QuickEdit und in der Sidebar nicht mehr sichtbar / editierbar


02.07.2022
CMS

WordPress bietet die Möglichkeit, einige Einträge zu unterschiedlichen Post Types auch direkt über den Quick Edit bearbeiten zu können. dazu gehört unter anderem der Autor.
Um diesen Ändern zu können, müssen aber einige Vorraussetzungen geschaffen sein.

Über den QuickEdit oder in der Sidebar der Einzelseite im Backend ist der Autor bearbeitbar. So kann man auch einen anderen Autoren zuweisen.

Autor Support für den Post Type

Hat der Post Type überhaupt ein Autorenfeld? Nicht alle Post Types haben einen Autor per default. Das lässt sich aber schnell herausfinden. Einfach mal nach schauen, was folgende Funktion zurückgibt:

echo ( post_type_supports( 'MY_POST_TYPE_SLUG', 'author' ) );

Hier wird ein Boolean zurückgegeben. Dadurch finden wir heraus, ob der Post Type überhaupt Autoren unterstützt. Wenn das nicht der Fall ist, kann man das ändern mit:

add_post_type_support( 'MY_POST_TYPE_SLUG', array(
    'author', 'WEITERE_POST_TYPE_FEATURES_OPTIONAL',
) );

Darf die eingeloggte Benutzergruppe den Autor ändern?

Nicht alle Benutzergruppen dürfen den Autor ändern. Das ist natürlich ein Sicherheitsfeature, da die Inhaberschaft von einzelnen Seiten dadurch geändert wird und Seiten dadurch leichter verändert oder gelöscht werden könnnten. Ob der gefragte User das darf, kann man herausfinden über:

$post_type_object = get_post_type_object( 'MY_POST_TYPE_SLUG' );
echo current_user_can( $post_type_object->cap->edit_others_posts );

Wenn die eigene Gruppe den Autoren nicht verändern darf (bei einigen Post Types ist das z.B. nur der Administrator), kann man diese Berechtigung immer noch über die Capabilities von WordPress zuweisen:

if ( role_exists( 'MY_CUSTOM_USER_GROUP_SLUG' ) ) {
  $role->add_cap( 'create_posts' );
  $role->add_cap( 'edit_posts' );
  $role->add_cap( 'edit_others_posts' );
}

Seit WordPress 6.0: „wp_is_large_user_count“ Abfrage beachten

Wenn man nun den Post Type und die eigenen Rechte überprüft hat und sich auch sicher ist, dass das UI Elemente zum bearbeiten eingeblendet ist, könnte es sein, dass man inzwischen auf WordPress 6.0.0 geupdated hat und eine große WordPress Website betreut. Was ist groß bei WordPress? Seit 6.0 hat WordPress dafür eine Abfrage integriert.

/**
 * Determines whether the site has a large number of users.
 *
 * The default criteria for a large site is more than 10,000 users.
 *
 * @since 6.0.0
 *
 * @param int|null $network_id ID of the network. Defaults to the current network.
 * @return bool Whether the site has a large number of users.
 */
function wp_is_large_user_count( $network_id = null ) {
	if ( ! is_multisite() && null !== $network_id ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: $network_id */
				__( 'Unable to pass %s if not using multisite.' ),
				'<code>$network_id</code>'
			),
			'6.0.0'
		);
	}

	$count = get_user_count( $network_id );

	/**
	 * Filters whether the site is considered large, based on its number of users.
	 *
	 * @since 6.0.0
	 *
	 * @param bool     $is_large_user_count Whether the site has a large number of users.
	 * @param int      $count               The total number of users.
	 * @param int|null $network_id          ID of the network. `null` represents the current network.
	 */
	return apply_filters( 'wp_is_large_user_count', $count > 10000, $count, $network_id );
}

Dabei fragt WordPress nach der Anzahl der User auf der Website. Dabei ist per default der Wert auf 10.000 gesetzt. Wenn also mehr als 10.000 User auf der Website eingetragen sind, könnte es sein, dass der Autoren-Dropdown einfach entfernt wird:

$dropdown_name  = 'post_author';
$dropdown_class = 'authors';
if ( wp_is_large_user_count() ) {
	$authors_dropdown = sprintf( '<select name="%s" class="%s hidden"></select>', esc_attr( $dropdown_name ), esc_attr( $dropdown_class ) );
} else {

Da hier ein Filter angewendet wird, kann man sich in den Filter reinhooken und selber den Wert neu definieren. Zum Beispiel so:

function wp_is_large_user_count_increment( $is_large ) {
	return false;
}
add_filter('wp_is_large_user_count','wp_is_large_user_count_increment');