automatewoo/includes/Triggers/File_Not_Yet_Downloaded.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

109 lines
3.1 KiB
PHP

<?php
namespace AutomateWoo;
defined( 'ABSPATH' ) || exit;
/**
* Class Trigger_File_Not_Yet_Downloaded.
*
* @since 5.6.6
* @package AutomateWoo
*/
class Trigger_File_Not_Yet_Downloaded extends Trigger_Abstract_Downloadable_Content {
/**
* Load admin details.
*/
public function load_admin_details() {
$this->title = __( 'File Not Yet Downloaded', 'automatewoo' );
$this->description = __( 'This trigger will fire if a file has not yet been downloaded after a set period of time.', 'automatewoo' );
parent::load_admin_details();
}
/**
* Register trigger hooks.
*/
public function register_hooks() {
add_action( 'woocommerce_order_status_processing', array( $this, 'queue_download_reminders' ) );
add_action( 'woocommerce_order_status_completed', array( $this, 'queue_download_reminders' ) );
add_action( 'woocommerce_download_product', array( $this, 'maybe_clear_queued_events' ), 10, 6 );
}
/**
* Queue 'not_yet_downloaded' events for each downloadable file in the order.
*
* @param int $order_id
*/
public function queue_download_reminders( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
// Check if order status is processing and downloadable files are not permitted.
if ( $order->has_status( 'processing' ) && ! $order->is_download_permitted() ) {
return;
}
$downloadable_files = $order->get_downloadable_items();
if ( empty( $downloadable_files ) ) {
return;
}
$customer = Customer_Factory::get_by_order( $order );
foreach ( $downloadable_files as $item ) {
$product_id = Clean::id( $item['product_id'] );
$download_id = Clean::string( $item['download_id'] );
$product = wc_get_product( $product_id );
if ( ! $product ) {
continue;
}
// Maybe run workflows for given downloadable file.
$this->maybe_run_workflows( $download_id, $product, $order, $customer, true );
}
}
/**
* Maybe clear queued events.
*
* @param string $user_email User Email address.
* @param string $order_key Order key.
* @param int $product_id Product ID.
* @param int $user_id User ID.
* @param int $download_id Download ID.
* @param int $order_id Order ID.
*/
public function maybe_clear_queued_events( $user_email, $order_key, $product_id, $user_id, $download_id, $order_id ) {
$query = new Queue_Query();
$query->where_workflow( $this->get_workflow_ids() );
$query->where_order( $order_id );
$query->where_product( $product_id );
$query->where_download( $download_id );
foreach ( $query->get_results() as $event ) {
$event->delete();
}
}
/**
* Ensures file is not downloaded by user while sitting in queue
* We are already clearing queued events on file download, but this is an extra check
* To ensure the file is not downloaded before the event is run
*
* @param Workflow $workflow
* @return bool
*/
public function validate_before_queued_event( $workflow ) {
$download = $workflow->data_layer()->get_item( 'download' );
if ( ! $download || $download->get_download_count() > 0 ) {
return false;
}
return true;
}
}