我想删除下载某些订单文件的权限(即使已付款),例如如果客户付款被撤销。
我正在摆弄" 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() );
}
}
}
}
}
答案 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');