CODYSHOP
темы и плагины для WordpressРазрабатывая плагин интернет-магазина для WordPress, одна из задач, которою нужно было решить – добавить записи произвольного типа и подсчитать их количество. Задача вполне тривиальная. Но в дополнение к этому нужно было вывести количество записей в меню админки.
Сразу же поясню, в каких ситуациях данное решение может сильно пригодиться. Например, мы создаём записи произвольного типа с возможностью их добавления минуя админку (по такому принципу создаются, к примеру, сайты объявлений или сайты с коллективным наполнением). Пользователь добавляет новую запись, а администратор их модерирует.
Было бы очень удобно, если заходя в админку, администратор сразу же видел о добавленных пользователями записях (кастомных комментариях, заказах, письмах и т.д.) и их количестве. На решении этой задачи и сосредоточимся. В результате поисков, нашлось два способа.
Способ 1: вывод количества через переменную
Этот способ я подсмотрел в одном плагине. Сразу хочется упомянуть минус этого способа – мы не сможем обернуть выводимое число в HTML теги, а значит не сможем красиво оформить. Итак, когда вы создали запись произвольного типа, ваш код выглядит примерно следующим образом:
add_action( 'init', 'true_register_post_type_init' ); function true_register_post_type_init() { // считаем количество записей произвольного типа через get_posts $count = get_posts('post_type=portfolio&status=publish&numberposts=-1'); $newtypepostcount = count($count); $labels = array( 'name' => __( 'New type posts', 'theme_name' ), 'singular_name' => __( 'New type post', 'theme_name' ), 'menu_name' => __( 'New type posts' . $newtypepostcount, 'theme_name' ), 'all_items' => __( 'All new type posts', 'theme_name' ), 'view_item' => __( 'View new type posts', 'theme_name' ), 'add_new_item' => __( 'Add new type posts', 'theme_name' ), 'add_new' => __( 'New type post', 'theme_name' ), 'edit_item' => __( 'Edit new type post', 'theme_name' ), 'update_item' => __( 'Update new type post', 'theme_name' ), 'search_items' => __( 'Search new type post', 'theme_name' ), 'not_found' => __( 'No new type post found', 'theme_name' ), 'not_found_in_trash' => __( 'No new type post found in Trash', 'theme_name' ), ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'menu_icon' => 'dashicons-megaphone', 'menu_position' => 20, 'supports' => array( 'title', 'editor', 'comments', 'author', 'thumbnail') ); register_post_type('type_name', $args); }
Обратите внимание на пункт menu_name. Именно он отвечает за вывод надписи в боковом меню. В нашем коде newtypepostcount – переменная которая выводит число в меню админки. А type_name – это название вашего типа записей, theme_name – имя вашей темы или плагина, необходимо для локализации.
Кроме того, обратите внимание, что во время подсчета параметру numberposts мы задали значение “-1”. Если мы не уберем ограничения вывода, то get_posts ограничивается выводом 5 записями.
Способ 2: вывод с помощью javascript
Лично мне не очень нравится первый способ из-за отсутствия гибкости. Например, я не смогу оформить вывод результатов подсчета. Мне больше по душе второй способ, так как мы сможем завернуть число в html теги и достойно стилизовать.
Воспользуемся js. Наш скрипт должен размещаться после html блока, куда мы хотим вывести результаты подсчета. Воспользуемся функцией admin_footer_text для добавления скрипта в подвал админки:
function new_type_post_count() { $count = get_posts('post_type=type_name&status=publish&numberposts=-1'); $newtypepostcount = count($count); print '<script type="text/javascript"> postcount="<span>' . $newtypepostcount . '</span>"; if (postcount == "<span>0</span>" ) { document.getElementsByClassName("menu-icon-type_name")[0].getElementsByClassName("wp-menu-name")[0].innerHTML = "New type posts"; } else { document.getElementsByClassName("menu-icon-type_name")[0].getElementsByClassName("wp-menu-name")[0].innerHTML = "New type posts " + postcount; } </script>'; } add_action('admin_footer_text', 'new_type_post_count');
Здесь код нуждается в небольших пояснениях. В строке 2 замените type_name на название вашей произвольной записи. В строках 6 и 9 замените родительский стиль menu-icon-type_name на свой. Например, он может принять вид: menu-icon-portfolio.
Ну и финальный аккорд, добавляем css стили, чтобы вывод количества записей красиво вписывался в общую админку WordPress. В итоге весь код будет выглядеть следующим образом:
/* Считаем количество необработанных заказов*/ function new_type_post_count() { $count = get_posts('post_type=type_name&status=publish&numberposts=-1'); $newtypepostcount = count($count); print '<script type="text/javascript"> postcount="<span>' . $newtypepostcount . '</span>"; if (postcount == "<span>0</span>" ) { document.getElementsByClassName("menu-icon-type_name")[0].getElementsByClassName("wp-menu-name")[0].innerHTML = "New type posts"; } else { document.getElementsByClassName("menu-icon-type_name")[0].getElementsByClassName("wp-menu-name")[0].innerHTML = "New type posts " + postcount; } </script>'; <style> .menu-icon-type_name span{ color: #fff; background-color: #d54e21; font-size: 9px; line-height: 17px; font-weight: 600; vertical-align: top; -webkit-border-radius: 10px; border-radius: 10px; padding: 2px 6px; } </style>'; } add_action('admin_footer_text', 'new_type_post_count');
Если у вас есть более элегантное и гибкое решение, пишите в комментариях.