2022.4.18|WordPress
WordPress(ワードプレス)管理画面で投稿ユーザー毎に投稿記事の「公開済み・下書き」件数を表示させる実装方法
WordPress(ワードプレス)を利用し、会員制サイトや複数人で運営を行う場合があります。複数人でWordPress(ワードプレス)を運営を行うと管理画面の投稿一覧に表示される記事の件数(公開済み)や下書きの件数が全ての投稿ユーザーが投稿した件数が表示されます。
複数人で運営を行っていると自分の記事が何件公開されていて何件下書きとして保存されているかが一目でわかりません。管理画面のカスタマイズを行うとそれらの問題を解決できます。
今回は、WordPress(ワードプレス)管理画面で投稿ユーザー毎に投稿記事の「公開済み・下書き」件数を表示させる実装方法を解説します。
管理画面で投稿ユーザー毎に投稿記事の「公開済み・下書き」件数を表示させる実装方法
管理画面の投稿一覧に表示される「公開済み・下書き」の件数を投稿ユーザー毎の件数を表示させるには、「functions.php」ファイルに、「公開済み・下書き」の件数をユーザー毎に切り替えるコードを記述する必要があります。
1.「functions.php」ファイルにコードを記述
サーバーにインストールされたWordPressの「テーマ」ファイルから「functions.php」ファイルを探します。
「functions.php」ファイルを開いて必要なコードを記述し、保存を行ったファイルをサーバーにアップロードしたら完了です。
投稿ユーザー毎に切り替えるコード
//公開数、下書きの件数をアカウント毎の件数
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
global $current_user;
//管理画面であること edit_others_posts権限がないこと post_typeがacfでないこと(Advanced Custom Fieldsないときは外して良い)
if( is_admin() && !current_user_can('edit_others_posts') && $wp_query->query_vars['post_type'] != 'acf') {
$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');
}
}
// Fix post counts
function fix_post_counts($views) {
global $current_user, $wp_query,$post_type;
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_type,//全投稿タイプで対応できるようにするため、ここは投稿タイプで取得する
'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="http://www.kingsite.jp/blog/cms/%s" '.="" $class="" .'="">' . __('All') . ' <span class="count">(%d)</span></a>', 'all'),
admin_url('edit.php?post_type='.$post_type),
$result->found_posts);
elseif($type['status'] == 'publish'):
$class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
$views['publish'] = sprintf(__('<a href="http://www.kingsite.jp/blog/cms/%s" '.="" $class="" .'="">' . __('Published') . ' <span class="count">(%d)</span></a>', 'publish'),
admin_url('edit.php? post_status=publish&post_type='.$post_type),
$result->found_posts);
elseif($type['status'] == 'draft'):
$class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
$views['draft'] = sprintf(__('<a href="http://www.kingsite.jp/blog/cms/%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_type),
$result->found_posts);
elseif($type['status'] == 'pending'):
$class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
$views['pending'] = sprintf(__('<a href="http://www.kingsite.jp/blog/cms/%s" '.="" $class="" .'="">'. __('Pending') .' <span class="count">(%d)</span></a>', 'pending'),
admin_url('edit.php?post_status=pending&post_type='.$post_type),
$result->found_posts);
elseif($type['status'] == 'trash'):
$class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
$views['trash'] = sprintf(__('<a href="http://www.kingsite.jp/blog/cms/%s" '.="" $class="" .'="">'. __('Trash') .' <span class="count">(%d)</span></a>', 'trash'),
admin_url('edit.php?post_status=trash&post_type='.$post_type),
$result->found_posts);
endif;
}
return $views;
}
// Fix media counts
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'])) ? ' class="current"' : '';
$views['all'] = "<a href="http://www.kingsite.jp/blog/cms/upload.php" $class="">" . sprintf(__(__('All') .' <span class="count">(%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 = ' class="current"';
if (!empty( $num_posts[$mime_type]))
$views[$mime_type] = "<a href="http://www.kingsite.jp/blog/cms/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="http://www.kingsite.jp/blog/cms/upload.php?detached=1" '="" .="" ($detached="" ?="" class="current" :="" '')="">' . sprintf(_x('Unattached <span class="count">(%s)</span>', 'detached files'), $total_orphans) . '</a>';
return $views;
}
2.管理画面の確認
「functions.php」ファイルへ必要なコードを記述したら管理画面にログインを行って投稿一覧画面を確認します。投稿一覧画面の上部に「所有」の件数が表示されていれば実装完了です。
まとめ
ユーザー毎の投稿件数の表示は使う場面は少ないですが、複数人で運営を行っている場合は役立つカスタマイズです。管理画面のこんな所までカスタマイズできるのかと、覚えておくのも良いですね。