382 lines
14 KiB
PHP
382 lines
14 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');
|
|
|
|
}
|
|
|
|
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');
|
|
|
|
// Backend enqueue
|
|
function lcp_enqueue_svg_repeater_script($hook) {
|
|
// Only enqueue on the theme settings page
|
|
// if ($hook !== 'settings_page_lcp-theme-settings') {
|
|
// return;
|
|
// }
|
|
|
|
// Enqueue the script with a dependency on jQuery
|
|
wp_enqueue_script(
|
|
'lcp-svg-repeater', // Handle for the script
|
|
get_template_directory_uri() . '/assets/js/backend-script.js', // Path to your JS file
|
|
array(), // Dependency on jQuery
|
|
null, // No specific version
|
|
true // Load in footer (true)
|
|
);
|
|
}
|
|
add_action('admin_enqueue_scripts', 'lcp_enqueue_svg_repeater_script');
|
|
|
|
|
|
|
|
/* 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');
|
|
|
|
/* INSERT ICONS TO DB */
|
|
// Function to load the JSON file and insert SVG data into the database
|
|
function load_material_icons_into_db($jsonData) {
|
|
// Step 2: Decode the JSON data into a PHP array
|
|
$data = json_decode($jsonData, true);
|
|
|
|
// Check if JSON decoding was successful
|
|
if ($data === null) {
|
|
die("Error decoding the JSON data.");
|
|
}
|
|
|
|
// Step 3: Create the table if it doesn't exist
|
|
global $wpdb;
|
|
$table_name = $wpdb->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 '<p>Icons have been imported into the database.</p>';
|
|
}
|
|
|
|
|
|
// 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 */
|
|
function icon_sets_dashboard_callback() {
|
|
// Get the file path to the JSON file
|
|
$json_file_path = get_template_directory() . '/assets/json/icons/icon-definitions.json';
|
|
|
|
// Check if the file exists
|
|
if (file_exists($json_file_path)) {
|
|
// Read the file contents and decode the JSON
|
|
$json_data = file_get_contents($json_file_path);
|
|
$icon_sets = json_decode($json_data, true);
|
|
|
|
if ($icon_sets) {
|
|
// Group icon sets by setFamily
|
|
$grouped_sets = [];
|
|
foreach ($icon_sets as $set) {
|
|
// Check if the set has the setFamily key
|
|
$setFamily = isset($set['setFamily']) ? $set['setFamily'] : 'Unknown';
|
|
|
|
// Initialize the family group if not already initialized
|
|
if (!isset($grouped_sets[$setFamily])) {
|
|
$grouped_sets[$setFamily] = [];
|
|
}
|
|
|
|
// Handle both 'file' and 'fileName'
|
|
// Check if 'file' is set or fallback to 'fileName'
|
|
$setFile = isset($set['file']) ? $set['file'] : (isset($set['fileName']) ? $set['fileName'] : '');
|
|
|
|
// Ensure we are correctly adding the set data
|
|
$grouped_sets[$setFamily][] = [
|
|
'id' => $set['id'],
|
|
'setName' => $set['setName'],
|
|
'file' => $setFile
|
|
];
|
|
}
|
|
|
|
// Output the HTML for the dashboard
|
|
echo '<div class="wrap">';
|
|
echo '<h1>' . esc_html('Icon Sets Dashboard') . '</h1>';
|
|
|
|
// Loop through each setFamily and create a section with checkboxes
|
|
foreach ($grouped_sets as $setFamily => $sets) {
|
|
echo '<div class="lcp-icon-set">';
|
|
echo '<h2>' . esc_html($setFamily) . '</h2>';
|
|
echo '<ul>';
|
|
|
|
// Loop through each setName and create a checkbox
|
|
foreach ($sets as $set) {
|
|
$checkbox_id = 'icon_set_' . $set['id'];
|
|
echo '<li><input type="checkbox" id="' . esc_attr($checkbox_id) . '" name="icon_sets[]" value="' . esc_attr($set['file']) . '" data-icon-set-id="' . esc_attr($set['id']) . '">';
|
|
echo '<label for="' . esc_attr($checkbox_id) . '">' . esc_html($set['setName']) . '</label></li>';
|
|
}
|
|
|
|
echo '</ul>';
|
|
echo '</div>';
|
|
}
|
|
|
|
// Add submit button
|
|
echo '<form method="POST" action="">'; // Ensure the form method is POST
|
|
echo '<input type="submit" name="submit_icon_sets" value="Import Selected Icons" class="button-primary">';
|
|
echo '</form>';
|
|
|
|
echo '</div>';
|
|
|
|
// Handle form submission
|
|
if (isset($_POST['submit_icon_sets'])) {
|
|
// Debugging: Check if form is actually submitting data
|
|
echo '<pre>';
|
|
var_dump($_POST['icon_sets']); // Check if checkboxes are selected
|
|
echo '</pre>';
|
|
|
|
// Debugging: Display selected icon sets
|
|
if (isset($_POST['icon_sets']) && !empty($_POST['icon_sets'])) {
|
|
echo '<p>Selected icon sets:</p>';
|
|
echo '<pre>';
|
|
var_dump($_POST['icon_sets']); // Output the selected icon set values
|
|
echo '</pre>';
|
|
|
|
// Loop through selected icon sets and process the corresponding JSON files
|
|
foreach ($_POST['icon_sets'] as $file) {
|
|
// Look for the icon set that matches the selected file path
|
|
foreach ($icon_sets as $set) {
|
|
// Check if the 'file' or 'fileName' matches the selected file
|
|
if ($set['file'] == $file || (isset($set['fileName']) && $set['fileName'] == $file)) {
|
|
// Get the JSON file for the selected set
|
|
$jsonFilePath = get_template_directory() . '/assets/json/icons' . (isset($set['file']) ? $set['file'] : $set['fileName']);
|
|
|
|
// Debugging: Print the json file path being used
|
|
echo '<p>Loading file: ' . esc_html($jsonFilePath) . '</p>';
|
|
|
|
if (file_exists($jsonFilePath)) {
|
|
$jsonData = file_get_contents($jsonFilePath);
|
|
load_material_icons_into_db($jsonData); // Pass the JSON data to the function
|
|
} else {
|
|
echo '<p>Error: File ' . esc_html($jsonFilePath) . ' not found.</p>';
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
echo '<p>No icon sets selected.</p>';
|
|
}
|
|
}
|
|
|
|
} else {
|
|
echo '<p>No icon sets found in the JSON file.</p>';
|
|
}
|
|
} else {
|
|
echo '<p>Icon definitions JSON file not found.</p>';
|
|
}
|
|
}
|
|
|
|
|
|
function register_icon_dashboard_page() {
|
|
add_menu_page(
|
|
'Icon Sets', // Page Title
|
|
'Icon Sets', // Menu Title
|
|
'manage_options', // Capability required
|
|
'icon-sets-dashboard', // Menu slug
|
|
'icon_sets_dashboard_callback', // Callback function
|
|
'dashicons-admin-generic', // Icon
|
|
60 // Position in the menu
|
|
);
|
|
}
|
|
|
|
add_action('admin_menu', 'register_icon_dashboard_page');
|