web-dev-qa-db-ja.com

投稿が削除されないようにする方法

監査の問題では、私は投稿をゴミ箱に入れることができますが、削除することはできません - すべてのユーザーに対して。

だから私はのようなプラグインがあります

add_action('before_delete_post', function($id) {
        wp_die(0);
    });

しかし、すべての削除アクションがajaxであるとは限らないので、結果が "0"のエラーページを返すと黒い画面が表示されます。

上のコードで大丈夫ですが、もっと良い方法はありますか。

8
Yoga

アクションを強制終了させないでください。リダイレクトを(好きな場所に)行ってください。

function wpse_92155_before_delete_post() {
    wp_redirect(admin_url('edit.php'));
    exit();
} // function wpse_92155_before_delete_post
add_action('before_delete_post', 'wpse_92155_before_delete_post', 1);
8
tfrommen

削除に対する保護の最後の層としてフックbefore_delete_postを使用します(@ tfの解決策を使用します。これが正しい答えです)。

そして最初に「削除」オプションを見えなくします。次の例では、 Bulk Actions および Empty Trash ボタンを非表示にし、 Delete Permanently 行アクションを削除しています。

before

このコードでは:

add_action( 'admin_head-edit.php', 'hide_delete_css_wpse_92155' );
add_filter( 'post_row_actions', 'hide_row_action_wpse_92155', 10, 2 );
add_filter( 'page_row_actions', 'hide_row_action_wpse_92155', 10, 2 );

function hide_delete_css_wpse_92155()
{
    if( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] ) 
    {
        echo "<style>
            .alignleft.actions:first-child, #delete_all {
                display: none;
            }
            </style>";
    }
}

function hide_row_action_wpse_92155( $actions, $post ) 
{
    if( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] ) 
        unset( $actions['delete'] );

    return $actions; 
}

これが結果です。

after

興味のあるメモ

フックcpt_row_actionsはありません。フックpage_row_actionsおよびpost_row_actionsは、それぞれ 投稿タイプが階層型であるかどうかにかかわらず適用されます です。

5
brasofilo