重新生成WooCommerce旧订单的下载权限

时间:2018-11-30 08:01:25

标签: wordpress woocommerce

我正在尝试通过脚本为以前的所有订单添加一些下载权限,以进行批量处理。该脚本似乎可以很好地完成一件事。这是脚本...

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(默认值),但结果是没有创建权限。

有人对为何设置重复下载权限有任何想法吗?

干杯!

1 个答案:

答案 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 );

}