jaredwilli
  • 0
Эксперт

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

  • 0

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

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

Мне не удалось найти способ манипулировать выводом таблицы пользователей, поэтому я могу добавить настраиваемые столбцы для количества сообщений 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' сообщения, поэтому этот столбец на странице пользователя бесполезен.

Share
  1. Вот расширение учебного ответа Майка. Я добавил ссылки на перечисленные типы, чтобы вы могли щелкнуть по одной из них и перейти прямо к списку всех сообщений этого типа для этого автора, что потребовало дополнительной переменной для $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;
    }
    
    • 0
  2. Предполагая, что я понял вопрос, вам нужно подключиться к двум крючкам, связанным с заголовками столбцов и значением столбцов для страниц управления администратором. Они есть '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() которой я расскажу далее. Затем я поэкспериментировал с несколькими способами форматирования, но решил, что <table> наиболее подходящим является HTML (поскольку это таблица данных). Если таблица не работает для вас, я предполагаю, что вы сможете довольно легко создать другую разметку:

    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 is 'revision' или 'nav_menu_item' but оставил в '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;
    }
    

    Результирующий пользовательский интерфейс

    А вот как это выглядит применительно к моей тестовой установке WordPress 3.0.1:


    (источник: mikeschinkel.com )

    Скачать полный код

    Вы можете скачать полный код с Gist :

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

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

    • 0
  3. Ниже приведен вариант ответа 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"
    

    Это работает так же хорошо и добавит столько столбцов, сколько вы хотите, но каждый из них использует горизонтальное пространство, тогда как учебник Майка добавит один столбец для пользовательских типов сообщений, а затем перечислит их в виде таблицы в этой строке. Та же информация, другая визуализация. Метод Майка, вероятно, лучше подходит для большого количества типов, так как он создает сжатый вертикальный список (и отображает элемент счета только в том случае, если он не пуст), в то время как метод sorich87 хорош для меньшего количества, так как в горизонтальной колонке доступно только ограниченное пространство.

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

    • 0
  4. Следующее добавит его:

    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');
    
    • 0

Оставить ответ

You must login to add an answer.