$svg) {
// Sanitize the name and path for each SVG
if (isset($svg['name'])) {
$input[$key]['name'] = sanitize_text_field($svg['name']);
}
if (isset($svg['path'])) {
$input[$key]['path'] = sanitize_textarea_field($svg['path']);
}
}
}
return $input;
}
// Existing function to render the theme settings page
// Callback function to render the meta box
function render_key_points_meta_box($post) {
// Retrieve the stored key points (serialized data)
$key_points_serialized = get_post_meta($post->ID, '_key_points', true);
$key_points = !empty($key_points_serialized) ? unserialize($key_points_serialized) : [];
?>
$point) : ?>
prefix . 'lcp_icons'; // Table name with WordPress prefix
// Create the table if it does not exist
$sql = "
CREATE TABLE IF NOT EXISTS $table_name (
id VARCHAR(255) NOT NULL, -- Use the id from the JSON file
set_name VARCHAR(255) NOT NULL,
set_family VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
paths LONGTEXT NOT NULL,
viewbox VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// Step 4: Insert data into the database
foreach ($data as $iconSet) {
// Extract values for the set_name and set_family from the top-level object
$setName = sanitize_text_field($iconSet['name']);
$setFamily = sanitize_text_field($iconSet['family']);
// Insert each SVG in the 'svgs' array
if (isset($iconSet['svgs']) && is_array($iconSet['svgs'])) {
foreach ($iconSet['svgs'] as $svg) {
$name = sanitize_text_field($svg['name']);
// Unescape the paths field (HTML entities or Unicode escapes)
$paths = html_entity_decode($svg['paths']); // Decode HTML entities (like " or &)
$paths = stripslashes($paths); // Remove any additional escaping, such as slashes
$viewbox = sanitize_text_field($svg['viewBox']);
$id = sanitize_text_field($svg['id']); // Use the id from the JSON object
// Prepare the data for insertion
$data = array(
'id' => $id, // Use the id from the JSON object
'set_name' => $setName,
'set_family' => $setFamily,
'name' => $name,
'paths' => $paths,
'viewbox' => $viewbox,
);
// Insert into the database
$wpdb->insert($table_name, $data);
}
}
}
echo '
Icons have been imported into the database.
';
}
// Hook the function to the theme activation process
// Function to drop the lcp_icons table when the theme is deactivated
function drop_lcp_icons_table() {
global $wpdb;
// Table name with WordPress prefix
$table_name = $wpdb->prefix . 'lcp_icons';
// SQL query to drop the table
$sql = "DROP TABLE IF EXISTS $table_name;";
// Execute the query
$wpdb->query($sql);
}
// Hook the function to the theme deactivation process
// Register the function to run when the theme is switched (deactivated)
add_action('switch_theme', 'drop_lcp_icons_table');
/* BACKEND ICON ADDER */
// Register the dashboard page in the admin menu
function mytheme_register_dashboard_page() {
add_menu_page(
'Icon Management', // Page Title
'Icon Management', // Menu Title
'manage_options', // Capability
'icon-management', // Menu Slug
'mytheme_dashboard_page', // Callback function
'dashicons-images-alt2', // Icon for the menu item
60 // Position
);
}
add_action('admin_menu', 'mytheme_register_dashboard_page');
// Callback function to display the dashboard page content
function mytheme_dashboard_page() {
?>
' . esc_html__('No icon definitions found.', 'lcp') . '';
}
}
// Enqueue the dashboard styles only on the icon-management page
function mytheme_enqueue_dashboard_styles($hook) {
// Only load the styles on the icon-management page
if ($hook != 'toplevel_page_icon-management') {
return;
}
// Enqueue CSS for the dashboard
wp_enqueue_style(
'mytheme-dashboard-css',
get_template_directory_uri() . '/assets/css/dashboard.css'
);
}
add_action('admin_enqueue_scripts', 'mytheme_enqueue_dashboard_styles');
// Handle the AJAX request for installing icon sets
function mytheme_install_icon_set() {
if (!isset($_POST['icon_set_id'])) {
wp_send_json_error(array('message' => 'Invalid icon set ID.'));
}
$icon_set_id = intval($_POST['icon_set_id']);
$json_path = get_template_directory() . '/assets/json/icons/icon-definitions.json';
// Create the database table if it doesn't exist
mytheme_create_icons_table();
// Read the icon definitions JSON file
if (file_exists($json_path)) {
$json_data = file_get_contents($json_path);
$icon_sets = json_decode($json_data, true);
// Search for the selected icon set by ID
$selected_icon_set = null;
foreach ($icon_sets as $icon_set) {
if ($icon_set['id'] === $icon_set_id) {
$selected_icon_set = $icon_set;
break;
}
}
// If the icon set is found
if ($selected_icon_set) {
// Dynamically build the icon file path using the fileName from icon-definitions.json
$file_name = $selected_icon_set['fileName']; // Assuming the JSON structure has 'fileName' key
$icon_file_path = get_template_directory() . '/assets/json/icons/' . $file_name;
// Now read the corresponding SVG file for the icon set
if (file_exists($icon_file_path)) {
$icon_data = file_get_contents($icon_file_path);
$icon_json = json_decode($icon_data, true);
// Debugging: Check the structure of the decoded JSON
if (is_array($icon_json)) {
error_log(print_r($icon_json, true)); // Logs to PHP error log for inspection
}
// Loop through svgs if it exists and is an array
if (isset($icon_json[0]['svgs']) && is_array($icon_json[0]['svgs'])) {
// Insert rows with actual data from the SVG file
foreach ($icon_json[0]['svgs'] as $svg) {
global $wpdb;
$table_name = $wpdb->prefix . 'lcp_icons';
// Insert each SVG data into the database
$wpdb->insert(
$table_name,
array(
'icon_name' => $svg['name'], // Using the name from the SVG JSON
'icon_set_id' => $selected_icon_set['id'],
'icon_family' => $selected_icon_set['setFamily'], // Get family dynamically from the selected icon set
'icon_version' => $selected_icon_set['version'], // Get version dynamically from the selected icon set
'paths' => ($svg['paths']), // SVG paths from the JSON
'viewbox' => sanitize_text_field($svg['viewBox']), // Viewbox for the SVG
'icon_id' => sanitize_text_field($svg['id']) // Using the actual icon ID from the JSON
)
);
}
wp_send_json_success(array('message' => 'Icon set installed and rows added with actual data.'));
} else {
wp_send_json_error(array('message' => 'SVGs data not found in the JSON file.'));
}
} else {
wp_send_json_error(array('message' => 'SVG file not found.'));
}
} else {
wp_send_json_error(array('message' => 'Icon set not found.'));
}
} else {
wp_send_json_error(array('message' => 'Icon definitions not found.'));
}
}
add_action('wp_ajax_install_icon_set', 'mytheme_install_icon_set');
// Function to create the icons table in the database if it doesn't exist
// Function to create the icons table in the database if it doesn't exist
function mytheme_create_icons_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'lcp_icons';
$charset_collate = $wpdb->get_charset_collate();
// SQL to create the table if it doesn't exist
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, -- Auto-increment for the ID
icon_name VARCHAR(255),
icon_set_id VARCHAR(255),
icon_family VARCHAR(255),
icon_version VARCHAR(50),
paths TEXT,
viewbox VARCHAR(50),
icon_id VARCHAR(255) UNIQUE, -- Unique identifier for each SVG (based on SVG 'id')
PRIMARY KEY (id)
) $charset_collate;";
// Include the necessary WordPress file to run dbDelta
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
function mytheme_enqueue_dashboard_scripts($hook) {
// Only load the script on the icon-management page
if ($hook != 'toplevel_page_icon-management') {
return;
}
// Enqueue JavaScript for AJAX
wp_enqueue_script(
'icon-import-script',
get_template_directory_uri() . '/assets/js/icon-import.js',
array(), // No dependencies for vanilla JS
null,
true
);
// Pass the AJAX URL to the script
wp_localize_script('icon-import-script', 'mytheme_ajax', array(
'ajax_url' => admin_url('admin-ajax.php')
));
}
add_action('admin_enqueue_scripts', 'mytheme_enqueue_dashboard_scripts');
// Handle the AJAX request for uninstalling icon sets
function mytheme_uninstall_icon_set() {
// Ensure icon set ID is passed in the request
if (!isset($_POST['icon_set_id'])) {
wp_send_json_error(array('message' => 'Invalid icon set ID.'));
}
// Get the icon set ID from the request
$icon_set_id = intval($_POST['icon_set_id']); // Ensure it's an integer
global $wpdb;
// Define the table name
$table_name = $wpdb->prefix . 'lcp_icons';
// Delete all rows where the icon_set_id matches the passed ID
$deleted_rows = $wpdb->delete(
$table_name,
array('icon_set_id' => $icon_set_id), // Condition to match rows by icon_set_id
array('%d') // Sanitize the value as an integer
);
// Check if rows were deleted successfully
if ($deleted_rows) {
wp_send_json_success(array('message' => 'Icon set uninstalled and icons removed from the database.'));
} else {
wp_send_json_error(array('message' => 'No icons found for the specified icon set ID.'));
}
}
add_action('wp_ajax_uninstall_icon_set', 'mytheme_uninstall_icon_set');