Відображення кількості поштових повідомлень користувача за типом користувальницької пошти у списку користувачів адміністратора?


9

Я намагаюся розібратися, як підключити /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'публікації, тому колонка на сторінці користувача є марною.

Відповіді:


10

Ось розширення відповіді підручника Майка. Я додав посилання на перелічені типи, щоб ви могли натиснути на одне і перейти право до списку всіх публікацій цього типу для цього автора, для чого потрібна додаткова змінна для $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()функцію лише один раз, а потім зберігаю в статичну змінну, а не дзвінок для кожного користувача. Я зберігаю в масиві, індексованому ідентифікаторами автора / користувача, що містить масив з іменем Type Post в елементі, '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файл вашої теми або зберегти, включивши його у плагін, залежно від того, що ви оберете.

Сподіваюся, це допомагає!


Ну, це просто. Все, що вам потрібно було зробити, - це сказати, що він використовує 'управляти _ {$ тип} _колонці' та 'керувати _ {$ тип} _custom_column', де $ type = користувачі, і я міг зрозуміти решту звідти. У мене було таке відчуття, але я перевірив це і не бачив користувачів. Решта досить легко. Я вдячний за великі зусилля, які ви доклали до цього, і я точно буду голосувати за вас на WPHonors (оскільки я вже маю) goo.gl/CrSi Дякую: Д
jaredwilli

1
@jaredwilli - Так, звичайно. Але мета WordPress відповідей - надати відповіді людям, що значно перевищують першого, хто запитує. Ось чому я пишу поглиблено, хоча вам можуть знадобитися лише шматочки інформації, які інші можуть бути абсолютно новими у підході. Намагаються допомогти обом. О, і дякую за приємні коментарі на сайті (і, можливо, я міг би змінити цю фотографію? :)
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"

Це працює так само добре і додасть стільки стовпців, скільки ви хочете, але кожен використовує горизонтальний простір, тоді як підручник Майка додасть один стовпець для спеціальних типів публікацій, а потім перерахує їх як таблицю в цьому рядку. Одна і та ж інформація, різна візуалізація. Майк, мабуть, кращий для великої кількості типів, оскільки він створює стислий вертикальний список (і відображає лише лічильний елемент, якщо він не порожній), тоді як метод sorich87 хороший для менших кількостей, оскільки є лише стільки горизонтальної кімнати стовпців.

Не забувайте, що ви можете додати до запиту "post_status = опублікувати", щоб повернути лише опубліковані елементи, як приклад наразі повертає всі повідомлення ...


Чудово! get_posts_by_author_sql( $column, true, $user_id );повинен побудувати оператор, де.
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 );Для типу публікації під назвою "книга". Випробуваний і він працює.
sorich87

PS: Також голосували за вас на WPHonors. Ви точно це заслуговуєте!
sorich87

Я ще не повинен це перевірити, але, схоже, це буде працювати, просто не може бути вся функціональність, яку я шукаю, але це легко додати ще. Дякую :)
jaredwilli

@ sorich87 - Дивовижно!
MikeSchinkel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.