web-dev-qa-db-ja.com

ダッシュボード投稿の「すべての投稿、公開済み、およびゴミ箱」を無効にする(または削除する)方法

USERS私以外はAdministratorのAll、Published、Trashの各Webページを完全に削除する方法を探しています。

私の場合のシナリオは次のとおりです。ユーザーを登録しました(作成者、寄稿者などの役割で割り当てたい)。さて、彼らが私のウェブサイトにログインして投稿エリアにアクセスするとき、私は彼らがこれらの3つのリンクを見ないことを望みます(All、Published、Trash)。

基本的にdisplay:noneと同じjquery関数を使用してみましたが、これが最適な選択ではないと思います。私はこれを行うためのより良い方法があることを知っています。

私は、MemberやAdminimizeなどのプラグインを使ってみましたが、正しいプラグインが見つかりませんでした。

私を助けてくれる人がいることを願っています。前もって感謝します。

Remove All, Published, and Trash 

5
chest_nut

WP_Posts_List_TableクラスはWP_List_Tableを拡張したもので、WP_List_Table::views()メソッド内に次の動的viewsfilter)があります。

/**
 * Filter the list of available list table views.
 *
 * The dynamic portion of the hook name, `$this->screen->id`, refers
 * to the ID of the current screen, usually a string.
 *
 * @since 3.5.0
 *
 * @param array $views An array of available list table views.
 */
 $views = apply_filters( "views_{$this->screen->id}", $views );

そのため、生成されたviews_edit-postフィルタを使用して、投稿リストテーブル)の表示を調整できます。

例:

allpublishfuturestickyドラフト保留中and 管理者以外の場合は=_))を削除しましょう(PHP 5.4+):

/**
 * Remove the 'all', 'publish', 'future', 'sticky', 'draft', 'pending', 'trash' 
 * views for non-admins
 */
add_filter( 'views_edit-post', function( $views )
{
    if( current_user_can( 'manage_options' ) )
        return $views;

    $remove_views = [ 'all','publish','future','sticky','draft','pending','trash' ];

    foreach( (array) $remove_views as $view )
    {
        if( isset( $views[$view] ) )
            unset( $views[$view] );
    }
    return $views;
} );

必要に応じて$remove_viewsを変更できます。もう1つのアプローチは、mineのみ)を拾い上げて、その見解だけを返すことです。

それでは、mineビューをさらに強制することができます。

/**
 * Force the 'mine' view on the 'edit-post' screen
 */
add_action( 'pre_get_posts', function( \WP_Query $q )
{
    if( 
           is_admin() 
        && $q->is_main_query() 
        && 'edit-post' === get_current_screen()->id 
        && ! current_user_can( 'manage_options' )
    )
        $q->set( 'author', get_current_user_id() ); 
} );

前:

before 

後:

after 

5
birgire

これらのステータスはget_available_post_statuses()から引き出され、wp_count_posts()から値を取得します。

wp_count_posts()はその値をwp_count_postsフィルタを通して渡します。それであなたはそれを利用して、戻ってきたものをハイジャックすることができます。

これを試して:

function _dbdb_wp_count_posts( $counts, $type, $perm ) {
    global $pagenow;

    if( 'edit.php' !== $pagenow ){
        return $counts;
    }

    if( current_user_can( 'manage_options' ) ){
        return $counts;
    }

    $_counts = new stdClass();
    foreach ( $counts as $status => $count ){
        $_counts->$status = '';
    }

    return $_counts;
}
add_filter('wp_count_posts', '_dbdb_wp_count_posts', 99, 3 );

これが何をするかは、管理者のedit.phpページにいるかどうかをチェックし、そうでない場合は単にカウントを返すことです。

次に、現在のユーザーがサイトオプションを管理できるかどうかを確認します。管理者のみがサイトオプションを管理できます。現在のユーザーが可能であれば、すべてのカウントが返されます。

このチェックに合格した場合は、管理者ではないと見なされるため、すべてのカウントが0にリセットされ、ステータスリンクが事実上削除されます。

注: "all"および "mine"ステータスリンクは、WP_Posts_List_Tableクラスのget_views()メソッドにハードコードされており、フィルタリングできません。

最初に管理者としてサインインし、次に作成者としてサインインして、開発サーバーですぐにこれをテストしました。それは予想通りに動作しましたが、徹底的にテストするようにしてください。

1
darrinb