Изменение содержимого боковой панели администратора для отображения индикатора ожидающих публикаций
Я пытаюсь добавить счетчик ожидающих публикаций в боковую панель администратора, подобно тому, как отображается пузырек с количеством ожидающих комментариев:
В стороне: Я один думаю, что это должно быть стандартным поведением? Где можно предложить эту функцию?
В любом случае, я нашел этот плагин, но заметил, что он работает не всегда. Иногда индикатор появляется у "Страниц" или других элементов.
Код, который он использует для добавления счетчика, выглядит примерно так:
$menu[5][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
Очевидно, проблема в жестко заданном индексе 5. Как можно изменить код, чтобы он всегда указывал на "Записи"?
Буду рад закоммитить это изменение в плагин, если мы найдем решение.
Спасибо!

В качестве дополнения к ответу t31os, вот полный код (объединяющий содержимое упомянутого плагина с исправлением t31os), с изменениями для работы с пользовательскими типами записей:
add_filter( 'add_menu_classes', 'show_pending_number');
function show_pending_number( $menu ) {
$type = "animals";
$status = "pending";
$num_posts = wp_count_posts( $type, 'readable' );
$pending_count = 0;
if ( !empty($num_posts->$status) )
$pending_count = $num_posts->$status;
// Формируем строку для поиска в массиве $menu
if ($type == 'post') {
$menu_str = 'edit.php';
} else {
$menu_str = 'edit.php?post_type=' . $type;
}
// Перебираем элементы меню, ищем совпадение и добавляем индикатор
foreach( $menu as $menu_key => $menu_data ) {
if( $menu_str != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
}
return $menu;
}
Поместите этот код в файл functions.php, плагин не требуется.

Вау, спасибо. Я уже связался с создателем плагина, чтобы закоммитить эти изменения на случай, если кому-то понадобится такое поведение.
Так что, кто-нибудь знает, почему это не работает так по умолчанию?

Я даже не проверял плагин, спасибо, что продолжили. Код, который вы предоставили, представляет собой простую и удобную функцию, которую другие пользователи теперь могут скопировать, если хотят иметь такую функциональность... отличная работа... ;)

Вопрос: Разве функция не устанавливает переменную $type, делая условие if ($type == 'post') {
по сути бесполезным?

да, этот пример немного странный, так как я адаптировал его из случая, где я опрашиваю все типы записей в системе и пропускаю их через функцию (здесь мне пришлось просто объявить нужные переменные, чтобы пример работал самостоятельно). Смысл условия в том, чтобы построить правильный URL для всего, кроме основного типа записей...

@ign
Замени строку кода, которую ты разместил, на следующую..
foreach( $menu as $menu_key => $menu_data ) :
if( 'edit.php' != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
endforeach;
..это должно избавить от необходимости знать конкретный ключ.. (дай знать, если будут проблемы)..
Надеюсь, это поможет.. :)

Я внес небольшие изменения в код somatic, чтобы он работал с несколькими типами записей:
// Добавляем количество ожидающих записей для типов постов в меню админки
function show_pending_number($menu) {
$types = array("post", "page", "custom-post-type"); // Типы записей
$status = "pending"; // Статус "ожидает проверки"
foreach($types as $type) {
$num_posts = wp_count_posts($type, 'readable');
$pending_count = 0;
if (!empty($num_posts->$status)) $pending_count = $num_posts->$status;
if ($type == 'post') {
$menu_str = 'edit.php'; // URL для стандартных записей
} else {
$menu_str = 'edit.php?post_type=' . $type; // URL для произвольных типов записей
}
foreach( $menu as $menu_key => $menu_data ) {
if( $menu_str != $menu_data[2] )
continue;
$menu[$menu_key][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';
}
}
return $menu;
}
add_filter('add_menu_classes', 'show_pending_number');
