Skip to content

Instantly share code, notes, and snippets.

@w3guy
Forked from zackkatz/edd-refund-column.php
Created August 12, 2025 06:31
Show Gist options
  • Save w3guy/787aa69e66cae763edd6de643eae20bc to your computer and use it in GitHub Desktop.
Save w3guy/787aa69e66cae763edd6de643eae20bc to your computer and use it in GitHub Desktop.

Revisions

  1. @zackkatz zackkatz renamed this gist Aug 11, 2025. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. @zackkatz zackkatz created this gist Aug 11, 2025.
    123 changes: 123 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,123 @@
    <?php
    /**
    * Plugin Name: EDD Refund Column
    * Description: Adds a “Request Refund” column to the Easy Digital Downloads purchase history table that links to a refund page with the Order ID.
    * Author: Your Name
    * Version: 1.3.0
    * Requires at least: 6.0
    * Requires PHP: 7.4
    * License: GPL-2.0-or-later
    *
    * @package EDDRefundColumn
    */

    defined( 'ABSPATH' ) || exit;

    // === CONFIGURATION CONSTANTS === //
    define( 'EDD_REFUND_COLUMN_PERIOD_DAYS', 30 ); // Number of days after purchase to allow refund requests.
    define( 'EDD_REFUND_COLUMN_PAGE_ID', 123 ); // The WordPress page ID of your refund policy page.
    define( 'EDD_REFUND_COLUMN_QUERY_ARG', 'order_id' ); // The query parameter for passing the order ID.

    /**
    * Bootstraps the plugin if Easy Digital Downloads is active.
    *
    * @since 1.0.0
    * @return void
    */
    function gk_edd_refund_column_maybe_bootstrap() {
    if ( ! function_exists( 'EDD' ) ) {
    return;
    }

    add_action( 'edd_purchase_history_header_after', 'gk_edd_refund_column_add_header' );
    add_action( 'edd_order_history_row_end', 'gk_edd_refund_column_add_cell', 10, 1 );
    }
    add_action( 'plugins_loaded', 'gk_edd_refund_column_maybe_bootstrap' );

    /**
    * Outputs the “Request Refund” header cell.
    *
    * Hook: edd_purchase_history_header_after
    *
    * @since 1.0.0
    * @return void
    */
    function gk_edd_refund_column_add_header() {
    ?>
    <th class="edd_purchase_refund">
    <?php echo esc_html__( 'Request Refund', 'edd-refund-column' ); ?>
    </th>
    <?php
    }

    /**
    * Whether the provided EDD order is eligible for refund link display.
    *
    * Conditions:
    * - Status is exactly 'complete' or 'renewal'
    * - Order was created within the configured refund period
    *
    * @since 1.1.0
    *
    * @param \EDD\Order $order EDD order object.
    * @return bool True if eligible; false otherwise.
    */
    function gk_edd_refund_column_is_eligible( $order ) {
    if ( empty( $order ) || empty( $order->id ) ) {
    return false;
    }

    // Must be a completed or renewal order.
    if ( ! in_array( $order->status, [ 'complete', 'renewal' ], true ) ) {
    return false;
    }

    // Convert creation date to timestamp in the site's timezone.
    $order_ts = 0;
    try {
    $order_ts = EDD()->utils->date( $order->date_created, null, true )->getTimestamp();
    } catch ( Exception $e ) {
    $order_ts = is_string( $order->date_created ) ? strtotime( $order->date_created ) : 0;
    }

    if ( ! $order_ts ) {
    return false;
    }

    $current_ts = current_time( 'timestamp' );
    $period_seconds = (int) EDD_REFUND_COLUMN_PERIOD_DAYS * DAY_IN_SECONDS;

    return ( $order_ts >= ( $current_ts - $period_seconds ) );
    }

    /**
    * Outputs the “Request Refund” table cell.
    *
    * @since 1.0.0
    *
    * @param \EDD\Order $order EDD order object for the current row.
    * @return void
    */
    function gk_edd_refund_column_add_cell( $order ) {
    $cell_open = '<td class="edd_purchase_refund">';
    $cell_close = '</td>';

    if ( ! gk_edd_refund_column_is_eligible( $order ) ) {
    echo $cell_open . '—' . $cell_close; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
    return;
    }

    $refund_url = add_query_arg(
    EDD_REFUND_COLUMN_QUERY_ARG,
    rawurlencode( (string) $order->id ),
    get_permalink( EDD_REFUND_COLUMN_PAGE_ID )
    );

    printf(
    '%1$s<a href="%2$s">%3$s</a>%4$s',
    $cell_open,
    esc_url( $refund_url ),
    esc_html__( 'Request Refund', 'edd-refund-column' ),
    $cell_close
    );
    }