問題描述

我正在開發一個 multi-user 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;
}

這在管理界面中工作得很好,但是所有的帖子計數都顯示不正確:

您是否知道任何過濾器或鈎子來操縱這些數字,並且在帖子,頁面,媒體和自定義帖子類型之間是否正確?

非常感謝。

最佳解決方案

我得到這幾乎工作,但需要改進以適應問題的細節,並處理附件和 Post-Types 不同 (見代碼中的註釋)…


首先,我認為值得注意的是我如何找到過濾器:apply_filters( 'views_' . $screen->id, $views )

  • 檢查元素

  • /wp-admin/wp-includes 中進行全局搜索,用於 subsubsub(有趣的類名稱,btw)…

  • 這裏是:/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;
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。