防止从媒体库中删除附件



在Wordpress管理媒体库页面(上传.php(中,我想对delete_attachment操作进行一些检查。

我希望我的自定义函数在删除附件之前触发。

在这个函数中,我想检查它与数据库中另一个对象的关系。并且只有在根本没有关系时才删除它。

我使用此代码(在 functions.php 中(查看我的函数是否在delete_attachment触发:

<code>
      add_action( 'delete_attachment', 'check_relations' );
      function check_relations( $post_id ){
      ?>    
          <script>
             function myFunction() {
                 alert("Hello! I am an alert box!");
              }
      </script>
      <?php
      }
</code>

但似乎我的函数根本没有触发。并且图像附件正在被完全删除。这段代码出了什么问题?

好吧,你很幸运;

包括WordPress 2.7之前,它是在从数据库和文件系统中删除附件后触发的,从而限制了其实用性。从变更集 #10400 (WordPress 2.8( 开始,该操作将在删除任何内容之前触发。

因此,您可以更改删除行为。但是,你不应该用javascript来做。这对执行的 PHP 代码没有影响。

add_action( 'delete_attachment', 'check_relations' );
function check_relations( $post_id ){
    wp_die("Sorry, you can't delete this.");
}

也许一个简单的return false;也可以。

您可以使用

wp_prepare_attachment_for_js钩子完全删除删除链接。只需创建一个函数is_not_allowed_to_delete(),该函数执行所需的检查,并在不应删除附件时返回true

function remove_media_delete_link_in_grid_view( $response, $attachment ) {
    if ( is_not_allowed_to_delete( $attachment->ID ) )
        $response['nonces']['delete'] = false;
    return $response;
}
add_filter( 'wp_prepare_attachment_for_js', 'remove_media_delete_link_in_grid_view' );

这也适用于"批量删除"操作。如果附件具有此noncefalse,则不会将其与其他批量选择的附件👍🏻一起删除。

但这仅适用于使用 wp_prepare_attachment_for_js 挂钩的网格视图。列表视图不使用任何Javascript。因此,要防止在列表视图中删除媒体文件,您必须:

  • 使用 media_row_actions挂钩删除列表中每个媒体项的单独删除链接。
  • 并使用bulk_actions-{$screen}钩子从批量操作菜单中删除删除选项。
function remove_media_delete_link_in_list_view( $actions ) {
    if ( is_not_allowed_to_delete( $attachment->ID ) )
        unset( $actions['delete'] );
    return $actions;
}
add_filter( 'media_row_actions', 'remove_media_delete_link_in_list_view' );
function remove_media_bulk_delete_in_list_view( $actions ) {
    unset( $actions['delete'] );
    return $actions;
}
add_filter( 'bulk_actions-upload', 'remove_media_bulk_delete_in_list_view' );

最新更新