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

时间:2017-06-23 14:54:39

标签: woocommerce

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

我正在摆弄" wc_downloadable_file_permission"但不知何故,这只是授予许可,但我想撤销它。

我甚至尝试手动处理wp_posts_meta(_download_permissions_granted: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() ); 
            } 
        } 
    } 
} 

}

3 个答案:

答案 0 :(得分:1)

我想,我明白了。

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

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 )
                    );                    
                } 
            } 
        } 
    }
} 

答案 1 :(得分:0)

截至撰写本文时,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 );
    }
}

答案 2 :(得分:0)

经过一整天的搜索,找到了一种解决方案,该解决方案可通过MYSQL查询(我使用5.7)来完成此操作(感谢@Tim Biegeleisen)

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

DELETE
FROM wp_woocommerce_downloadable_product_permissions
WHERE `order_id` IN (ORDER ID1, ORDER ID2, ...);

如果您要删除所有退款订单的权限:

DELETE
FROM wp_woocommerce_downloadable_product_permissions
WHERE EXISTS (
    SELECT 1 FROM WHERE wp_posts.ID = wp_woocommerce_downloadable_product_permissions.order_id 
    AND wp_posts.post_status = 'wc-refunded');