WordPressで管理者以外には他の投稿が見えないようにする

harada 1,374views 更新:2013年12月3日

WordPressで複数のユーザーが存在する場合、通常他のユーザーの投稿数などが見えてしまいますが、それを隠したいときに使うコードです。

以下のコードをfunctions.phpに記述します。

// 投稿とメディアをログインしたアカウントのもののみ表示
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);
        $screen = get_current_screen();
        add_filter('views_'.$screen->id, 'fix_post_counts');
        add_filter('views_upload', 'fix_media_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)  ? '' : '';
            $views['all'] = sprintf(__('<a href="%s"'. $class  .'>' . __('All') . ' <span>(%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') ? '' : '';
            $views['publish'] = sprintf(__('<a href="%s"'. $class .'>' . __('Published') . ' <span>(%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') ? '' : '';
            $views['draft'] = sprintf(__('<a href="%s"'. $class .'>'. __('Draft') . ((sizeof($result->posts) > 1) ? "s" : "") .' <span>(%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') ? '' : '';
            $views['pending'] = sprintf(__('<a href="%s"'. $class .'>'. __('Pending') .' <span>(%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') ? '' : '';
            $views['trash'] = sprintf(__('<a href="%s"'. $class .'>'. __('Trash') .' <span>(%d)</span></a>', 'trash'),
                admin_url('edit.php?post_status=trash&post_type=post'),
                $result->found_posts);
        endif;
    }
    return $views;
}
// メディア数
function fix_media_counts($views) {
    global $wpdb, $current_user, $post_mime_types,  $avail_post_mime_types;
    $views = array();
    $count = $wpdb->get_results("
        SELECT post_mime_type, COUNT( * ) AS num_posts
        FROM $wpdb->posts
        WHERE post_type = 'attachment'
        AND post_author = $current_user->ID
        AND post_status != 'trash'
        GROUP BY post_mime_type
    ", ARRAY_A );
    foreach($count as $row)
        if ($count && $row != 0) {
            $_num_posts[$row['post_mime_type']] = $row['num_posts'];
            $_total_posts = array_sum($_num_posts);
            $detached = isset($_REQUEST['detached']) || isset($_REQUEST['find_detached']);
        };
    if (!isset($total_orphans))
        $total_orphans = $wpdb->get_var("
            SELECT COUNT( * )
            FROM $wpdb->posts
            WHERE post_type = 'attachment'
            AND post_author = $current_user->ID
            AND post_status != 'trash'
            AND post_parent < 1
        ");
    $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
    foreach ($matches as $type => $reals)
        foreach ($reals as $real)
            $num_posts[$type] = ( isset($num_posts[$type])) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
    $class = (empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status'])) ? '' : '';
    $views['all'] = "<a href='upload.php'$class>" . sprintf(__(__('All') .' <span>(%s)</span>', 'uploaded files'), number_format_i18n($_total_posts)) . '</a>';
    foreach ( $post_mime_types as $mime_type => $label ) {
        $class = '';
        if (!wp_match_mime_types($mime_type, $avail_post_mime_types))
            continue;
        if (!empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']))
            $class = '';
        if (!empty( $num_posts[$mime_type]))
            $views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf(translate_nooped_plural($label[2], $num_posts[$mime_type]), $num_posts[$mime_type]) . '</a>';
    }
    $views['detached'] = '<a href="upload.php?detached=1"' . ($detached ? '' : '') . '>' . sprintf(_x('Unattached <span>(%s)</span>', 'detached files'), $total_orphans) . '</a>';
    return $views;
}

参考:管理画面で他のユーザの投稿数やアップロード数を表示したくない

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません