'array', 'sanitize_callback' => [$this, 'sanitize_configurations'], 'default' => [], ]); register_setting('adpagex_group', 'adpagex_active_config', [ 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'default' => '', ]); } /** * Sanitizes the configurations array before saving. * * @param mixed $configs * @return array */ public function sanitize_configurations($configs) { if (!is_array($configs)) { return []; } foreach ($configs as $key => $cfg) { if (is_array($cfg)) { foreach ($cfg as $k => $v) { $configs[$key][$k] = is_array($v) ? array_map('sanitize_text_field', $v) : sanitize_text_field($v); } } } return $configs; } /** * Renders the Ad Placements management page. * */ public function render_placements_page() { $configs = get_option('adpagex_configurations', []); if (!is_array($configs)) { $configs = []; } $active = get_option('adpagex_active_config'); // Process form submission for new/update placement if (isset($_POST['action_type'])) { $has_error = false; // Handle delete if ($_POST['action_type'] === 'delete') { if ( ! isset($_POST['_wpnonce'], $_POST['config_id']) || ! wp_verify_nonce( sanitize_text_field(wp_unslash($_POST['_wpnonce'])), // Đã sửa 'adpagex_delete_placement_' . sanitize_text_field(wp_unslash($_POST['config_id'])) ) ) { wp_die( esc_html__( 'Security check failed', 'adpagex' ) ); } if ( ! current_user_can('manage_options') ) { wp_die( esc_html__( 'Insufficient permissions', 'adpagex' ) ); } $config_id = sanitize_text_field(wp_unslash($_POST['config_id'])); foreach ($configs as $key => $cfg) { if ($cfg['id'] === $config_id) { unset($configs[$key]); break; } } update_option('adpagex_configurations', $configs); // If deleted placement was active, set first placement as active or none if ($active === $config_id) { $new_active = !empty($configs) ? $configs[0]['id'] : ''; update_option('adpagex_active_config', $new_active); $active = $new_active; } printf( '

%s

', esc_html__( 'Placement deleted successfully!', 'adpagex' ) ); } // Handle set active if ($_POST['action_type'] === 'set_active') { if ( ! isset($_POST['_wpnonce'], $_POST['config_id']) || ! wp_verify_nonce( sanitize_text_field(wp_unslash($_POST['_wpnonce'])), // Đã sửa 'adpagex_set_active_' . sanitize_text_field(wp_unslash($_POST['config_id'])) ) ) { wp_die( esc_html__( 'Security check failed', 'adpagex' ) ); } if ( ! current_user_can('manage_options') ) { wp_die( esc_html__( 'Insufficient permissions', 'adpagex' ) ); } $config_id = sanitize_text_field(wp_unslash($_POST['config_id'])); $found = false; foreach ($configs as $cfg) { if ($cfg['id'] === $config_id) { $found = true; break; } } if ($found) { update_option('adpagex_active_config', $config_id); $active = $config_id; printf( '

%s

', esc_html__( 'Placement set as active!', 'adpagex' ) ); } else { printf( '

%s

', esc_html__( 'Invalid placement selected.', 'adpagex' ) ); } } } // Get placement for editing if specified $edit_config = null; if (isset($_GET['edit']) && !empty($_GET['edit'])) { $edit_id = sanitize_text_field(wp_unslash($_GET['edit'])); foreach ($configs as $cfg) { if ($cfg['id'] === $edit_id) { $edit_config = $cfg; break; } } } $this->enqueue_admin_assets(); // Enqueue styles and scripts include ADPAGEX_DIR . 'includes/views/placements-page.php'; } /** * Enqueues admin specific styles and scripts. */ private function enqueue_admin_assets() { wp_enqueue_style('wp-color-picker'); wp_enqueue_style('adpagex-admin-styles', ADPAGEX_URL . 'assets/css/admin-styles.css', [], ADPAGEX_VERSION); wp_enqueue_script('adpagex-admin-scripts', ADPAGEX_URL . 'assets/js/admin-scripts.js', ['jquery', 'wp-color-picker'], ADPAGEX_VERSION, true); wp_localize_script('adpagex-admin-scripts', 'adpagexData', [ 'enterCssSelector' => __('Enter CSS selector', 'adpagex'), 'remove' => __('Remove', 'adpagex'), 'selectorsRequired' => __('Please enter at least one selector for the rewarded ad trigger.', 'adpagex'), ]); } }