5

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

7

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;
}
5
  • Thanks for the code, can you please guide on how to remove Delete option from the main post edit page? Feb 26, 2018 at 9:40
  • Sorry, can you post screenshot? (For example, post it on Imgur.com) And you've tried the code, right?
    – Sally CJ
    Feb 26, 2018 at 9:56
  • Apologize for my previous comment.. =) I've updated the main code snippets in my answer. Please try and let me know.
    – Sally CJ
    Feb 26, 2018 at 13:49
  • Worked perfectly fine!! Thanks for saving the day .. will be quite helpful in other projects as well! :) Feb 28, 2018 at 12:07
  • You're welcome, and all the best on your projects! =)
    – Sally CJ
    Feb 28, 2018 at 14:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.