防止对特定帖子类型执行垃圾/删除操作

时间:2016-09-21 作者:Ahmed Fouad

编辑:

在我正在开发的插件中,我需要在前端和后端为客户存储支付、IPN和交易。然而,我担心的是,管理员将使用他的行动权力删除交易或财务数据从网站上有不良影响。

问题

我如何防止管理员删除付款/财务数据,以确保我没有试图过多地限制管理员,同时也将客户信息和财务数据作为高度优先事项。我不是在问我最好的方法是什么?而是问WordPress社区(作为管理层,作为客户)更好的方式是什么,因为我试图避免将来对执行此操作的方式的投诉。

What I currently have

/**
 * Constructor
 */
public function __construct() {

    // Do not allow payments and transactions to be trashed
    add_action( \'wp_trash_post\',                            array( $this, \'disable_trash\' ) );
    add_action( \'before_delete_post\',                       array( $this, \'disable_trash\' ) );
}

/**
 * Disable trash
 */
public function disable_trash( $post_id ) {
    global $post_type;

    if ( in_array( $post_type, array( \'payment\', \'transaction\' ) ) ) {
        wp_die( __( \'You are not allowed to trash payments or transactions.\', \'xxx\' ) );
    }
}

3 个回复
最合适的回答,由SO网友:birgire 整理而成

下面是另一种使用map_meta_cap 应用于map_meta_cap()has_cap() 的方法WP_User 类(PHP 5.4+):

add_filter( \'map_meta_cap\', function ( $caps, $cap, $user_id, $args )
{
    // Nothing to do
    if( \'delete_post\' !== $cap || empty( $args[0] ) )
        return $caps;

    // Target the payment and transaction post types
    if( in_array( get_post_type( $args[0] ), [ \'payment\', \'transaction\' ], true ) )
        $caps[] = \'do_not_allow\';       

    return $caps;    
}, 10, 4 );
我们的目标是删除post和paymenttransaction 自定义帖子类型。

据我所知,浏览get_post_type_capabilities() 功能我们不需要map_meta_cap 参数设置为true,在register_post_type 设置,以针对delete_post 元能力。

附言:Here 有一些关于map_meta_cap Justin Tadlock提供的过滤器和有用的示例here 还有ToschohereHere 我发现了一个我忘记写过的老例子,我们也可以进行调整,以避免在某些给定页面和用户角色上进行垃圾/删除Here\'s 由死亡医生提供的答案,链接到answer Seamus Leahy关于register_post_type 方法Here 在这个网站上还有更多的例子。希望有帮助

SO网友:cjbj

防止删除的更好方法是禁用capability 对于所有角色。当你register your post types \'“付款”和“交易”还定义了capability_type 与您的帖子类型同名。这将为您提供功能read_payment, edit_paymentdelete_payment (交易相同)。

然后,可以通过以下方式拒绝角色的此功能:

$wp_roles->remove_cap( \'editor\', \'delete_payment\' );
$wp_roles->remove_cap( \'admin\', \'delete_payment\' );
请始终注意,由于管理员可以在您的站点上编辑代码,因此他们仍然可以避免删除,除非您阻止在后端编辑代码并限制ftp和数据库访问。而且read this discussion 获取所有可用角色。

SO网友:Venkatesh Munna

我在一个网站上使用了这段代码,在那里我们甚至可以在批量编辑下拉列表中隐藏编辑、垃圾、查看按钮,

if(!current_user_can(\'administrator\')) //not an admin
{
    add_filter( \'post_row_actions\', \'remove_row_actions\', 10, 1 );
    function remove_row_actions( $actions )
    {
        if( get_post_type() === \'post\' ) {
            unset( $actions[\'edit\'] );
            unset( $actions[\'view\'] );
            unset( $actions[\'trash\'] );
            unset( $actions[\'inline hide-if-no-js\'] );
        }
        return $actions;
    }
}

if(!current_user_can(\'administrator\'))//not and admin
{
    global $pagenow;
    if ( \'post.php\' == $pagenow || \'post-new.php\' == $pagenow ) {
        add_action( \'admin_head\', \'wpse_125800_custom_publish_box\' );
        function wpse_125800_custom_publish_box() {
            $style = \'\';
            $style .= \'<style type="text/css">\';
            $style .= \'#delete-action, .bulkactions\';
            $style .= \'{display: none; }\';
            $style .= \'</style>\';

            echo $style;
        }
    }
}

相关推荐

如何从/wp-json/wp/v2/USERS/Me获取数据

我试图在wordpress中使用JWT auth获取用户数据。我被发送给/wp-json/wp/v2/users/me的邮递员get请求中包含了我从/wp-json/jwt-auth/v1/token获得的令牌。但我有一个错误:{ "code": "rest_not_logged_in", "message": "you are not logged in", "dat