帮助压缩/优化一些工作代码

时间:2011-11-25 作者:Paul

默认情况下,WordPress会向作者用户显示所有帖子。我希望作者只能看到自己的帖子,所以我想出了以下代码,效果很好。

有什么浓缩/优化它的建议吗?

// 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;
}

1 个回复
最合适的回答,由SO网友:Paul 整理而成

好吧,我想出来了。以下是优化的代码:

// 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;
}

结束

相关推荐

Find most recent authors

我想做的是从16位不同的作者那里得到16篇最新的帖子。换句话说,将有16篇最新的帖子,但没有一位作者会在页面上发表超过1篇的帖子。我考虑的方法是遍历所有的作者,删除重复项,然后将其限制为16个,并使用它在一个for-each循环中生成帖子,但我想这对服务器来说会很沉重。有什么建议吗?