Обновить количество сообщений (опубликовано, черновик, неприсоединено) в интерфейсе администратора

8

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

add_filter('pre_get_posts', 'current_author_posts');

function current_author_posts($query) {

    if ($query->is_admin && current_user_can('artist')) {
        global $user_ID;
        $query->set('author', $user_ID);
    }

    return $query;
}

Это хорошо работает в интерфейсе администратора, но все сообщения отображаются неправильно:

изображение, которое показывает неправильное количество сообщений в WordPress

Известны ли вам какие-либо фильтры или зацепки, чтобы манипулировать этими цифрами и быть корректными для постов, страниц, носителей и пользовательских типов постов?

Большое спасибо.

Скотт
источник
wp_count_posts фильтр
Морт 1305

Ответы:

8

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


Во-первых, я думаю, стоит отметить, как я нашел фильтр:
apply_filters( 'views_' . $screen->id, $views )

  • осмотреть элемент
    subsubsub

  • сделать глобальный поиск в /wp-adminи /wp-includesдля sububsub (смешное имя класса, кстати) ...

  • и вот оно: /wp-admin/includes/class-wp-list-table.php

foreach( array( 'edit-post', 'edit-page', 'edit-movie', 'upload' ) as $hook )
    add_filter( "views_$hook" , 'wpse_30331_custom_view_count', 10, 1);

function wpse_30331_custom_view_count( $views ) 
{
    global $current_screen;
    switch( $current_screen->id ) 
    {
        case 'edit-post':
            $views = wpse_30331_manipulate_views( 'post', $views );
            break;
        case 'edit-page':
            $views = wpse_30331_manipulate_views( 'page', $views );
            break;
        case 'edit-movie':
            $views = wpse_30331_manipulate_views( 'movie', $views );
            break;
        case 'upload':
            $views = wpse_30331_manipulate_views( 'attachment', $views );
            break;
    }
    return $views;
}

function wpse_30331_manipulate_views( $what, $views )
{
    global $user_ID, $wpdb;

    /*
     * This is not working for me, 'artist' and 'administrator' are passing this condition (?)
     */
    if ( !current_user_can('artist') ) 
        return $views;

    /*
     * This needs refining, and maybe a better method
     * e.g. Attachments have completely different counts 
     */
    $total = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE (post_status = 'publish' OR post_status = 'draft' OR post_status = 'pending') AND (post_author = '$user_ID'  AND post_type = '$what' ) ");
    $publish = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'publish' AND post_author = '$user_ID' AND post_type = '$what' ");
    $draft = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = '$user_ID' AND post_type = '$what' ");
    $pending = $wpdb->get_var("SELECT COUNT(*) FROM $wpdb->posts WHERE post_status = 'pending' AND post_author = '$user_ID' AND post_type = '$what' ");

    /*
     * Only tested with Posts/Pages
     * - there are moments where Draft and Pending shouldn't return any value
     */
    $views['all'] = preg_replace( '/\(.+\)/U', '('.$total.')', $views['all'] ); 
    $views['publish'] = preg_replace( '/\(.+\)/U', '('.$publish.')', $views['publish'] ); 
    $views['draft'] = preg_replace( '/\(.+\)/U', '('.$draft.')', $views['draft'] ); 
    $views['pending'] = preg_replace( '/\(.+\)/U', '('.$pending.')', $views['pending'] ); 

    // Debug info
    //echo 'Default counts: <pre>'.print_r($views,true).'</pre>';
    //echo '<hr><hr>';
    //echo 'Query for this screen of this post_type: <b>'.$what.'</b><pre>'.print_r($wp_query,true).'</pre>';

    return $views;
}
brasofilo
источник
1
Большое спасибо за это. Спас мою задницу. У меня есть вопрос: возможно ли полностью удалить меню, содержащееся в .subsubsub?
Мацей Гурбан
4

На момент написания этой функциональности теперь находится в классе WP_List_Table, в методе "views ()".

Фильтр теперь выглядит так:

$views = apply_filters( "views_{$this->screen->id}", $views );

$ views будет содержать массив каждого элемента списка:

[19-Feb-2016 11:43:44 UTC] Array
(
  [all] => <a href="link_to_view" class="current">Alle <span class="count">(1)</span></a>
  [trash] => <a href="link_to_view">Trash <span class="count">(94)</span></a>
  [confirmed] => <a href="link_to_view">Confirmed <span class="count">(1)</span></a>
)

Вы можете подключить его к обработчику current_screen с приоритетом> 10:

add_action( 'current_screen', function ( $current_screen ) {
        if ($current_screen->id === 'edit-my_page')
            add_filter( "views_{$current_screen->id}", 'list_table_views_filter' );
    }, 20);

function list_table_views_filter( array $view ) {
    error_log(print_r($view, true));
    return $view;
}

Затем вы можете добавить / изменить / удалить элементы в списке.

DarkNeuron
источник
0

Я знаю, что это старый пост, но я несколько раз перебирал его в поисках лучшего решения, поэтому я решил добавить кое-что в микс. До сегодняшнего дня я анализировал каждое отдельное число из строк, отфильтрованных по view_{$screen->id}. Но я только что узнал, что эти числа анализируются в строке 248 class-wp-posts-list-table.php . view_{$screen->id}Предполагается, что этот фильтр будет использоваться для добавления и удаления видов, а не для изменения чисел (глупо).

Функция, которая делает все вычисления чисел в круглых скобках строки представления wp_count_posts(). И он получил фильтр с тем же именем, который существовал с версии 3.7.0 (выпущен 24 октября 2013 года, через два года после того, как был задан этот вопрос).

Морт 1305
источник