Ajuda para condensar / otimizar algum código de trabalho

4

WordPress, por padrão, mostra TODOS os posts para usuários que são Autores. Eu queria que os Autores só pudessem ver seus próprios posts, então eu criei o seguinte código que funciona bem.

Alguma sugestão para condensar / otimizar?

// 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"'.$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"'.$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"'.$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"'.$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"'.$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;
}
    
por Paul 26.11.2011 / 00:09

1 resposta

6

Ok, eu percebi. Aqui está o código otimizado:

// 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"'. $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"'. $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"'. $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"'. $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"'. $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;
}
    
por Paul 26.11.2011 / 13:58