WooCommerce,如何删除订单的可下载产品权限

WooCommerce,如何删除订单的可下载产品权限,woocommerce,Woocommerce,我想删除下载某些订单文件的权限,即使已经付款,例如,如果客户付款被撤销 我在摆弄wc_可下载的_文件_权限,但不知何故,这只授予权限,但我想撤销它 我甚至尝试手动处理wp_帖子(meta)(下载)(download)权限(被授予):是/否(yes/no)(yes/no)( 到目前为止,我得到了这个 function revoke_download_permission( $order_id ) { $order = wc_get_order( $order_id ); if ( si

我想删除下载某些订单文件的权限,即使已经付款,例如,如果客户付款被撤销

我在摆弄wc_可下载的_文件_权限,但不知何故,这只授予权限,但我想撤销它

我甚至尝试手动处理wp_帖子(meta)(下载)(download)权限(被授予):是/否(yes/no)(yes/no)(

到目前为止,我得到了这个

function revoke_download_permission( $order_id ) {    
$order = wc_get_order( $order_id ); 

if ( sizeof( $order->get_items() ) > 0 ) { 
    foreach ( $order->get_items() as $item ) { 
        $product = $item->get_product(); 

        if ( $product && $product->exists() && $product->is_downloadable() ) { 
            $downloads = $product->get_downloads(); 

            foreach ( array_keys( $downloads ) as $download_id ) { 
                wc_downloadable_file_permission( $download_id, $product, $order, $item->get_quantity() ); 
            } 
        } 
    } 
} 
}我想,我明白了

我没有完全删除下载权限,而是将剩余下载的值设置为零,这具有相同的效果。如果客户付款,您仍然可以将该值设置回默认值

function revoke_download_permission( $order_id ) {
    global $wpdb;
    $order = wc_get_order( $order_id ); 

    if ( sizeof( $order->get_items() ) > 0 ) { 
        foreach ( $order->get_items() as $item ) { 
            $product = $item->get_product(); 

            if ( $product && $product->exists() && $product->is_downloadable() ) { 
                $downloads = $product->get_downloads(); 

                foreach ( array_keys( $downloads ) as $download_id ) { 

                    $wpdb->update( 
                        'wp_woocommerce_downloadable_product_permissions', 
                        array( 
                            'downloads_remaining' => '0'
                        ), 
                        array( 'download_id' => $download_id )
                    );                    
                } 
            } 
        } 
    }
} 

在撰写本文时,Juergen的解决方案与WooCommerce的新数据存储机制不一致。此外,它不会从下载权限数据库中删除没有相应顺序的下载权限

这里有一个改进的批量重新生成所有下载权限的解决方案,它也解决了这些问题。以下内容与WooCommerce中的“重新生成下载权限”命令一致,但它适用于所有已完成的订单

将其放入functions.php文件中,加载wp admin页面,然后将其从functions.php中删除

显而易见的警告:这将在重新生成网站之前删除网站的所有下载权限。如果您已手动为任何客户分配了任何产品的权限,则这些权限将被分配并与您的订单数据库保持一致。使用完全由您自己承担风险,无明示或暗示的保证

add_action('init','my_activate_download_permissions');
function my_activate_download_permissions() {

$orders = get_posts( array(
    'post_type'      => 'shop_order',
    'post_status'    => 'wc-completed',
    'posts_per_page' => -1
    ) );

foreach ( $orders as $order ) {
    $data_store = WC_Data_Store::load( 'customer-download' );
    $data_store->delete_by_order_id( $order->ID );
    wc_downloadable_product_permissions( $order->ID, true );
    }
}

经过一整天的搜索,我在MYSQL中找到了一个解决方案,我使用了5.7,非常感谢@Tim Biegeleisen

要从所选订单ID中删除所有权限下载,请执行以下操作:

删去 来自wp\U商业\U可下载\U产品\U权限 其中,订单ID1、订单ID2中的“订单id”。。。; 如果要删除所有退款订单的权限:

删去 来自wp\U商业\U可下载\U产品\U权限 哪里有 从wp_posts.ID=wp_woocommerce_downloadable_product_permissions.order_ID的位置选择1 和wp_posts.post_status='wc returned';
在函数中传递0而不是$item->获取数量谢谢。但这不会撤销下载权限。这只会在表wp_woocommerce_downloadable_product_permissions中添加一条附加记录,其值downloads_remaining=0。这仍然允许客户下载文件。我会挖得更深。