HEX
Server: LiteSpeed
System: Linux premium235.web-hosting.com 4.18.0-553.45.1.lve.el8.x86_64 #1 SMP Wed Mar 26 12:08:09 UTC 2025 x86_64
User: beaupptk (733)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/beaupptk/yasirj.shop/wp-content/plugins/coming-soon/admin/includes/settings-functions.php
<?php
/**
 * Settings Functions for V2 Admin
 *
 * @package SeedProd
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Save settings via AJAX (V2 Admin)
 * Handles toggle switches for Coming Soon, Maintenance, Login, 404 modes
 */
function seedprod_lite_v2_save_settings() {
	// Verify nonce.
	if ( ! check_ajax_referer( 'seedprod_nonce', '_wpnonce', false ) ) {
		wp_send_json_error( 'Invalid nonce' );
	}

	// Check permissions.
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_send_json_error( 'Insufficient permissions' );
	}

	// Get and sanitize settings.
	$settings_json = isset( $_POST['settings'] ) ? stripslashes( wp_unslash( $_POST['settings'] ) ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- JSON string validated after json_decode.
	$new_settings  = json_decode( $settings_json, true );

	if ( ! is_array( $new_settings ) ) {
		wp_send_json_error( 'Invalid settings format' );
	}

	// Get existing settings (stored as JSON string).
	$existing_settings_json = get_option( 'seedprod_settings' );
	if ( ! empty( $existing_settings_json ) ) {
		$existing_settings = json_decode( $existing_settings_json, true );
		if ( ! is_array( $existing_settings ) ) {
			$existing_settings = array();
		}
	} else {
		$existing_settings = array();
	}

	// Update only the mode settings.
	$mode_keys = array(
		'enable_coming_soon_mode',
		'enable_maintenance_mode',
		'enable_login_mode',
		'enable_404_mode',
	);

	foreach ( $mode_keys as $key ) {
		if ( isset( $new_settings[ $key ] ) ) {
			$existing_settings[ $key ] = (bool) $new_settings[ $key ];
		}
	}

	// Ensure Coming Soon and Maintenance are mutually exclusive.
	if ( ! empty( $existing_settings['enable_coming_soon_mode'] ) && ! empty( $existing_settings['enable_maintenance_mode'] ) ) {
		// If both are true, disable the one that wasn't just enabled.
		if ( isset( $new_settings['enable_coming_soon_mode'] ) && $new_settings['enable_coming_soon_mode'] ) {
			$existing_settings['enable_maintenance_mode'] = false;
		} else {
			$existing_settings['enable_coming_soon_mode'] = false;
		}
	}

	// Save settings as JSON string (to match existing format).
	$result = update_option( 'seedprod_settings', wp_json_encode( $existing_settings ) );

	if ( false !== $result ) {
		wp_send_json_success(
			array(
				'message'  => __( 'Settings saved successfully', 'coming-soon' ),
				'settings' => $existing_settings,
			)
		);
	} else {
		wp_send_json_error( 'Failed to save settings' );
	}
}

/**
 * Get dashboard stats
 * Returns counts for pages, subscribers, etc.
 */
function seedprod_lite_v2_get_dashboard_stats() {
	global $wpdb;

	$stats = array();

	// Get page counts.
	$tablename   = $wpdb->prefix . 'postmeta';
	$posts_table = $wpdb->prefix . 'posts';

	// Get special page IDs to exclude from landing pages count.
	$coming_soon_id = get_option( 'seedprod_coming_soon_page_id' );
	$maintenance_id = get_option( 'seedprod_maintenance_mode_page_id' );
	$login_id       = get_option( 'seedprod_login_page_id' );
	$fourohfour_id  = get_option( 'seedprod_404_page_id' );

	$exclude_ids = array();
	if ( $coming_soon_id ) {
		$exclude_ids[] = (int) $coming_soon_id;
	}
	if ( $maintenance_id ) {
		$exclude_ids[] = (int) $maintenance_id;
	}
	if ( $login_id ) {
		$exclude_ids[] = (int) $login_id;
	}
	if ( $fourohfour_id ) {
		$exclude_ids[] = (int) $fourohfour_id;
	}

	$stats['coming_soon_count'] = $coming_soon_id ? 1 : 0;
	$stats['maintenance_count'] = $maintenance_id ? 1 : 0;
	$stats['theme_templates_count'] = $wpdb->get_var( "SELECT COUNT(DISTINCT post_id) FROM $tablename WHERE meta_key = '_seedprod_is_theme_template' AND meta_value = '1'" );

	// Count landing pages: pages with _seedprod_page that are NOT special pages.
	// Using _seedprod_page (not _seedprod_page_uuid) ensures we only count landing pages, not theme pages.
	// Match the logic from class-seedprod-landing-pages-table.php.
	if ( ! empty( $exclude_ids ) ) {
		$exclude_ids_string           = implode( ',', $exclude_ids );
		$placeholders = implode( ',', array_fill( 0, count( $exclude_ids ), '%d' ) );

		// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- $placeholders is a string of %d placeholders, safe for interpolation. Direct query needed for custom stats, no caching for real-time counts.
		$stats['landing_pages_count'] = $wpdb->get_var(
			"SELECT COUNT(DISTINCT pm.post_id)
			FROM $tablename pm
			INNER JOIN $posts_table p ON pm.post_id = p.ID
			WHERE pm.meta_key = '_seedprod_page'
			AND p.post_type = 'page'
			AND p.post_status != 'trash'
			AND pm.post_id NOT IN ($exclude_ids_string)"
		);
		// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
	} else {
		// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Direct query needed for custom stats, no caching for real-time counts.
		$stats['landing_pages_count'] = $wpdb->get_var(
			"SELECT COUNT(DISTINCT pm.post_id)
			FROM $tablename pm
			INNER JOIN $posts_table p ON pm.post_id = p.ID
			WHERE pm.meta_key = '_seedprod_page'
			AND p.post_type = 'page'
			AND p.post_status != 'trash'"
		);
	}

	// Get subscribers count.
	$subscribers_table           = $wpdb->prefix . 'csp3_subscribers';
	$stats['total_subscribers']  = 0;
	$stats['recent_subscribers'] = 0;

	// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Checking table existence, caching not applicable.
	if ( $wpdb->get_var( "SHOW TABLES LIKE '$subscribers_table'" ) === $subscribers_table ) {
		$stats['total_subscribers']  = $wpdb->get_var( "SELECT COUNT(*) FROM $subscribers_table" );
		$stats['recent_subscribers'] = $wpdb->get_var( "SELECT COUNT(*) FROM $subscribers_table WHERE created >= DATE_SUB(NOW(), INTERVAL 7 DAY)" );
	}

	// Get page IDs.
	$stats['csp_id']    = get_option( 'seedprod_coming_soon_page_id' );
	$stats['mmp_id']    = get_option( 'seedprod_maintenance_mode_page_id' );
	$stats['loginp_id'] = get_option( 'seedprod_login_page_id' );
	$stats['p404_id']   = get_option( 'seedprod_404_page_id' );

	// Get active states (settings stored as JSON string).
	$settings_json = get_option( 'seedprod_settings' );
	if ( ! empty( $settings_json ) ) {
		$settings = json_decode( $settings_json, true );
		if ( ! is_array( $settings ) ) {
			$settings = array();
		}
	} else {
		$settings = array();
	}

	$stats['csp_active']    = isset( $settings['enable_coming_soon_mode'] ) ? (bool) $settings['enable_coming_soon_mode'] : false;
	$stats['mmp_active']    = isset( $settings['enable_maintenance_mode'] ) ? (bool) $settings['enable_maintenance_mode'] : false;
	$stats['loginp_active'] = isset( $settings['enable_login_mode'] ) ? (bool) $settings['enable_login_mode'] : false;
	$stats['p404_active']   = isset( $settings['enable_404_mode'] ) ? (bool) $settings['enable_404_mode'] : false;

	// Get setup status.
	$stats['csp_setup_status'] = get_option( 'seedprod_coming_soon_page_setup_status' );

	return $stats;
}

/**
 * Register AJAX handlers for V2 admin
 * Note: These are registered when the file is included by the SeedProd_Lite_Admin class
 */
// Moved to class registration to ensure proper loading.