관리자의 사용자 목록에 사용자 정의 게시물 유형별 사용자 게시물 수를 표시 하시겠습니까?


9

WPHonors.com/wp-admin/users.php 의 사용자 정의 게시물 유형에 대한 게시물 수를 표시하기 위해 사용자 지정 열을 만들기 위해 관리 페이지 에 연결하는 방법을 알아 내려고 합니다.

나는 이것을 위해 trac 티켓 을 만들었지 만 @nacin은 왜 플러그인이 대신하는 것이 더 많은 일인지 설명했다.

users 테이블의 출력을 조작하는 방법을 찾지 못해 각 사용자의 CPT 게시물 수에 대한 사용자 정의 열을 추가 할 수 있습니다. 그리고 그것은 @nacin이 묻는 질문과 관련이있을 수 있습니다. 사용자가 보유한 현재 '게시물'게시물 수는 게시물 관리 페이지에 연결되어 해당 사용자의 모든 게시물을 표시합니다 ( /wp-admin/edit.php?author=%author_id%).

어딘가에 연결하면 다음과 같습니다.

/wp-admin/edit.php?post_type=%post_type%&author=%author_id%

그것이 어떻게 든 가능하다면 나는 추측합니다. 그러나 필연적으로 어디서나 연결할 필요는 없습니다. 나는 주로 각 사용자에 대한 CPT 게시물 수를 표시 600하고 사용자 정의 게시물 유형에 300+걸쳐 4사용자 와 총 게시물 수를 표시하려고합니다 . 관리자는 'post'게시물 을 제출할 수있는 유일한 사람 이므로 사용자 페이지의 열이 쓸모가 없습니다.

답변:


10

Mike의 튜토리얼 답변이 확장되었습니다. 당신이 하나를 클릭 할 수 있으며위한 추가 변수를 요구하는 저자를 위해 해당 유형의 모든 게시물의 목록을 바로 취할 수 있도록 나는 열거 된 유형에 대한 링크를 추가 $counts하고 일부 여분의 출력$custom_column[]

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
    unset($column_headers['posts']);
    $column_headers['custom_posts'] = 'Assets';
    return $column_headers;
}

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
    if ($column_name=='custom_posts') {
        $counts = _yoursite_get_author_post_type_counts();
        $custom_column = array();
        if (isset($counts[$user_id]) && is_array($counts[$user_id]))
            foreach($counts[$user_id] as $count) {
                $link = admin_url() . "edit.php?post_type=" . $count['type']. "&author=".$user_id;
                // admin_url() . "edit.php?author=" . $user->ID;
                $custom_column[] = "\t<tr><th><a href={$link}>{$count['label']}</a></th><td>{$count['count']}</td></tr>";
            }
        $custom_column = implode("\n",$custom_column);
        if (empty($custom_column))
            $custom_column = "<th>[none]</th>";
        $custom_column = "<table>\n{$custom_column}\n</table>";
    }
    return $custom_column;
}

function _yoursite_get_author_post_type_counts() {
    static $counts;
    if (!isset($counts)) {
        global $wpdb;
        global $wp_post_types;
        $sql = <<<SQL
        SELECT
        post_type,
        post_author,
        COUNT(*) AS post_count
        FROM
        {$wpdb->posts}
        WHERE 1=1
        AND post_type NOT IN ('revision','nav_menu_item')
        AND post_status IN ('publish','pending', 'draft')
        GROUP BY
        post_type,
        post_author
SQL;
        $posts = $wpdb->get_results($sql);
        foreach($posts as $post) {
            $post_type_object = $wp_post_types[$post_type = $post->post_type];
            if (!empty($post_type_object->label))
                $label = $post_type_object->label;
            else if (!empty($post_type_object->labels->name))
                $label = $post_type_object->labels->name;
            else
                $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
            if (!isset($counts[$post_author = $post->post_author]))
                $counts[$post_author] = array();
            $counts[$post_author][] = array(
                'label' => $label,
                'count' => $post->post_count,
                'type' => $post->post_type,
                );
        }
    }
    return $counts;
}

10

내가 질문을 이해 했다고 가정하면 관리자가 관리하는 페이지의 열 헤더 및 열 값과 관련된 두 가지 후크에 연결해야합니다. 그들은이다 'manage_{$type}_columns''manage_{$type}_custom_column'어디에서 사용 사례가 {$type}있다 users.

'manage_users_columns'후크

첫 번째는 간단하며 열 머리글을 지정하여 사용 가능한 열을 지정할 수 있습니다. WordPress는 "게시물" 열의 값을 하드 코딩 하므로,이를 변경하기 때문에이를 제거하고 unset()제목이 같은 새 열을 추가하지만 식별자는 'custom_posts'다음 과 같습니다.

add_action('manage_users_columns','yoursite_manage_users_columns');
function yoursite_manage_users_columns($column_headers) {
  unset($column_headers['posts']);
  $column_headers['custom_posts'] = 'Posts';
  return $column_headers;
}

'manage_users_custom_column'후크

다음 'manage_users_custom_column'으로 비표준 열에 대해서만 호출되는 후크 를 사용해야합니다 . 우리 $column_name=='custom_posts'는 미래에 새로운 사용자 열을 추가 할 경우를 대비하여 코드를 강력하게 만들기 위해 테스트 한 다음 다음에 설명 할 함수에서 사용자 게시물 유형 수를 가져옵니다 _yoursite_get_author_post_type_counts(). 나는 다음이를 포맷 할 수있는 몇 가지 방법으로 연주하지만, HTML 결정 <table>에 가장 적합한이었다 (그 이후 데이터 테이블) . 테이블이 작동하지 않으면 다른 마크 업을 매우 쉽게 생성 할 수 있다고 가정합니다.

add_action('manage_users_custom_column','yoursite_manage_users_custom_column',10,3);
function yoursite_manage_users_custom_column($custom_column,$column_name,$user_id) {
  if ($column_name=='custom_posts') {
    $counts = _yoursite_get_author_post_type_counts();
    $custom_column = array();
    if (isset($counts[$user_id]) && is_array($counts[$user_id]))
      foreach($counts[$user_id] as $count)
        $custom_column[] = "\t<tr><th>{$count['label']}</th>" .
                                 "<td>{$count['count']}</td></tr>";
    $custom_column = implode("\n",$custom_column);
  }
  if (empty($custom_column)) 
    $custom_column = "No Posts!";
  else 
    $custom_column = "<table>\n{$custom_column}\n</table>";
  return $custom_column;
}

각 사용자 / 저자에 대한 게시물 유형별 게시물 수 얻기

마지막으로 저자 / 사용자가 게시물 유형별로 게시물 수를 검색합니다. 일반적으로 내가 사용을 고수하려고 WP_Query()게시물에 대한 쿼리를 실행할 때하지만이 쿼리는 단지로 쉽게 듯 다른 많은 후크를 사용하여 필요한 것 "장난 꾸러기" 하나에 모든 작업을 수행 할 수 있습니다.

나는 어떤 포스트 생략 $post->post_typeIS 'revision'또는 'nav_menu_item'만에 왼쪽 'attachments'. 내가 한 몇 가지를 제외하는 대신 원하는 게시물 유형을 명시 적으로 포함하는 것이 좋습니다.

나는 또한 필터링 $post->post_status만 해당 'publish'하고 'pending'. 당신은 또한 포함 할 경우 'future', 'private'및 / 또는 'draft'당신은 코드의 변경 사항을 확인해야합니다.

각 페이지로드 마다이 _yoursite_get_author_post_type_counts()함수를 한 번만 호출 한 다음 각 사용자를 호출하지 않고 정적 변수에 저장하십시오. 요소에 Post Type 이름이있는 배열을 포함하는 작성자 / 사용자 ID로 색인 된 배열에 저장하고 'label'물론 동일한 이름의 요소에 카운트를 저장합니다.

function _yoursite_get_author_post_type_counts() {
  static $counts;
  if (!isset($counts)) {
    global $wpdb;
    global $wp_post_types;
    $sql = <<<SQL
SELECT
  post_type,
  post_author,
  COUNT(*) AS post_count
FROM
  {$wpdb->posts}
WHERE 1=1
  AND post_type NOT IN ('revision','nav_menu_item')
  AND post_status IN ('publish','pending')
GROUP BY
  post_type,
  post_author
SQL;
    $posts = $wpdb->get_results($sql);
    foreach($posts as $post) {
      $post_type_object = $wp_post_types[$post_type = $post->post_type];
      if (!empty($post_type_object->label))
        $label = $post_type_object->label;
      else if (!empty($post_type_object->labels->name))
        $label = $post_type_object->labels->name;
      else
        $label = ucfirst(str_replace(array('-','_'),' ',$post_type));
      if (!isset($counts[$post_author = $post->post_author]))
        $counts[$post_author] = array();
      $counts[$post_author][] = array(
        'label' => $label,
        'count' => $post->post_count,
        );
    }
  }
  return $counts;
}

결과 UI

그리고 이것은 WordPress 3.0.1의 테스트 설치에 적용된 것처럼 보입니다.


(출처 : mikeschinkel.com )

전체 코드 다운로드

Gist 에서 전체 코드를 다운로드 할 수 있습니다 .

이 코드를 테마의 functions.php파일 로 복사 하거나 플러그인에 파일을 포함시킬 수 있습니다.

도움이 되었기를 바랍니다!


글쎄, 그건 쉽다. 당신이해야 할 일은 $ type = users 인 'manage _ {$ type} _columns'와 'manage _ {$ type} _custom_column'을 사용하는 것뿐입니다. 나머지는 여기서 알아낼 수있었습니다. 느낌이 들었지만 확인했지만 사용자를 보지 못했습니다. 나머지는 충분히 쉽다. 많은 노력을 기울여 주셔서 감사합니다. WPHonors에서 이미 투표하고 있습니다. goo.gl/CrSi 감사합니다 alot : D
jaredwilli

1
@jaredwilli- 물론입니다. 그러나 워드 프레스 답변의 목표는 첫 번째 사람을 넘어서는 사람들에게 답변을 제공하는 것입니다. 그렇기 때문에 다른 사람들이 접근하는 데 완전히 새로운 정보가 필요할 수도 있지만 심도있게 작성하는 이유입니다. 둘 다 도와 주려고 아, 그리고 사이트에 대한 좋은 의견에 감사드립니다 (그리고 그 사진을 바꿀 수 있을까요? :)
MikeSchinkel

그렇기 때문에 내가 필요한 후크를 알려주는 것을 막지 않았습니다. 나는 이것을 필요로하는 유일한 사람이 아니므로 모두 좋다는 것을 안다.
jaredwilli

아 죄송합니다. 물론입니다. 나는 상점 사이트 임 빌딩에 대한 맞춤형 포스트 유형 임 만들기에 혼란을 느꼈다. 게시물 수를 작성자의 게시물을 보여주는 edit.php 페이지에 연결하는 방법을 알아 낸 것으로 생각하지 않습니까? 아마 내 CPT Im 추측에 그것을 구축해야합니다.
jaredwilli

@jaredwilli-아, 그렇습니다. 그러나 @somatic처럼 보였습니다.
MikeSchinkel

2

다음은 sorich87의 대답이 변형되어 작동하지 못하고 여러 유형을 자동으로 지원하고 싶었습니다.

function my_manage_users_custom_column($output = '', $column, $user_id) {
    global $wpdb;
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = '$column' AND post_author = $user_id");
    return '<a href="' . admin_url("edit.php?post_type=$column&author=$user_id") . '">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    // create columns for each type, make sure to use the post_type slug
    $columns['animals'] = 'Animals Count';
    $columns['plants'] = 'Plants Count';
    $columns['insects'] = 'Insect Count';
    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

나는 get_posts_by_author_sql()WHERE 문을 구성하는 방법과 방법을 읽었 지만 결과는 항상 "1 = 0"이었습니다. 그래서 방금 SQL 유형의 나머지 부분 get_posts_by_author_sql()을 작성했습니다. 포스트 유형과 저자의 두 비트 만 작성하면됩니다 .

"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'your_custom_type' AND post_author = $user_id"

이것은 잘 작동하고 원하는만큼 많은 열을 추가하지만 각각의 열은 수평 공간을 사용하는 반면 Mike의 자습서는 사용자 정의 게시물 유형에 대한 단일 열을 추가 한 다음 해당 행 내의 테이블로 나열합니다. 동일한 정보, 다른 시각화. Mike는 압축 된 세로 목록을 작성하고 비어 있지 않은 경우에만 카운트 항목을 표시하므로 대량의 유형에 더 적합 할 수 있지만 sorich87의 방법은 가로 기둥 공간이 너무 많기 때문에 소량에 적합합니다.

예를 들어 현재 모든 게시물을 반환하는 것처럼 게시 된 항목 만 반환하도록 쿼리에 "post_status = publish"를 추가 할 수 있습니다.


큰! get_posts_by_author_sql( $column, true, $user_id );where 문을 구성해야합니다.
sorich87

1

다음이 추가됩니다.

function my_manage_users_custom_column($output = '', $column_name, $user_id) {
    global $wpdb;

    if( $column_name !== 'post_type_count' )
        return;

    $where = get_posts_by_author_sql( 'post_type', true, $user_id );
    $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts $where" );

    return '<a href="' . admin_url("edit.php?post_type=post_type&author=$user_id") . '" title="Post Type Count">' . $result . '</a>';
}
add_filter('manage_users_custom_column', 'my_manage_users_custom_column', 10, 3);

function my_manage_users_columns($columns) {
    $columns['post_type_count'] = __( 'Post Type', 'textdomain' );

    return $columns;
}
add_filter('manage_users_columns', 'my_manage_users_columns');

@ sorich87 - get_posts_by_author_sql()응? 저에게는 새로운 것이 있습니다. 감사! 그러나 방금 코드를 확인했지만 그가 기대하는대로하지 않는다고 생각합니다. 귀하의 get_posts_by_author_sql()전화는 항상 '1=0'를 반환 하고, 사용자의 게시물 유형별로 카운트 목록을 얻으려고했습니다. 내가이 코드를 오해하지 않는 한 그렇게하지 않습니다. 어쩌면 고칠 수 있습니까?
MikeSchinkel

네, 그 질문을 오해했습니다. 내 코드는 하나의 맞춤 게시물 유형에 대해 하나의 열만 추가합니다. 그냥 교체 post_type후 형의 이름으로. 예 : get_posts_by_author_sql( 'book', true, $user_id );'book'이라는 게시물 유형의 경우 테스트되었으며 작동합니다.
sorich87

PS : 또한 WPHonors에서 투표했습니다. 당신은 확실히 가치가 있습니다!
sorich87

아직 테스트하지는 않았지만 작동하는 것처럼 보이지만 찾고있는 모든 기능이 없을 수도 있지만 여전히 쉽게 추가 할 수 있습니다. 감사합니다 :)
jaredwilli

@ sorich87-굉장합니다!
MikeSchinkel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.