Users with custom roles not showing in post author select box

I am using a function to create new user roles and delete some defaults. However, they are not showing up in the post author box! Only the admin shows up because they are selected as an admin. Any user with a custom role does not show up. Any idea why this would be happening?

Here is my function:

// Add New User Roles
function add_new_roles() {

    // New Roles To Be Added
    $new_roles = array(
        array(
            'role'      => 'senior_pastor',
            'display'   => 'Senior Pastor'
        ),
        array(
            'role'      => 'exec_pastor',
            'display'   => 'Executive Pastor'
        ),
        array(
            'role'      => 'assoc_pastor',
            'display'   => 'Associate Pastor'
        ),
        array(
            'role'      => 'elder',
            'display'   => 'Elder'
        ),
        array(
            'role'      => 'ministry_leader',
            'display'   => 'Ministry Leader'
        )
    );

    foreach($new_roles as $role){
        add_role($role['role'], $role['display'], array(
            'edit_published_posts' => true,
            'upload_files' => true,
            'create_product' => true,
            'publish_posts' => true,
            'delete_published_posts' => true,
            'edit_posts' => true,
            'delete_posts' => true,
            'read' => true
        ));
    }

    // Old Roles To Be Removed
    $old_roles = array(
        'subscriber',
        'contributor',
        'author'
        'editor'
    );

    foreach($old_roles as $role){
        remove_role( $role );
    }
}
add_action('after_switch_theme', 'add_new_roles');

2 s
2

Found a workaround below. I guess it has to do with a bug in the WordPress core. This will list ALL users in posts, so be cautious.

// Filter to fix the Post Author Dropdown
function author_override( $output ) {
    global $post, $user_ID;

    // return if this isn't the theme author override dropdown
    if (!preg_match('/post_author_override/', $output)) return $output;

    // return if we've already replaced the list (end recursion)
    if (preg_match ('/post_author_override_replaced/', $output)) return $output;

    // replacement call to wp_dropdown_users
      $output = wp_dropdown_users(array(
        'echo' => 0,
        'name' => 'post_author_override_replaced',
        'selected' => empty($post->ID) ? $user_ID : $post->post_author,
        'include_selected' => true
      ));

      // put the original name back
      $output = preg_replace('/post_author_override_replaced/', 'post_author_override', $output);

    return $output;
}
add_filter('wp_dropdown_users', 'author_override');

credit goes to here

Leave a Comment