Поместите всплывающее уведомление об обновлении в несколько меню CPT для ожидающих элементов

9

Подобно тому, как пункты меню «Плагины» или «Комментарии» содержат эти числовые уведомления в пузыре для обновлений и немодерируемых комментариев соответственно, я хотел бы использовать этот пузырь для отображения количества CPT, которые имеют статус «Ожидает проверки». Как это сделать?

Я нашел эту тему , но не совсем уверен, куда идти дальше.

Это было бы здорово иметь; так как мне нужна эта функция на сайте, который использует пользовательский контент (пользовательские типы сообщений). Всякий раз, когда пользователи отправляют новый CPT, его статус устанавливается на «Ожидание просмотра», и я хочу, чтобы администраторы сайта быстро заглянули в меню, чтобы увидеть, сколько элементов требует их внимания.

РЕДАКТИРОВАТЬ: У меня сейчас есть этот код:

// buuble notifications for custom posts with status pending
add_action( 'admin_menu', 'add_pending_bubble' );

function add_pending_bubble() {
    global $menu;

    $custom_post_count = wp_count_posts('custom-post-name');
    $custom_post_pending_count = $custom_post_count->pending;

    if ( $custom_post_pending_count ) {
        foreach ( $menu as $key => $value ) {
            if ( $menu[$key][2] == 'edit.php?post_type=custom-post-name' ) {
                $menu[$key][0] .= ' <span class="update-plugins count-' . $custom_post_pending_count . '"><span class="plugin-count">' . $custom_post_pending_count . '</span></span>';
                return;
            }
        }
    }
}

... который работает, хотя и немного противоречиво. Иногда отображается, иногда нет. Кроме того, если у меня есть несколько CPT, как я могу применить этот код для каждого пункта меню этих CPT? Приведенный выше код будет работать только с одним CPT.

Hassan
источник
Ответ в вашей ссылке объясняет это довольно хорошо: вместо этого вы должны хранить отложенные элементы в переходном процессе для вашего случая, какой код у вас есть?
Wyck
Проверьте этот другой тоже. Но, да, пожалуйста, попробуйте поэкспериментировать с кодом и опубликовать собственное расследование здесь;)
brasofilo
@Wyck Я обновил свой вопрос.
Хасан

Ответы:

12

Я сделал эту работу, перебирая список типов записей и определяя правильный $menuключ для типа записей, используя вторичную функцию (вместо ручной итерации по $menuобъекту).

ожидающие сообщения пузыри

Ссылка на функцию: get_post_typesи wp_count_posts.

add_action( 'admin_menu', 'pending_posts_bubble_wpse_89028', 999 );

function pending_posts_bubble_wpse_89028() 
{
    global $menu;

    // Get all post types and remove Attachments from the list
    // Add '_builtin' => false to exclude Posts and Pages
    $args = array( 'public' => true ); 
    $post_types = get_post_types( $args );
    unset( $post_types['attachment'] );

    foreach( $post_types as $pt )
    {
        // Count posts
        $cpt_count = wp_count_posts( $pt );

        if ( $cpt_count->pending ) 
        {
            // Menu link suffix, Post is different from the rest
            $suffix = ( 'post' == $pt ) ? '' : "?post_type=$pt";

            // Locate the key of 
            $key = recursive_array_search_php_91365( "edit.php$suffix", $menu );

            // Not found, just in case 
            if( !$key )
                return;

            // Modify menu item
            $menu[$key][0] .= sprintf(
                '<span class="update-plugins count-%1$s" style="background-color:white;color:black"><span class="plugin-count">%1$s</span></span>',
                $cpt_count->pending 
            );
        }
    }
}

// http://www.php.net/manual/en/function.array-search.php#91365
function recursive_array_search_php_91365( $needle, $haystack ) 
{
    foreach( $haystack as $key => $value ) 
    {
        $current_key = $key;
        if( 
            $needle === $value 
            OR ( 
                is_array( $value )
                && recursive_array_search_php_91365( $needle, $value ) !== false 
            )
        ) 
        {
            return $current_key;
        }
    }
    return false;
}
brasofilo
источник
О да, это работает! По какой-то причине пузырьки исчезают, когда я нажимаю на соответствующий пункт меню CPT, но они появляются снова, когда я нахожусь в других областях в wp-admin. Не буду беспокоиться об этом, проблема решена.
Хасан
В моей тестовой среде пузырьки не исчезают, забавная ошибка, которая у вас есть ... Мне нравится эта вещь :), и она будет заключена в плагин с настройками для выбора типов сообщений и статуса.
brasofilo
Я подозреваю, что это из-за WPML. Я использую его для управления двуязычным веб-сайтом, и у меня есть по существу 2 версии каждого поста (cpt) Вот почему я иногда вижу пузырь с надписью 2, где на самом деле есть 1 ожидающий пост; потому что оба сообщения синхронизируют свои статусы. Эй, дайте мне знать о плагине, когда вы закончите: D
Хасан