418 lines
15 KiB
PHP
418 lines
15 KiB
PHP
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//include get_template_directory(). '/includes/blocks/lcp-gallery/lcp-gallery.php';
|
|
include get_template_directory() . '/includes/classes/blocks.php';
|
|
new Lcp_Blocks();
|
|
|
|
|
|
// Include backend php
|
|
include get_template_directory() . '/includes/classes/backend.php';
|
|
|
|
|
|
function lcp_block_theme_setup() {
|
|
add_theme_support( 'block-templates' );
|
|
}
|
|
add_action( 'after_setup_theme', 'lcp_block_theme_setup' );
|
|
|
|
function lcp_enqueue() {
|
|
// Enqueue the theme's main stylesheet (style.css)
|
|
wp_enqueue_style('lcp-style', get_stylesheet_uri());
|
|
wp_enqueue_script('lcp-script', get_template_directory_uri() . '/script.js');
|
|
wp_enqueue_script('lcp-ui-script', get_template_directory_uri() . '/assets/js/lcp-ui.js');
|
|
|
|
}
|
|
|
|
add_action('wp_enqueue_scripts', 'lcp_enqueue');
|
|
|
|
|
|
|
|
function lcp_backend_enqueue() {
|
|
// Enqueue the theme's main stylesheet (style.css)
|
|
wp_enqueue_style('lcp-style', get_stylesheet_uri());
|
|
wp_enqueue_script('lcp-script', get_template_directory_uri() . '/script.js');
|
|
|
|
}
|
|
|
|
add_action('admin_enqueue_scripts', 'lcp_enqueue');
|
|
|
|
|
|
/* KEY POINTS */
|
|
function add_key_points_meta_box() {
|
|
add_meta_box(
|
|
'key_points_meta_box', // ID of the meta box
|
|
'Key Points', // Title of the meta box
|
|
'render_key_points_meta_box', // Callback function to display the meta box
|
|
'post', // Post type (you can change it to other post types)
|
|
'normal', // Context (normal, side, advanced)
|
|
'default' // Priority
|
|
);
|
|
}
|
|
// Add meta box if setting is turned on
|
|
$options = get_option('lcp_theme_settings', array());
|
|
$enable_key_points_meta = isset($options['enable_key_points_meta']) ? $options['enable_key_points_meta'] : 0;
|
|
|
|
// Check if 'enable_key_points_meta' is enabled (1), then add the meta box
|
|
if ($enable_key_points_meta) {
|
|
// Hook into add_meta_boxes to register the custom meta box
|
|
add_action('add_meta_boxes', 'add_key_points_meta_box');
|
|
}
|
|
|
|
// Sanitize the SVGs data
|
|
function lcp_custom_svgs_sanitize($input) {
|
|
// Ensure the input is an array
|
|
if (is_array($input)) {
|
|
foreach ($input as $key => $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) : [];
|
|
?>
|
|
<div id="key-points-repeater">
|
|
<ul id="key-points-list">
|
|
<?php foreach ($key_points as $index => $point) : ?>
|
|
<li class="key-point">
|
|
<input type="text" name="key_points[<?php echo $index; ?>]" value="<?php echo esc_attr($point); ?>" class="key-point-input" />
|
|
<button type="button" class="remove-key-point">Remove</button>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<button type="button" id="add-key-point">Add Key Point</button>
|
|
</div>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
const addButton = document.getElementById('add-key-point');
|
|
const keyPointsList = document.getElementById('key-points-list');
|
|
|
|
// Function to add a new key point input field
|
|
addButton.addEventListener('click', function () {
|
|
const index = keyPointsList.children.length;
|
|
const newItem = document.createElement('li');
|
|
newItem.classList.add('key-point');
|
|
|
|
newItem.innerHTML = `
|
|
<input type="text" name="key_points[${index}]" value="" class="key-point-input" />
|
|
<button type="button" class="remove-key-point">Remove</button>
|
|
`;
|
|
keyPointsList.appendChild(newItem);
|
|
});
|
|
|
|
// Function to remove a key point input field
|
|
keyPointsList.addEventListener('click', function (e) {
|
|
if (e.target && e.target.classList.contains('remove-key-point')) {
|
|
e.target.closest('.key-point').remove();
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
// Save the meta box data
|
|
function save_key_points_meta_box($post_id) {
|
|
// Check if this is an autosave or if the nonce is missing
|
|
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
|
|
if (!isset($_POST['key_points'])) return $post_id;
|
|
|
|
// Sanitize and store the key points as a serialized array
|
|
$key_points = array_map('sanitize_text_field', $_POST['key_points']);
|
|
update_post_meta($post_id, 'key_points', serialize($key_points)); // Use serialize instead of json_encode
|
|
}
|
|
add_action('save_post', 'save_key_points_meta_box');
|
|
|
|
|
|
|
|
// 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() {
|
|
?>
|
|
<div class="wrap">
|
|
<h1><?php esc_html_e('Icon Management Dashboard', 'mytheme'); ?></h1>
|
|
<div id="icon-dashboard-container">
|
|
<?php mytheme_display_icon_sets(); ?>
|
|
</div> <!-- This will be populated by PHP -->
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
// Function to read and display icon sets from the JSON file
|
|
// Function to read and display icon sets from the JSON file
|
|
function mytheme_display_icon_sets() {
|
|
// Path to the JSON file
|
|
$json_path = get_template_directory() . '/assets/json/icons/icon-definitions.json';
|
|
|
|
// Check if the file exists
|
|
if (file_exists($json_path)) {
|
|
// Get the contents of the JSON file
|
|
$json_data = file_get_contents($json_path);
|
|
|
|
// Decode JSON data into a PHP array
|
|
$icon_sets = json_decode($json_data, true);
|
|
|
|
// Loop through the icon sets and output HTML
|
|
foreach ($icon_sets as $icon_set) {
|
|
?>
|
|
<div class="icon-set">
|
|
<h3><?php echo esc_html($icon_set['setFamily'] . ' - ' . $icon_set['setName']); ?></h3>
|
|
|
|
<!-- Add data-icon-set-id attribute to the Install and Uninstall buttons -->
|
|
<button class="install-btn" data-icon-set-id="<?php echo esc_attr($icon_set['id']); ?>">Install</button>
|
|
<button class="uninstall-btn" data-icon-set-id="<?php echo esc_attr($icon_set['id']); ?>">Uninstall</button>
|
|
</div>
|
|
<?php
|
|
}
|
|
} else {
|
|
echo '<p>' . esc_html__('No icon definitions found.', 'lcp') . '</p>';
|
|
}
|
|
}
|
|
|
|
|
|
// Enqueue the dashboard styles only on the icon-management page
|
|
function mytheme_enqueue_dashboard_styles($hook) {
|
|
|
|
|
|
// 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
|
|
|
|
|
|
// 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');
|
|
|
|
|
|
/* Add Styles */
|
|
function lcp_header_height_style() {
|
|
// Fetch the lcp_header_height value from wp_options.
|
|
$header_height = get_option('lcp_header_height', 0); // Default to 0 if not found
|
|
|
|
// Ensure we have a valid value
|
|
if ($header_height) {
|
|
// Output the inline style tag with the CSS variable for header height
|
|
echo "<style>:root { --lcp--header--height: {$header_height}px; }</style>";
|
|
}
|
|
}
|
|
add_action('wp_head', 'lcp_header_height_style');
|