我正在尝试通过脚本为以前的所有订单添加一些下载权限,以进行批量处理。该脚本似乎可以很好地完成一件事。这是脚本...
function update_download_permissions(){
$orders = get_posts( array(
'post_type' => 'shop_order',
'post_status' => 'wc-completed',
'posts_per_page' => -1
) );
foreach ( $orders as $order ) {
wc_downloadable_product_permissions( $order->ID, true );
}
}
问题是wc_downloadable_product_permissions函数在wp_woocommerce_downloadable_product_permissions表中产生重复的条目。
我试图将第二个参数设置为false(默认值),但结果是没有创建权限。
有人对为何设置重复下载权限有任何想法吗?
干杯!
答案 0 :(得分:0)
我在探究了一些WooCommerce源代码之后,试图将项目添加到现有订单中,然后重新生成权限后,遇到了您的问题。
wc_downloadable_product_permissions()
将创建重复的权限条目的原因是因为它不检查任何现有权限。只是简单地在订单中为每个项目的权限表中插入另一个条目,这是不好的,因为这随后将在管理员和用户帐户前端中显示为另一个下载内容。
第二个force
参数(记录不充分)与一个布尔标志有关,该布尔标志指示wc_downloadable_product_permissions()
之前是否已经运行过。通过函数set_download_permissions_granted将布尔值设置为true。如果force
为true,它将忽略布尔值。如果force
为false,并且布尔值为true,则该函数将在开始处返回。
我创建了此函数,该函数使用与admin Order操作“重新生成下载权限”所使用的相同功能:
/**
* Regenerate the WooCommerce download permissions for an order
* @param Integer $order_id
*/
function regen_woo_downloadable_product_permissions( $order_id ){
// Remove all existing download permissions for this order.
// This uses the same code as the "regenerate download permissions" action in the WP admin (https://github.com/woocommerce/woocommerce/blob/3.5.2/includes/admin/meta-boxes/class-wc-meta-box-order-actions.php#L129-L131)
// An instance of the download's Data Store (WC_Customer_Download_Data_Store) is created and
// uses its method to delete a download permission from the database by order ID.
$data_store = WC_Data_Store::load( 'customer-download' );
$data_store->delete_by_order_id( $order_id );
// Run WooCommerce's built in function to create the permissions for an order (https://docs.woocommerce.com/wc-apidocs/function-wc_downloadable_product_permissions.html)
// Setting the second "force" argument to true makes sure that this ignores the fact that permissions
// have already been generated on the order.
wc_downloadable_product_permissions( $order_id, true );
}