Help to condense/optimize some working code

WordPress by default shows ALL posts to users who are Authors. I wanted Authors to only be able to see their own posts so I came up with the following code which works well.

Any suggestions to condense/optimize it?

// Only show posts related to current author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
    global $current_user;
    if ( is_admin() && !current_user_can('edit_others_posts') ) {
        $wp_query->set( 'author', $current_user->ID );
    }
}

// Check that user is not an Administrator
if (!current_user_can('promote_users')) {
    add_filter('views_edit-post', 'remove_mine');
    add_filter('views_edit-post', 'posts_all');
    add_filter('views_edit-post', 'posts_published');
    add_filter('views_edit-post', 'posts_draft');
    add_filter('views_edit-post', 'posts_pending');
    add_filter('views_edit-post', 'posts_trash');
}

// Remove "Mine" from filter bar
function remove_mine( $views ) {
    unset($views['mine']);
    return $views;
}

// Fix "All" post count to only include posts related to current author
function posts_all($views) {
    global $current_user;   
    $query = array(
        'author'       => $current_user->ID,
        'post_type'    => 'post'
    );
    $result = new WP_Query($query);
    if ( get_query_var('post_status') == NULL ) $class = ' class="current"';
    $link = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'.$class.'>All <span class="count">(%d)</span></a>', 'all'),
            admin_url('edit.php?post_type=post'),
            $result->found_posts);
    $views['all'] = $link;
    return $views;
}

// Fix "Published" post count to only include posts related to current author
function posts_published($views) {
    global $current_user;   
    $query = array(
        'author'       => $current_user->ID,
        'post_status'  => 'publish',
        'post_type'    => 'post'
    );
    $result = new WP_Query($query);
    if ( get_query_var('post_status') == 'publish' ) $class = ' class="current"';
    $link = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'.$class.'>Published <span class="count">(%d)</span></a>', 'publish'),
            admin_url('edit.php?post_status=publish&post_type=post'),
            $result->found_posts);
    $views['publish'] = $link;
    return $views;
}

// Fix "Drafts" post count to only include posts related to current author
function posts_draft($views) {
    global $current_user;   
    $query = array(
        'author'       => $current_user->ID,
        'post_status'  => 'draft',
        'post_type'    => 'post'
    );
    $result = new WP_Query($query);
    if ( get_query_var('post_status') == 'draft' ) $class = ' class="current"';
        $link = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'.$class.'>Draft'.((sizeof($result->posts)>1)?"s":"").' <span class="count">(%d)</span></a>', 'draft'),
            admin_url('edit.php?post_status=draft&post_type=post'),
            $result->found_posts);
    $views['draft'] = $link;
    return $views;
}

// Fix "Pending" post count to only include posts related to current author
function posts_pending($views) {
    global $current_user;   
    $query = array(
        'author'       => $current_user->ID,
        'post_status'  => 'pending',
        'post_type'    => 'post'
    );
    $result = new WP_Query($query);
    if ( get_query_var('post_status') == 'pending' ) $class = ' class="current"';
        $link = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'.$class.'>Pending <span class="count">(%d)</span></a>', 'pending'),
            admin_url('edit.php?post_status=pending&post_type=post'),
            $result->found_posts);
    $views['pending'] = $link;
    return $views;
}

// Fix "Trash" post count to only include posts related to current author
function posts_trash($views) {
    global $current_user;   
    $query = array(
        'author'       => $current_user->ID,
        'post_status'  => 'trash',
        'post_type'    => 'post'
    );
    $result = new WP_Query($query);
    if ( get_query_var('post_status') == 'trash' ) $class = ' class="current"';
    $link = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'.$class.'>Trash <span class="count">(%d)</span></a>', 'trash'),
            admin_url('edit.php?post_status=trash&post_type=post'),
            $result->found_posts);
    $views['trash'] = $link;
    return $views;
}

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Ok I figured it out. Here’s the optimized code:

// Show only posts related to current user
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
    global $current_user;
    if( is_admin() && !current_user_can('edit_others_posts') ) {
        $wp_query->set( 'author', $current_user->ID );
        add_filter('views_edit-post', 'fix_post_counts');
    }
}

// Fix post counts
function fix_post_counts($views) {
    global $current_user, $wp_query;
    unset($views['mine']);
    $types = array(
        array( 'status' =>  NULL ),
        array( 'status' => 'publish' ),
        array( 'status' => 'draft' ),
        array( 'status' => 'pending' ),
        array( 'status' => 'trash' )
    );
    foreach( $types as $type ) {
        $query = array(
            'author'      => $current_user->ID,
            'post_type'   => 'post',
            'post_status' => $type['status']
        );
        $result = new WP_Query($query);
        if( $type['status'] == NULL ):
            $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
            $views['all'] = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'. $class .'>All <span class="count">(%d)</span></a>', 'all'),
                admin_url('edit.php?post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'publish' ):
            $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
            $views['publish'] = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'. $class .'>Published <span class="count">(%d)</span></a>', 'publish'),
                admin_url('edit.php?post_status=publish&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'draft' ):
            $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
            $views['draft'] = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'. $class .'>Draft'. ((sizeof($result->posts) > 1) ? "s" : "") .' <span class="count">(%d)</span></a>', 'draft'),
                admin_url('edit.php?post_status=draft&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'pending' ):
            $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
            $views['pending'] = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'. $class .'>Pending <span class="count">(%d)</span></a>', 'pending'),
                admin_url('edit.php?post_status=pending&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'trash' ):
            $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
            $views['trash'] = sprintf(__('<a href="%s" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener" rel="nofollow noreferrer noopener"'. $class .'>Trash <span class="count">(%d)</span></a>', 'trash'),
                admin_url('edit.php?post_status=trash&post_type=post'),
                $result->found_posts);
        endif;
    }
    return $views;
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x