'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( '
', 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( '', esc_html__( 'Placement set as active!', 'adpagex' ) );
} else {
printf( '', 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'),
]);
}
}