at path:
ROOT
/
wp-content
/
plugins
/
tutor
/
classes
/
Withdraw_Requests_List.php
run:
R
W
Run
Addons.php
11.79 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Admin.php
26.61 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Ajax.php
17.03 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Announcements.php
2.79 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Assets.php
24.27 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Backend_Page_Trait.php
4.39 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
BaseController.php
1.47 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Config.php
3.16 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Container.php
4.85 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Course.php
94.45 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Course_Embed.php
2.55 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Course_Filter.php
8.68 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Course_List.php
14.68 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Course_Settings_Tabs.php
1.16 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Course_Widget.php
8.2 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Custom_Validation.php
513 By
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Dashboard.php
1.23 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Earnings.php
10.43 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
FormHandler.php
7.16 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Frontend.php
2.94 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Gutenberg.php
4.62 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Icon.php
11.49 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Input.php
9.08 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Instructor.php
13.2 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Instructors_List.php
13.09 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Lesson.php
19.92 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Options_V2.php
67.77 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Permalink.php
2 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Post_types.php
18.3 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Private_Course_Access.php
2.52 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Q_And_A.php
10.78 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Question_Answers_List.php
2.55 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Quiz.php
35.16 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
QuizBuilder.php
12.53 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Quiz_Attempts_List.php
7.28 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
RestAPI.php
7.97 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Reviews.php
3.72 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Rewrite_Rules.php
5.18 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Shortcode.php
14.18 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Singleton.php
1.08 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Student.php
10.44 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Students_List.php
3.03 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Taxonomies.php
8.2 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Template.php
14.52 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Theme_Compatibility.php
683 By
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Tools.php
3.33 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Tools_V2.php
18.56 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Tutor.php
36.45 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
TutorEDD.php
4.69 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Tutor_Base.php
1.48 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Tutor_Setup.php
33.34 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Upgrader.php
12.49 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
User.php
14.9 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Utils.php
270.91 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Video_Stream.php
3.94 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
WhatsNew.php
4.83 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Withdraw.php
9.49 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
Withdraw_Requests_List.php
6.24 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
WooCommerce.php
24.76 KB
2026-04-14 05:34:26
R
W
Run
Delete
Rename
error_log
up
📄
Withdraw_Requests_List.php
Save
<?php /** * Manage withdrawals * * @package Tutor\Withdraw * @author Themeum <support@themeum.com> * @link https://themeum.com * @since 1.0.0 */ namespace TUTOR; if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Handle withdraw request logic * * @since 1.0.0 */ class Withdraw_Requests_List { /** * List page slug * * @since 1.0.0 * * @var string */ const WITHDRAW_REQUEST_LIST_PAGE = 'tutor_withdraw_requests'; /** * Register hooks, resolve dependencies * * @since 1.0.0 */ public function __construct() { /** * Approve or reject withdraw request */ add_action( 'wp_ajax_tutor_admin_withdraw_action', array( $this, 'update_withdraw_status' ) ); } /** * Page title fallback * * @since 3.5.0 * * @param string $name Property name. * * @return string */ public function __get( $name ) { if ( 'page_title' === $name ) { return esc_html__( 'Withdraw Requests', 'tutor' ); } } /** * Available tabs that will visible on the right side of page navbar * * @since 2.0.0 * * @param string $date withdraw request date | optional. * @param string $search search by instructor name or email | optional. * * @return array */ public function tabs_key_value( $date = '', $search = '' ): array { $approved = self::tabs_data( 'approved', $date, $search ); $pending = self::tabs_data( 'pending', $date, $search ); $rejected = self::tabs_data( 'rejected', $date, $search ); $url = apply_filters( 'tutor_data_tab_base_url', get_pagenum_link() ); $tabs = array( array( 'key' => '', 'title' => __( 'All', 'tutor' ), 'value' => $approved + $pending + $rejected, 'url' => $url . '&data=all', ), array( 'key' => 'approved', 'title' => __( 'Approved', 'tutor' ), 'value' => $approved, 'url' => $url . '&data=approved', ), array( 'key' => 'pending', 'title' => __( 'Pending', 'tutor' ), 'value' => $pending, 'url' => $url . '&data=pending', ), array( 'key' => 'rejected', 'title' => __( 'Rejected', 'tutor' ), 'value' => $rejected, 'url' => $url . '&data=rejected', ), ); return $tabs; } /** * Get counted number of withdraw list by status ex: approved | pending | rejected * * @since 2.0.0 * * @param string $status status required | available : (approved | pending | rejected). * @param string $date withdraw request date | optional | YYYY-MM-DD. * @param string $search search by instructor name or email | optional. * * @return int */ public static function tabs_data( string $status, $date = '', $search = '' ): int { global $wpdb; $withdraw_table = $wpdb->prefix . 'tutor_withdraws'; $user_table = $wpdb->users; $status = sanitize_text_field( $status ); $date = sanitize_text_field( $date ); $search = sanitize_text_field( $search ); // Prepare date query. $date_query = ''; if ( '' !== $date ) { $date_query = "AND DATE(withdraw.created_at) = CAST('{$date}' AS DATE) "; } // Prepare search query. $search = '%' . $wpdb->esc_like( $search ) . '%'; $count = $wpdb->get_var( $wpdb->prepare( "SELECT count(*) FROM {$withdraw_table} AS withdraw INNER JOIN {$user_table} AS user ON user.ID = withdraw.user_id WHERE withdraw.status = %s {$date_query} AND ( user.user_login LIKE %s OR user.user_nicename LIKE %s OR user.user_email LIKE %s OR user.display_name LIKE %s ) ", $status, $search, $search, $search, $search ) ); return $count ? $count : 0; } /** * Handle ajax request for updating withdraw status | available status (approved, rejected, pending) * * @since 2.0.0 * * @return string json response. */ public function update_withdraw_status() { tutor_utils()->checking_nonce(); // Check if user is privileged. if ( ! current_user_can( 'administrator' ) ) { wp_send_json_error( tutor_utils()->error_message() ); } $status = Input::post( 'action-type', '' ); $withdraw_id = Input::post( 'withdraw-id', '' ); $reject_type = Input::post( 'reject-type', '' ); $reject_comment = Input::post( 'reject-comment', '' ); if ( '' === $withdraw_id ) { return false; } else { $update = self::update( $status, $withdraw_id, $reject_type, $reject_comment ); return $update ? wp_send_json( true ) : false; } exit; } /** * Update withdraw status | available status (approved, rejected, pending) * * @since v2.0.0 * * @param string $status | required. * @param int $withdraw_id | required. * @param string $reject_type | optional. * @param string $reject_comment | optional. * * @return bool json response. */ public static function update( string $status, int $withdraw_id, $reject_type = '', $reject_comment = '' ): bool { global $wpdb; $withdraw_table = $wpdb->prefix . 'tutor_withdraws'; $withdraw_id = sanitize_text_field( $withdraw_id ); $status = sanitize_text_field( $status ); // Prepare data for update. $data = array( 'status' => $status, 'updated_at' => gmdate( 'Y-m-d H:i:s' ), ); // If rejected then append reject_type and comment with method_data. if ( 'rejected' === $status ) { $withdraw = self::get_withdraw_by_id( $withdraw_id ); if ( $withdraw ) { $details = unserialize( $withdraw->method_data ); $details['rejects'] = array( 'reject_type' => sanitize_text_field( $reject_type ), 'reject_comment' => sanitize_text_field( $reject_comment ), ); $data['method_data'] = maybe_serialize( $details ); // Trigger email after rejecting withdraw. do_action( 'tutor_after_rejected_withdraw', $withdraw_id ); } } else { do_action( 'tutor_after_approved_withdraw', $withdraw_id ); } // Update. $update = $wpdb->update( $withdraw_table, $data, array( 'withdraw_id' => $withdraw_id, ) ); return $update ? true : false; } /** * Get withdraw by id * * @since v2.0.0 * * @param int $withdraw_id | required. * * @return object withdraw list. */ public static function get_withdraw_by_id( int $withdraw_id ) { global $wpdb; $withdraw_table = $wpdb->prefix . 'tutor_withdraws'; return $wpdb->get_row( $wpdb->prepare( " SELECT *FROM {$withdraw_table} WHERE withdraw_id = %d ", $withdraw_id ) ); } }