Ocultar publicaciones de usuarios de administrador específicos

4

Actualmente estoy intentando modificar mi sitio de WordPress para que los autores no puedan ver las publicaciones de un administrador específico mientras editan, pero aún pueden ver las publicaciones de los demás (así como los demás administradores).

Con el siguiente código puedo hacerlo para que los Autores solo puedan ver sus propias publicaciones, y solo sus publicaciones se cuenten dentro del recuento de publicaciones.

¿Cómo puedo modificarlo para que solo oculte las publicaciones de un administrador específico y la cantidad de publicaciones?

add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
global $current_user;
  if( is_admin() && !current_user_can('edit_others_posts') ) {
      $wp_query->set( 'author', $current_user->ID );
      add_filter('views_edit-post', 'fix_post_counts');
  }
}

// Fix post counts
function fix_post_counts($views) {
    global $current_user, $wp_query;
    unset($views['mine']);
    $types = array(
        array( 'status' =>  NULL ),
        array( 'status' => 'publish' ),
        array( 'status' => 'draft' ),
        array( 'status' => 'pending' ),
        array( 'status' => 'trash' )
    );
    foreach( $types as $type ) {
        $query = array(
            'author'      => $current_user->ID,
            'post_type'   => 'post',
            'post_status' => $type['status']
        );
        $result = new WP_Query($query);
        if( $type['status'] == NULL ):
            $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
            $views['all'] = sprintf(__('<a href="%s"'. $class .'>All <span class="count">(%d)</span></a>', 'all'),
                admin_url('edit.php?post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'publish' ):
            $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
            $views['publish'] = sprintf(__('<a href="%s"'. $class .'>Published <span class="count">(%d)</span></a>', 'publish'),
                admin_url('edit.php?post_status=publish&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'draft' ):
            $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
            $views['draft'] = sprintf(__('<a href="%s"'. $class .'>Draft'. ((sizeof($result->posts) > 1) ? "s" : "") .' <span class="count">(%d)</span></a>', 'draft'),
                admin_url('edit.php?post_status=draft&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'pending' ):
            $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
            $views['pending'] = sprintf(__('<a href="%s"'. $class .'>Pending <span class="count">(%d)</span></a>', 'pending'),
                admin_url('edit.php?post_status=pending&post_type=post'),
                $result->found_posts);
        elseif( $type['status'] == 'trash' ):
            $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
            $views['trash'] = sprintf(__('<a href="%s"'. $class .'>Trash <span class="count">(%d)</span></a>', 'trash'),
                admin_url('edit.php?post_status=trash&post_type=post'),
                $result->found_posts);
        endif;
    }
    return $views;
}
    
pregunta bakingsoda 11.06.2016 - 04:25

1 respuesta

2

Intente esto: en lugar de rehacer todo el trabajo duro que WordPress realiza para los enlaces de visualización, solo calcule todas las publicaciones para el administrador que desea "ocultar" y restar de las cuentas de publicaciones existentes:

function wpse_229427_get_hidden_admin_id() {
    return 3; // You could make this a setting or return a value conditionally
}

function wpse_229427_hide_admin_posts( $wp_query ) {
    if ( is_admin() && ! current_user_can( 'edit_others_posts' ) && ! $wp_query->get( 'author' ) ) {
        $wp_query->set( 'author__not_in', [ wpse_229427_get_hidden_admin_id() ] );
    }
}

add_action( 'pre_get_posts', 'wpse_229427_hide_admin_posts' );

function wpse_229427_adjust_counts( $counts, $type ) {
    if ( $type === 'post' && is_admin() && ! current_user_can( 'edit_others_posts' ) ) {
        global $wpdb;

        $admin_id = wpse_229427_get_hidden_admin_id();
        $items    = $wpdb->get_results(
            $wpdb->prepare(
                "SELECT post_status, COUNT( * ) AS 'count' FROM {$wpdb->posts} WHERE post_type = 'post' AND post_author = %d GROUP BY post_status",
                $admin_id
            )
        );

        foreach ( $items as $item ) {
            if ( isset( $counts->{$item->post_status} ) )
                $counts->{$item->post_status} -= $item->count;
        }
    }

    return $counts;
}

add_filter( 'wp_count_posts', 'wpse_229427_adjust_counts', 10, 2 );
    
respondido por el TheDeadMedic 11.06.2016 - 14:27

Lea otras preguntas en las etiquetas