Cập nhật số lượng bài đăng (đã xuất bản, dự thảo, không liên kết) trong giao diện quản trị


8

Tôi đang làm việc trên một thiết lập WordPress nhiều người dùng và đã làm cho nó để một loại người dùng cụ thể chỉ có thể nhìn thấy và tương tác với các bài đăng, hình ảnh, trang vv mà họ đã tạo ra. Mã để thực hiện điều này xảy ra trông như thế này:

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

Điều này hoạt động tốt trong giao diện quản trị nhưng để tất cả số lượng bài đăng hiển thị không chính xác:

hình ảnh hiển thị số lượng bài đăng không chính xác trong WordPress

Bạn có biết bất kỳ bộ lọc hoặc móc để thao tác các số liệu này và chính xác trên các bài đăng, trang, phương tiện và các loại bài đăng tùy chỉnh không?

Cảm ơn nhiều.

Câu trả lời:


7

Tôi đã làm điều này gần như hoạt động, nhưng các sàng lọc là cần thiết để phù hợp với các chi tiết cụ thể của câu hỏi và để xử lý các Tệp đính kèm và Loại bài khác nhau (xem các nhận xét trong mã) ...


Đầu tiên, tôi nghĩ rằng đáng chú ý làm thế nào tôi tìm thấy bộ lọc:
apply_filters( 'views_' . $screen->id, $views )

  • kiểm tra nguyên tố
    sinh con

  • thực hiện tìm kiếm toàn cầu trong /wp-admin/wp-includescho chương trình con (tên lớp vui nhộn, btw) ...

  • và đây là: /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;
}

Cảm ơn rất nhiều cho cái này. Cứu cái mông của tôi. Tôi có một câu hỏi mặc dù: có thể loại bỏ hoàn toàn menu có trong .sububub không?
Maciej Gurban

3

Khi viết, chức năng này hiện nằm trong lớp WP_List_Table, trong phương thức "view ()".

Bộ lọc bây giờ trông như thế này:

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

$ lượt xem sẽ chứa một mảng của từng thành phần danh sách:

[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>
)

Bạn có thể kết nối nó tại hook current_screen với mức độ ưu tiên> 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;
}

Sau đó, bạn có thể thêm / thay đổi / xóa theo các thành phần trong danh sách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.