File: /var/www/html/video-rental/wp-content/plugins/video-coupon-manager.php
<?php
/**
* Plugin Name: Video Coupon Manager
* Description: Manage coupon codes for video purchases.
*/
register_activation_hook(__FILE__, 'vcm_create_coupon_table');
function vcm_create_coupon_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'video_coupons';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id INT NOT NULL AUTO_INCREMENT,
code VARCHAR(100) NOT NULL,
discount_type ENUM('percentage', 'flat') NOT NULL,
discount_value FLOAT NOT NULL,
usage_limit INT NULL,
user_ids TEXT NULL,
video_ids TEXT NULL,
is_active BOOLEAN DEFAULT 1,
expires_at DATETIME NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE (code)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
add_action('admin_menu', 'add_coupon_menu');
function add_coupon_menu() {
add_menu_page('Coupons', 'Coupons', 'manage_options', 'custom-coupons', 'render_coupon_page');
}
function render_coupon_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'video_coupons';
// Handle delete
if (isset($_GET['delete_coupon'])) {
$wpdb->delete($table_name, ['id' => intval($_GET['delete_coupon'])]);
echo '<div class="updated"><p>Coupon deleted.</p></div>';
}
// Handle insert or update
if (isset($_POST['save_coupon'])) {
$data = [
'code' => sanitize_text_field($_POST['code']),
'discount_type' => sanitize_text_field($_POST['discount_type']),
'discount_value' => floatval($_POST['amount']),
'usage_limit' => sanitize_text_field($_POST['usage_limit']),
// 'user_ids' => isset($_POST['allowed_users']) ? implode(',', array_map('intval', $_POST['allowed_users'])) : '',
// 'video_ids' => isset($_POST['allowed_videos']) ? implode(',', array_map('intval', $_POST['allowed_videos'])) : '',
'user_ids' => isset($_POST['allowed_users']) ? (in_array('all', $_POST['allowed_users']) ? 'all' : implode(',', $_POST['allowed_users'])) : '',
'video_ids' => isset($_POST['allowed_videos']) ? (in_array('all', $_POST['allowed_videos']) ? 'all' : implode(',', $_POST['allowed_videos'])) : '',
// 'start_date' => sanitize_text_field($_POST['start_date']),
// 'end_date' => sanitize_text_field($_POST['end_date']),
'expires_at' => sanitize_text_field($_POST['expires_at']),
'is_active' => isset($_POST['status']) ? 1 : 0,
];
if (!empty($_POST['coupon_id'])) {
$wpdb->update($table_name, $data, ['id' => intval($_POST['coupon_id'])]);
echo '<div class="updated"><p>Coupon updated.</p></div>';
} else {
$wpdb->insert($table_name, $data);
echo '<div class="updated"><p>Coupon added.</p></div>';
}
}
$edit_coupon = null;
if (isset($_GET['edit_coupon'])) {
$edit_coupon = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", intval($_GET['edit_coupon'])));
}
$users = get_users();
$videos = get_posts(['post_type' => 'vm_video', 'numberposts' => -1]);
?>
<div class="wrap">
<h1><?php echo $edit_coupon ? 'Edit Coupon' : 'Add New Coupon'; ?></h1>
<form method="post">
<input type="hidden" name="coupon_id" value="<?php echo esc_attr($edit_coupon->id ?? ''); ?>">
<table class="form-table">
<tr>
<th scope="row">Coupon Code</th>
<td><input name="code" type="text" value="<?php echo esc_attr($edit_coupon->code ?? ''); ?>" class="regular-text" required></td>
</tr>
<tr>
<th scope="row">Discount Type</th>
<td>
<select name="discount_type">
<option value="percentage" <?php selected($edit_coupon->discount_type ?? '', 'percentage'); ?>>Percentage</option>
<option value="flat" <?php selected($edit_coupon->discount_type ?? '', 'flat'); ?>>Flat</option>
</select>
</td>
</tr>
<tr>
<th scope="row">Discount Amount</th>
<td><input name="amount" type="number" step="0.01" value="<?php echo esc_attr($edit_coupon->discount_value ?? ''); ?>" class="small-text" required></td>
</tr>
<tr>
<th scope="row">Usage Limit</th>
<td>
<!-- <select name="usage_limit">
<option value="0" <?php selected($edit_coupon->usage_limit ?? '', '0'); ?>>Unlimited</option>
<option value="1" <?php selected($edit_coupon->usage_limit ?? '', '1'); ?>>One-time</option>
<option value="2" <?php selected($edit_coupon->usage_limit ?? '', '2'); ?>>5 Times</option>
<option value="3" <?php selected($edit_coupon->usage_limit ?? '', '3'); ?>>10 Times</option>
</select> -->
<input name="usage_limit" type="number" step="0.01" value="<?php echo esc_attr($edit_coupon->usage_limit ?? ''); ?>" class="small-text" required>
</td>
</tr>
<tr>
<th scope="row">Allowed Users</th>
<td>
<select name="allowed_users[]" class="select2-users" multiple="multiple" style="width: 100%;">
<option value="all" <?php echo isset($edit_coupon->user_ids) && $edit_coupon->user_ids === 'all' ? 'selected' : ''; ?>>All Users</option>
<?php foreach ($users as $user): ?>
<option value="<?php echo esc_attr($user->ID); ?>" <?php echo isset($edit_coupon->user_ids) && in_array($user->ID, explode(',', $edit_coupon->user_ids)) ? 'selected' : ''; ?>><?php echo esc_html($user->display_name); ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
<tr>
<th scope="row">Allowed Videos</th>
<td>
<select name="allowed_videos[]" class="select2-videos" multiple="multiple" style="width: 100%;">
<option value="all" <?php echo isset($edit_coupon->video_ids) && $edit_coupon->video_ids === 'all' ? 'selected' : ''; ?>>All Videos</option>
<?php foreach ($videos as $video): ?>
<option value="<?php echo esc_attr($video->ID); ?>" <?php echo isset($edit_coupon->video_ids) && in_array($video->ID, explode(',', $edit_coupon->video_ids)) ? 'selected' : ''; ?>><?php echo esc_html($video->post_title); ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
<tr>
<th scope="row">Expiry Date</th>
<td><input type="datetime-local" name="expires_at" value="<?php echo esc_attr(str_replace(' ', 'T', $edit_coupon->expires_at ?? '')); ?>"></td>
</tr>
<!-- <tr>
<th scope="row">End Date</th>
<td><input type="date" name="end_date" value="<?php echo esc_attr($edit_coupon->end_date ?? ''); ?>"></td>
</tr> -->
<tr>
<th scope="row">Status</th>
<td><input type="checkbox" name="status" value="1" <?php checked($edit_coupon->is_active ?? 0, 1); ?>> Active</td>
</tr>
</table>
<p class="submit">
<button type="submit" name="save_coupon" class="button button-primary">Save Coupon</button>
</p>
</form>
<h2>Existing Coupons</h2>
<table class="widefat">
<thead>
<tr>
<th>ID</th>
<th>Code</th>
<th>Type</th>
<th>Amount</th>
<th>Limit</th>
<th>Usernames</th>
<th>Videos</th>
<th>Expiry Date</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php
$coupons = $wpdb->get_results("SELECT * FROM $table_name");
foreach ($coupons as $coupon):
// Get usernames
$usernames = [];
if (!empty($coupon->user_ids)) {
$user_ids = explode(',', $coupon->user_ids);
foreach ($user_ids as $user_id) {
$user = get_userdata(trim($user_id));
if ($user) {
$usernames[] = $user->display_name;
}
}
}
// Get video titles
$video_titles = [];
if (!empty($coupon->video_ids)) {
$video_ids = explode(',', $coupon->video_ids);
foreach ($video_ids as $video_id) {
$video = get_post(trim($video_id));
if ($video) {
$video_titles[] = $video->post_title;
}
}
}
?>
<tr>
<td><?php echo $coupon->id; ?></td>
<td><?php echo esc_html($coupon->code); ?></td>
<td><?php echo esc_html($coupon->discount_type); ?></td>
<td><?php echo esc_html($coupon->discount_value); ?></td>
<td><?php echo esc_html($coupon->usage_limit); ?></td>
<td><?php echo !empty($usernames) ? esc_html(implode(', ', $usernames)) : 'All Users'; ?></td>
<td><?php echo !empty($video_titles) ? esc_html(implode(', ', $video_titles)) : 'All Videos'; ?></td>
<td><?php echo esc_html($coupon->expires_at); ?></td>
<td><?php echo $coupon->is_active ? 'Active' : 'Inactive'; ?></td>
<td>
<a href="?page=custom-coupons&edit_coupon=<?php echo $coupon->id; ?>">Edit</a> |
<a href="?page=custom-coupons&delete_coupon=<?php echo $coupon->id; ?>" onclick="return confirm('Are you sure?');">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php }