Remove Trash / Delete option for Custom Post Type / Taxonomy

I’ve created a custom post type prj, and I need to disable move to trash option by any user role! Same goes with a taxonomy org associated with the same post type.

Here is the code I’ve come up with so far .. but it only hides the option from the admin menu rather than disabling the capability from the user roles! This code hides the option from the main post list page and prevents delete actions .. the issue is that move to trash option is still available

//Disabling Trash Option for Project
add_filter( 'post_row_actions', 'remove_row_actions_post', 10, 1 );
function remove_row_actions_post( $actions ) {
    if( get_post_type() === 'prj' ) {
        unset( $actions['clone'] );
        unset( $actions['trash'] );
        return $actions;
    }
}

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

1 Answer
1

Try these:

/**
 * 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 these:

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

Leave a Comment