Изменение содержимого боковой панели администратора для отображения индикатора ожидающих публикаций

11 нояб. 2010 г., 02:56:40
Просмотры: 4.2K
Голосов: 4

Я пытаюсь добавить счетчик ожидающих публикаций в боковую панель администратора, подобно тому, как отображается пузырек с количеством ожидающих комментариев:

Пузырек с количеством ожидающих комментариев

В стороне: Я один думаю, что это должно быть стандартным поведением? Где можно предложить эту функцию?

В любом случае, я нашел этот плагин, но заметил, что он работает не всегда. Иногда индикатор появляется у "Страниц" или других элементов.

Код, который он использует для добавления счетчика, выглядит примерно так:

$menu[5][0] .= " <span class='update-plugins count-$pending_count'><span class='plugin-count'>" . number_format_i18n($pending_count) . '</span></span>';

Очевидно, проблема в жестко заданном индексе 5. Как можно изменить код, чтобы он всегда указывал на "Записи"?

Буду рад закоммитить это изменение в плагин, если мы найдем решение.

Спасибо!

3
Комментарии

$menu[5] жестко закодирован как "Записи" в wp-admin/menu.php, по крайней мере в версии 3.0. Когда вы видите уведомление, появляющееся в другой области? Можете ли вы сузить конфигурацию, при которой это происходит?

goldenapples goldenapples
11 нояб. 2010 г. 06:17:54

Существует специальный фильтр для упорядочивания пунктов меню, некоторые плагины используют этот фильтр и перемещают элементы, что в результате приводит к тому, что 'posts' перестает быть ключом 5..

t31os t31os
11 нояб. 2010 г. 11:07:13

Для тех, кого интересует эта функция, я создал тикет в WP Trac. Похоже, что это запланировано в одном из будущих релизов :) - http://core.trac.wordpress.org/ticket/15406

Ignacio Ignacio
14 нояб. 2010 г. 23:09:03
Все ответы на вопрос 3
4

В качестве дополнения к ответу 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, плагин не требуется.

11 нояб. 2010 г. 19:08:01
Комментарии

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

Так что, кто-нибудь знает, почему это не работает так по умолчанию?

Ignacio Ignacio
11 нояб. 2010 г. 19:16:23

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

t31os t31os
13 нояб. 2010 г. 11:40:50

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

t31os t31os
20 нояб. 2010 г. 13:18:47

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

somatic somatic
22 нояб. 2010 г. 22:21:21
1

@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;

..это должно избавить от необходимости знать конкретный ключ.. (дай знать, если будут проблемы)..

Надеюсь, это поможет.. :)

11 нояб. 2010 г. 15:05:41
Комментарии

Пожалуйста... ;) И дополнительная благодарность Somatic за дополнительную информацию..

t31os t31os
13 нояб. 2010 г. 11:37:48
0

Я внес небольшие изменения в код 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');
5 июл. 2013 г. 15:36:13