0
votes

I'm trying to remove user ability to trash on user dashboard for a post type 'event' using out post_row_actions but script does not work.

The url is wp-admin/edit.php?post_type=event

add_filter( 'post_row_actions', 'remove_row_actions', 10, 1 );
function remove_row_actions( $actions )
{
if( get_post_type() === 'event' )
    unset( $actions['edit'] );
    unset( $actions['view'] );
    unset( $actions['trash'] );
    unset( $actions['inline hide-if-no-js'] );
return $actions;

I've also tried swaping post_row_action with page_row_action with no success

I know the script is correctly detecting the post type by testing with a simple echo in the if statement. It just does not remove any of the links on the dashboard

2
Your example here is missing the if brackets and also the closing bracket for the function... - brasofilo

2 Answers

0
votes

Try this code,

/**
 * Removes the "Trash" link on the individual post's "actions" row on the posts
 * edit page.
 */
add_filter( 'post_row_actions', 'remove_row_actions_post', 10, 2 );
function remove_row_actions_post( $actions, $post ) {
    if( $post->post_type === 'prj' ) {
        unset( $actions['clone'] );
        unset( $actions['trash'] );
    }
    return $actions;
}

add_action('wp_trash_post', 'restrict_post_deletion');
function restrict_post_deletion($post_id) {
    if( get_post_type($post_id) === 'prj' ) {
      wp_die('The post you were trying to delete is protected.');
    }
}

/**
 * Removes the "Delete" link on the individual term's "actions" row on the terms
 * edit page.
 */
add_filter( 'tag_row_actions', 'remove_row_actions_term', 10, 2 );
function remove_row_actions_term( $actions, $term ) {
    if ( 'org' === $term->taxonomy ) {
        unset( $actions['delete'] );
    }
    return $actions;
}

add_action( 'pre_delete_term', 'restrict_taxonomy_deletion', 10, 2 );
function restrict_taxonomy_deletion( $term, $taxonomy ) {
    if ( 'org' === $taxonomy ) {
        wp_die( 'The taxonomy you were trying to delete is protected.' );
    }
}

add_action( 'admin_head', function () {
    $current_screen = get_current_screen();

    // Hides the "Move to Trash" link on the post edit page.
    if ( 'post' === $current_screen->base &&
    'prj' === $current_screen->post_type ) :
    ?>
        <style>#delete-action { display: none; }</style>
    <?php
    endif;

    // Hides the "Delete" link on the term edit page.
    if ( 'term' === $current_screen->base &&
    'org' === $current_screen->taxonomy ) :
    ?>
        <style>#delete-link { display: none; }</style>
    <?php
    endif;
} );

And you may also need this:

/**
 * If you want/need to programmatically trash a 'prj' post, use this function
 * instead of directly calling the wp_trash_post() function.
 */
function my_trash_prj_post( $post_id = 0 ) {
    // Removes the filter THE SAME WAY it was added.
    remove_action('wp_trash_post', 'restrict_post_deletion');

    // Now trash the post.
    $post = wp_trash_post( $post_id );

    // Re-add the filter.
    add_action('wp_trash_post', 'restrict_post_deletion');

    return $post;
}

/**
 * If you want/need to programmatically trash a 'org' term, use this function
 * instead of directly calling the wp_delete_term() function.
 */
function my_delete_org_term( $term, $taxonomy = 'org', $args = array() ) {
    // Removes the filter THE SAME WAY it was added.
    remove_action( 'pre_delete_term', 'restrict_taxonomy_deletion', 10, 2 );

    // Now delete the term.
    $status = wp_delete_term( $term, $taxonomy, $args );

    // Re-add the filter.
    add_action( 'pre_delete_term', 'restrict_taxonomy_deletion', 10, 2 );

    return $status;
}

Try this code. Hope!! its work..

0
votes

You can remove the delete capability of users. Try below code

add_action( 'admin_init', 'remove_user_delete_capability' );

function remove_user_delete_capability() {      
   global $wp_roles;
   // Remove capabilty from editor role users 
   $wp_roles->remove_cap('editor', 'delete_posts');
   $wp_roles->remove_cap('editor', 'delete_others_posts');
   $wp_roles->remove_cap('editor', 'delete_published_posts');
}

In above code i have removed delete capability for Editor Role only. You may do it according to your requirements.

To remove link from dashboard, use below code

add_filter( 'views_edit-post', function( $views )
{

  $remove_views = [ 'trash' ];

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