Напишите custome wc_downloadable_product_permissions

#woocommerce

Вопрос:

Внутри wc-order-functions.php есть функция wc_downloadable_product_permissions , которая генерирует разрешения на загрузку.

 /**
 * Order Status completed - give downloadable product access to customer.
 *
 * @param int  $order_id Order ID.
 * @param bool $force    Force downloadable permissions.
 */
function wc_downloadable_product_permissions( $order_id, $force = false ) {
    $order = wc_get_order( $order_id );

    if ( ! $order || ( $order->get_data_store()->get_download_permissions_granted( $order ) amp;amp; ! $force ) ) {
        return;
    }

    if ( $order->has_status( 'processing' ) amp;amp; 'no' === get_option( 'woocommerce_downloads_grant_access_after_payment' ) ) {
        return;
    }
    if ( count( $order->get_items() ) > 0 ) {
        foreach ( $order->get_items()
 

Как я могу перезаписать эту функцию? Я взглянул на крючки действий, но я думаю, что на данный момент было бы лучше, если бы я мог напрямую заменить эту функцию в плагине.

Возможно ли это?

Комментарии:

1. Вы можете работать только с крючками. Замена функции невозможна при полном отсутствии изменения кода. Я видел, что функция подключается в двух местах: woocommerce_order_status_completed и woocommerce_order_status_processing . Вы могли бы удалить функцию из каждого крючка и добавить свою собственную — вот и все, что я думаю.

Ответ №1:

Решение состоит в том, чтобы удалить стандартные действия woocomerce и вместо этого подключить свой собственный код.

 
if( !class_exists('MyPlugin') ):
class MyPlugin{

  public function wc_downloadable_product_permissions( $order_id, $force = false ) {
    // own code
  }

  public function plugin_setting(){

    // remove default woocomerce action and replace them with custom action

    remove_action( 'woocommerce_order_status_completed', 'wc_downloadable_product_permissions' );
    remove_action( 'woocommerce_order_status_processing', 'wc_downloadable_product_permissions' );

    add_action( 'woocommerce_order_status_completed', [$this, 'wc_downloadable_product_permissions'] );
    add_action( 'woocommerce_order_status_processing', [$this, 'wc_downloadable_product_permissions'] );