#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'] );