HEX
Server: LiteSpeed
System: Linux dune179.sitesanctuary.org 5.14.0-427.40.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Oct 16 07:08:17 EDT 2024 x86_64
User: h278792 (1197)
PHP: 8.1.29
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: /home/h278792/public_html/wp-content/plugins/learnpress/inc/class-lp-gdpr.php
<?php

/**
 * Class LP_GDPR
 *
 * Personal data export and removal for LearnPress
 *
 * @since 4.9.6
 */
class LP_GDPR {

	/**
	 * LP_GDPR constructor.
	 */
	public function __construct() {
		// Filter to wp privacy personal data exporter
		add_filter(
			'wp_privacy_personal_data_exporters',
			array( $this, 'register_exporter' ),
			10
		);

		add_filter(
			'wp_privacy_personal_data_erasers',
			array( $this, 'register_data_eraser' )
		);
	}

	public function register_data_eraser( $erasers ) {
		$erasers['learnpress'] = array(
			'eraser_friendly_name' => __( 'LearnPress' ),
			'callback'             => array( $this, 'personal_data_eraser' ),
		);

		return $erasers;
	}

	/**
	 * @param array $exporters
	 *
	 * @return mixed
	 */
	public function register_exporter( $exporters ) {

		/**
		 * Owned courses
		 */
		$exporters['learnpress-owned-courses'] = array(
			'exporter_friendly_name' => __( 'دوره های آموزشی تحت مالکیت LearnPress', 'learnpress' ),
			'callback'               => array( $this, 'user_owned_courses' ),
		);

		/**
		 * Orders
		 */
		$exporters['learnpress-orders'] = array(
			'exporter_friendly_name' => __( 'سفارشات LearnPress', 'learnpress' ),
			'callback'               => array( $this, 'user_orders' ),
		);

		/**
		 * Purchased courses
		 */
		$exporters['learnpress-purchased-courses'] = array(
			'exporter_friendly_name' => __( 'دوره های خرید لرنپرس', 'learnpress' ),
			'callback'               => array( $this, 'user_purchased_courses' ),
		);

		/**
		 * Profile
		 */
		$exporters['learnpress-profile'] = array(
			'exporter_friendly_name' => __( 'نمایه کاربر LearnPress', 'learnpress' ),
			'callback'               => array( $this, 'user_profile' ),
		);

		return $exporters;
	}

	public function user_profile( $email_address, $page ) {
		$export_data = array(
			'data' => array(),
			'done' => true,
		);

		$wp_user = get_user_by( 'email', $email_address );

		if ( ! $wp_user ) {
			return $export_data;
		}

		$user         = learn_press_get_user( $wp_user->ID );
		$profile      = LP_Profile::instance( $wp_user->ID );
		$export_items = array();

		$user = $profile->get_user();

		if ( $user ) {
			$privacy = $user->get_data( 'profile_privacy' );
			if ( $privacy ) {
				$privacy = $user->get_data( 'profile_privacy' );

				$export_item = array(
					'group_id'    => 'lp-profile',
					'group_label' => __( 'تنظیمات پروفایل', 'learnpress' ),
					'item_id'     => 'profile-' . $wp_user->ID,
					'data'        => array(),
				);
				foreach ( $privacy as $key => $item ) {
					$export_item['data'][] = array(
						'name'  => $key,
						'value' => $item,
					);
				}
				$export_items[] = $export_item;
			}
		}

		$export_data['data'] = $export_items;

		return $export_data;
	}

	public function user_orders( $email_address, $page ) {
		$number      = 10; // Limit us to avoid timing out
		$page        = (int) $page;
		$export_data = array(
			'data' => array(),
			'done' => true,
		);

		$wp_user = get_user_by( 'email', $email_address );

		if ( ! $wp_user ) {
			return $export_data;
		}

		$profile = LP_Profile::instance( $wp_user->ID );

		$query_orders = $profile->query_orders(
			array(
				'paged' => $page,
				'limit' => $number,
			)
		);

		if ( ! $query_orders ) {
			return $export_data;
		}

		$orders = $query_orders->get_items();

		if ( ! $orders ) {
			return $export_data;
		}

		$export_items = array();
		foreach ( $orders as $order ) {
			if ( ! $order instanceof LP_Order ) {
				$order = learn_press_get_order( $order );
			}

			$data           = array(
				array(
					'name'  => __( 'سفارش ID', 'learnpress' ),
					'value' => $order->get_order_number(),
				),
				array(
					'name'  => __( 'تاریخ سفارش', 'learnpress' ),
					'value' => $order->get_order_date(),
				),
				array(
					'name'  => __( 'وضعیت سفارش', 'learnpress' ),
					'value' => $order->get_order_status(),
				),
				array(
					'name'  => __( 'مجموه پرداخت', 'learnpress' ),
					'value' => $order->get_formatted_order_total(),
				),
			);
			$export_items[] = array(
				'group_id'    => 'lp-order',
				'group_label' => __( 'سفارشات', 'learnpress' ),
				'item_id'     => "order-{$order->get_id()}",
				'data'        => $data,
			);
		}

		$done                = count( $orders ) < $number;
		$export_data['done'] = $done;
		$export_data['data'] = $export_items;

		return $export_data;
	}

	/**
	 * Course list
	 *
	 * @param string $email_address
	 * @param int    $page
	 *
	 * @return array
	 */
	public function user_owned_courses( $email_address, $page ) {

		$number       = 10; // Limit us to avoid timing out
		$page         = (int) $page;
		$export_items = array();

		$query = $this->get_courses_by_email(
			'own',
			$email_address,
			array(
				'paged'  => $page,
				'limit'  => $number,
				'status' => '*',
			)
		);

		if ( ! $query ) {
			return array(
				'data' => array(),
				'done' => true,
			);
		}

		$courses = (array) $query->get_items();

		if ( $courses ) {
			foreach ( $courses as $course_id ) {
				$course = learn_press_get_course( $course_id );

				if ( ! $course ) {
					continue;
				}

				$data           = array(
					array(
						'name'  => __( 'نویسنده دوره', 'learnpress' ),
						'value' => $course->get_author_display_name(),
					),
					array(
						'name'  => __( 'نام دوره', 'learnpress' ),
						'value' => $course->get_title(),
					),
					array(
						'name'  => __( 'تاریخ دوره', 'learnpress' ),
						'value' => get_post_field( 'post_date', $course_id ),
					),
					array(
						'name'  => __( 'آدرس دوره', 'learnpress' ),
						'value' => $course->get_permalink(),
					),
				);
				$export_items[] = array(
					'group_id'    => 'lp-owned-course',
					'group_label' => __( 'دوره متعلق به', 'learnpress' ),
					'item_id'     => "course-{$course->get_id()}",
					'data'        => $data,
				);

				$this->_export_course_items( $export_items, $course_id );
			}
		}
		$done = count( $courses ) < $number;

		return array(
			'data' => $export_items,
			'done' => $done,
		);
	}

	/**
	 * @param array $export_items
	 */
	protected function _export_course_items( &$export_items, $course_id ) {
		global $post;

		$post = get_post( $course_id );
		setup_postdata( $post );
		$course = learn_press_get_course( $course_id );

		$items = $course->get_items();

		if ( ! $items ) {
			return;
		}

		foreach ( $items as $item_id ) {
			$item             = $course->get_item( $item_id );
			$export_item_data = array(
				array(
					'name'  => __( 'نام ایتم', 'learnpress' ),
					'value' => $item->get_title(),
				),
				array(
					'name'  => __( 'نوع آیتم', 'learnpress' ),
					'value' => $item->get_item_type( 'display' ),
				),
				array(
					'name'  => __( 'آدرس آیتم', 'learnpress' ),
					'value' => $item->get_permalink(),
				),
			);

			$export_items[] = array(
				'group_id'    => 'lp-owned-course-items-' . $course_id,
				'group_label' => __( 'آیتم های دوره', 'learnpress' ),
				'item_id'     => "course-items-{$course_id}-{$item_id}",
				'data'        => $export_item_data,
			);
		}

		wp_reset_postdata();
	}

	/**
	 * @param string $email_address
	 * @param string $page
	 *
	 * @return array
	 */
	public function user_purchased_courses( $email_address, $page ) {

		$number      = 10; // Limit us to avoid timing out
		$page        = (int) $page;
		$export_data = array(
			'data' => array(),
			'done' => true,
		);

		$wp_user = get_user_by( 'email', $email_address );

		if ( ! $wp_user ) {
			return $export_data;
		}

		$user  = learn_press_get_user( $wp_user->ID );
		$query = $this->get_courses_by_email(
			'purchased',
			$email_address,
			array(
				'paged' => $page,
				'limit' => $number,
			)
		);

		if ( ! $query ) {
			return $export_data;
		}

		$export_items = array();
		$courses      = (array) $query->get_items();

		if ( $courses ) {
			foreach ( $courses as $course_data ) {

				$course = learn_press_get_course( $course_data->get_id() );
				// if ( $course_data = $user->get_course_data( $course_id ) ) {
				$enrolled_date = $course_data->get_start_time();
				$finished_date = $course_data->get_end_time();
				$status        = $course_data->get_status();
				$grade         = $course_data->get_grade();
				// }

				$data           = array(
					array(
						'name'  => __( 'نویسنده دوره', 'learnpress' ),
						'value' => $course->get_author_display_name(),
					),
					array(
						'name'  => __( 'نام دوره', 'learnpress' ),
						'value' => $course->get_title(),
					),
					array(
						'name'  => __( 'تاریخ دوره', 'learnpress' ),
						'value' => get_post_field( 'post_date', $course_data->get_id() ),
					),
					array(
						'name'  => __( 'آدرس دوره', 'learnpress' ),
						'value' => $course->get_permalink(),
					),
					array(
						'name'  => __( 'تاریخ ثبت نام', 'learnpress' ),
						'value' => $enrolled_date,
					),
					array(
						'name'  => __( 'تاریخ پایان', 'learnpress' ),
						'value' => $finished_date ? $finished_date : '-',
					),
					array(
						'name'  => __( 'وضعیت دوره', 'learnpress' ),
						'value' => $status,
					),
					array(
						'name'  => __( 'نمره درس', 'learnpress' ),
						'value' => $status == 'finished' ? $grade : __( 'درجه بندی نشده', 'learnpress' ),
					),
				);
				$export_items[] = array(
					'group_id'    => 'lp-purchased-course-' . $course_data->get_id(),
					'group_label' => __( 'دوره خریداری شده', 'learnpress' ),
					'item_id'     => "course-{$course_data->get_id()}",
					'data'        => $data,
				);

				$this->_export_purchased_course_items( $export_items, $course_data );
			}
		}

		$done                = count( $courses ) < $number;
		$export_data['data'] = $export_items;
		$export_data['done'] = $done;

		return $export_data;
	}

	/**
	 * @param array               $export_items
	 * @param LP_User_Item_Course $course_data
	 */
	protected function _export_purchased_course_items( &$export_items, $course_data ) {
		global $post;
		$post = get_post( $course_data->get_id() );
		setup_postdata( $post );
		$course = learn_press_get_course( $course_data->get_id() );

		$items = $course_data->get_items();

		if ( ! $items ) {
			return;
		}

		foreach ( $items as $user_course_item ) {
			$item             = $course->get_item( $user_course_item->get_id() );
			$export_item_data = array(
				array(
					'name'  => __( 'نام آیتم', 'learnpress' ),
					'value' => $item->get_title(),
				),
				array(
					'name'  => __( 'نوع آیتم', 'learnpress' ),
					'value' => $item->get_item_type( 'display' ),
				),
				array(
					'name'  => __( 'آدرس آیتم', 'learnpress' ),
					'value' => $item->get_permalink(),
				),
			);

			if ( $item->get_item_type() == LP_QUIZ_CPT ) {
				$export_item_data[] = array(
					'name'  => __( 'وضعیت', 'learnpress' ),
					'value' => $user_course_item->get_result() . '%',
				);

				$export_item_data[] = array(
					'name'  => __( 'مقطع تحصیلی', 'learnpress' ),
					'value' => $user_course_item->get_graduation(),
				);
			} elseif ( $item->get_item_type() == LP_LESSON_CPT ) {
				$export_item_data[] = array(
					'name'  => __( 'تکمیلی', 'learnpress' ),
					'value' => $user_course_item->get_status() === 'completed' ? __( 'بله', 'learnpress' ) : __(
						'No',
						'learnpress'
					),
				);
			}

			$export_items[] = array(
				'group_id'    => 'lp-purchased-course-items-' . $course_data->get_id(),
				'group_label' => __( 'آیتم های دوره', 'learnpress' ),
				'item_id'     => "course-{$course_data->get_id()}-{$user_course_item->get_id()}",
				'data'        => $export_item_data,
			);
		}

		wp_reset_postdata();
	}

	/**
	 * Query all courses by user email
	 *
	 * @param string $type
	 * @param string $email
	 * @param array  $args
	 *
	 * @return array|bool|LP_Query_List_Table
	 */
	protected function get_courses_by_email( $type = 'own', $email = '', $args = array() ) {
		$user = get_user_by( 'email', $email );

		if ( ! $user ) {
			return false;
		}

		$profile = LP_Profile::instance( $user->ID );

		return $profile->query_courses(
			$type,
			$args
		);
	}

	/**
	 * Eraser personal data
	 *
	 * @param string $email
	 * @param int    $page
	 *
	 * @return array
	 */
	public function personal_data_eraser( $email, $page ) {
		$number = 500;
		$page   = (int) $page;

		$eraser_data = array(
			'items_removed'  => false,
			'items_retained' => false,
			'messages'       => array(),
			'done'           => 1,
		);

		$wp_user = get_user_by( 'email', $email );

		if ( ! $wp_user ) {
			return $eraser_data;
		}

		$this->_eraser_orders( $wp_user->ID, $page );
		$this->_eraser_user_items( $wp_user->ID, $page );
		$this->_eraser_courses( $wp_user->ID, $page );

		delete_user_meta( $wp_user->ID, '_lp_profile_privacy' );
		$eraser_data['items_removed'] = true;

		return $eraser_data;
	}

	/**
	 * Eraser orders
	 *
	 * @param int $user_id
	 * @param int $page
	 */
	protected function _eraser_orders( $user_id, $page ) {
		$curd       = new LP_User_CURD();
		$order_curd = new LP_Order_CURD();

		$orders = $curd->get_orders( $user_id, array( 'group_by_order' => true ) );

		if ( ! $orders ) {
			return;
		}

		foreach ( $orders as $order_id => $course_ids ) {
			$order = learn_press_get_order( $order_id );
			wp_delete_post( $order_id );
		}

	}

	/**
	 * Eraser user items
	 *
	 * @param int $user_id
	 * @param int $page
	 */
	protected function _eraser_user_items( $user_id, $page ) {
		$curd = new LP_User_CURD();
		$curd->delete_user_item( array( 'user_id' => $user_id ) );
	}

	/**
	 * Eraser courses
	 *
	 * @param int $user_id
	 * @param int $page
	 */
	protected function _eraser_courses( $user_id, $page ) {
		global $wpdb;

		$query = $wpdb->prepare(
			"
			SELECT *
			FROM {$wpdb->posts}
			WHERE post_author = %d
			AND post_type = %s
		",
			$user_id,
			LP_COURSE_CPT
		);

		$post_ids = $wpdb->get_col( $query );

		if ( ! $post_ids ) {
			return;
		}

		$api = new LP_Course_CURD();
		foreach ( $post_ids as $post_id ) {
			$api->delete_course( $post_id, true );
		}
	}

}

return new LP_GDPR();