Показ сообщения пользователя рассчитывает пользовательским типом сообщения в списке пользователей администратора?

Я пытаюсь выяснить, как сцепиться в /wp-admin/users.php управляйте страницей для создания пользовательских столбцов для показа, что число пользователей сообщений имеет для пользовательских типов сообщения на WPHonors.com.

Я создал trac тикет для этого, но @nacin объяснил, почему это - задание больше для плагина, чтобы сделать вместо этого.

Я не мог найти способ управлять выводом пользовательской таблицы, таким образом, я могу добавить пользовательские столбцы для счетов сообщения CPTs для каждого пользователя. И это может иметь некоторое отношение к вопросу @nacin спрошенный, что было бы числа количества сообщения связываться с. Для текущего 'сообщения' рассчитывает сообщение, пользователь имеет, оно связывается с сообщением, управляют страницей, показывая все сообщения для того пользователя (/wp-admin/edit.php?author=%author_id%).

Если бы я должен был связать его где-нибудь, то это было бы к:

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

Если это было даже так или иначе возможно, я предполагаю. Но я не должен даже обязательно связывать его с нигде. Я главным образом хочу просто показать счета сообщения CPT для каждого человека, имея 600 пользователи и объединенное общее количество 300+ сообщения через 4 пользовательские типы сообщения. Администраторы - только один, кто может отправить 'post' сообщения, так, чтобы столбец на странице пользователя был бесполезен.

9
24.10.2010, 09:24
4 ответа

Вот расширение учебного ответа Mike's. Я добавил ссылки к типам, перечисленным, таким образом, можно нажать один и быть взяты право на список всех сообщений в том типе для того автора, который потребовал дополнительной переменной для $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
19.02.2020, 22:01

При принятии я понял вопрос, что необходимо сделать, сцепиться в два рычага, связанные со значением заголовков столбцов и столбцов для администратора, управляют страницами. Они 'manage_{$type}_columns' и 'manage_{$type}_custom_column' где в Вашем примере использования {$type} users.

'manage_users_columns' рычаг

Этот первый прост, он позволяет Вам указать заголовки столбцов и следовательно доступные столбцы. WordPress hardcodes значение столбца "Posts" поэтому, так как Вы хотите изменить его, мы просто собираемся удалить его с 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_type 'revision' или 'nav_menu_item' но оставленный внутри 'attachments'. Вы могли бы найти, что он лучше явно включал типы сообщения, которые Вы хотите вместо исключения некоторых, я сделал.

Я также фильтрованный $post->post_status для только 'publish' и 'pending'. Если Вы хотите также включать 'future', 'private' и/или 'draft' необходимо будет внести изменения в коде.

Поскольку каждая страница загружается, я только называю это _yoursite_get_author_post_type_counts() функционируйте однажды и затем сохраните в статическую переменную, а не позовите каждого пользователя. Я храню в массиве, индексированном автором/идентификаторами пользователей, содержащим массив с Именем типа Сообщения в элементе '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)

Загрузите полный код

Можно загрузить полный код с Сути:

Можно скопировать этот код в тему functions.php файл или хранилище включают файл в плагин, какой бы ни Вы выбираете.

Надеюсь, это поможет!

10
19.02.2020, 22:01
  • 1
    Ну, это легко. Все, что необходимо было сделать, было, говорят, что это использует 'manage_ {$type} _columns' и 'manage_ {$type} _custom_column', где $type = пользователи, и я, возможно, выяснил остальных оттуда. У меня было чувство, что это сделало, но я проверил его и не видел пользователей. Остальное достаточно легко. Я ценю обширное усилие, Вы помещаете в него tho, и я буду голосовать за Вас на WPHonors наверняка (так как я уже имею), goo.gl/CrSi Большое спасибо :D –  jaredwilli 24.10.2010, 10:31
  • 2
    @jaredwilli - Да, конечно. Но цель Ответов WordPress состоит в том, чтобы предоставить ответы для людей далеко за пределами первого человека, который спрашивает. Вот почему я пишу всесторонний даже при том, что Вам, возможно, только понадобилось бы вдребезги информационных других, могло бы быть абсолютно в новинку для подхода. Попытка помочь обоим. О, и спасибо за хорошие комментарии к сайту (и шанс я мог изменить ту фотографию хотя? :) –  MikeSchinkel 24.10.2010, 10:46
  • 3
    Да вот почему, я не остановил Вас от просто сообщения мне рычаг, который я должен был использовать. Я знаю, что не буду единственным для нахождения потребности в этом так, это - вся польза. –  jaredwilli 24.10.2010, 10:48
  • 4
    , О, извините, конечно, я буду. Я был отвлечен пользовательским типом сообщения, который я делаю для сайта магазина, который я создаю. Я не предполагаю, что Вы выяснили способ связать количества сообщения с edit.php страницей, показывающей сообщения для авторов их? Вероятно, потребность встроить это в мой CPT я предполагаю. –  jaredwilli 24.10.2010, 12:22
  • 5
    @jaredwilli - А-ч, да, но похож на @somatic, сделал это для Вас, правильно? –  MikeSchinkel 24.10.2010, 21:24

Следующее является вариацией на ответ 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() и как это, как предполагается, создает, ГДЕ оператор для Вас, но результаты я добрался, всегда был "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's добавит отдельный столбец для пользовательских типов сообщения и затем перечислит их как таблицу в той строке. Та же информация, другая визуализация. Mike's, вероятно, лучше для большого объема типов, поскольку это создает сжатый вертикальный список (и только отображает объект количества, если не пустой), в то время как метод sorich87 хорош для меньших количеств, как существует только так много горизонтальной доступной комнаты столбца.

Не забывайте, что можно добавить "post_status=publish" к запросу, чтобы только возвратить опубликованные объекты, поскольку пример в настоящее время возвращает все сообщения...

2
19.02.2020, 22:01
  • 1
    Здорово! get_posts_by_author_sql( $column, true, $user_id ); должен создать где оператор. –  sorich87 24.10.2010, 22:01

Следующее добавит его:

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');
1
19.02.2020, 22:01
  • 1
    @sorich87 - get_posts_by_author_sql() а? Тот плохо мне знаком;спасибо! но я просто проверил Ваш код, и я не думаю, что он делает то, что он ожидает. Ваш get_posts_by_author_sql() вызов всегда возвращается '1=0', и он хотел получить список количеств типом сообщения для пользователя; если я не неправильно понимаю этот код, не делает этого. Возможно, можно ли зафиксировать его? –  MikeSchinkel 24.10.2010, 10:57
  • 2
    имени Да, я неправильно понял вопрос. Мой код только добавит один столбец для одного пользовательского типа сообщения. Просто замена post_type именем типа сообщения. Например: get_posts_by_author_sql( 'book', true, $user_id ); для сообщения тип назвал 'книгу'. Протестированный и это работает. –  sorich87 24.10.2010, 11:45
  • 3
    P.S.: Также проголосовавший за Вас на WPHonors. Вы определенно заслуживаете его! –  sorich87 24.10.2010, 11:51
  • 4
    я должен все же проверить это, но он похож на него, работал бы, просто не мог бы иметь всей функциональности, которую я ищу, но это легко добавить все еще. Спасибо :) –  jaredwilli 24.10.2010, 12:24
  • 5
    @sorich87 - Потрясающий! –  MikeSchinkel 24.10.2010, 21:27

Теги

Похожие вопросы