Подсчет количества записей произвольного типа на WordPress и вывод в админке

9800

Разрабатывая плагин интернет-магазина для 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');

Если у вас есть более элегантное и гибкое решение, пишите в комментариях.

Leave a Reply

B I PHP JS

Made with by CodyShop