Files
local-content-pro/functions.php
2025-01-03 16:33:20 -08:00

578 lines
22 KiB
PHP

<?php
include get_template_directory() . '/includes/classes/wp-hooks.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' );
/* 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_enqueue_scripts', 'lcp_header_height_style',1);
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() . '/assets/js/lcp.js');
wp_enqueue_script('lcp-ui-script', get_template_directory_uri() . '/assets/js/lcp-ui.js');
}
add_action('wp_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);
}
// Function to read and display icon sets from the JSON file
// Function to read and display icon sets from the JSON file
function lcp_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 lcp_enqueue_dashboard_styles($hook) {
// Enqueue CSS for the dashboard
wp_enqueue_style(
'lcp-dashboard-css',
get_template_directory_uri() . '/assets/css/dashboard.css'
);
}
add_action('admin_enqueue_scripts', 'lcp_enqueue_dashboard_styles');
// Handle the AJAX request for installing icon sets
function lcp_install_icon_set($defaults = false) {
$json_path = get_template_directory() . '/assets/json/icons/icon-definitions.json';
if ($defaults) {
// Import only the default icons
if (file_exists($json_path)) {
$json_data = file_get_contents($json_path);
$icon_sets = json_decode($json_data, true);
// Loop through all icon sets and filter for default icons
foreach ($icon_sets as $icon_set) {
if (isset($icon_set['default']) && $icon_set['default'] === true) {
$file_name = $icon_set['fileName']; // Assuming the JSON structure has 'fileName' key
$icon_file_path = get_template_directory() . '/assets/json/icons/' . $file_name;
if (file_exists($icon_file_path)) {
$icon_data = file_get_contents($icon_file_path);
$icon_json = json_decode($icon_data, true);
// Check if svgs exist and process them
if (isset($icon_json[0]['svgs']) && is_array($icon_json[0]['svgs'])) {
foreach ($icon_json[0]['svgs'] as $svg) {
global $wpdb;
$table_name = $wpdb->prefix . 'lcp_icons';
// Insert the SVG data into the database
$wpdb->insert(
$table_name,
array(
'icon_name' => $svg['name'],
'icon_set_id' => $icon_set['id'],
'icon_family' => $icon_set['setFamily'],
'icon_version' => $icon_set['version'],
'paths' => ($svg['paths']),
'viewbox' => sanitize_text_field($svg['viewBox']),
'icon_id' => sanitize_text_field($svg['id']),
)
);
}
} else {
wp_send_json_error(array('message' => 'SVGs data not found in the JSON file.'));
}
} else {
wp_send_json_error(array('message' => 'SVG file for default set not found.'));
}
}
}
} else {
wp_send_json_error(array('message' => 'Icon definitions file not found.'));
}
} elseif (isset($_POST['icon_set_id'])) {
// Default behavior - check for icon_set_id in $_POST
if (!isset($_POST['icon_set_id'])) {
wp_send_json_error(array('message' => 'Invalid icon set ID.'));
}
$icon_set_id = intval($_POST['icon_set_id']);
// Create the database table if it doesn't exist
lcp_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) {
$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);
// 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'])) {
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'],
'icon_set_id' => $selected_icon_set['id'],
'icon_family' => $selected_icon_set['setFamily'],
'icon_version' => $selected_icon_set['version'],
'paths' => ($svg['paths']),
'viewbox' => sanitize_text_field($svg['viewBox']),
'icon_id' => sanitize_text_field($svg['id']),
)
);
}
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', 'lcp_install_icon_set');
// Function to create the icons table in the database if it doesn't exist
function lcp_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);
}
// Handle the AJAX request for uninstalling icon sets
function lcp_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', 'lcp_uninstall_icon_set');
/* Import Demo Posts */
function lcp_import_demo_posts() {
$json_data = file_get_contents(get_template_directory() . '/assets/json/demo-posts.json');
// Check if the JSON data is successfully fetched and decoded
if (empty($json_data)) {
return;
}
$posts = json_decode($json_data, true)['posts'];
if (empty($posts)) {
return;
}
// Arrays to store post IDs and media (thumbnail) IDs
$post_ids = [];
$media_ids = [];
foreach ($posts as $post) {
// Prepare post data
$post_data = array(
'post_title' => wp_strip_all_tags($post['title']),
'post_content' => $post['content'],
'post_excerpt' => isset($post['excerpt']) ? $post['excerpt'] : '',
'post_status' => isset($post['status']) ? $post['status'] : 'draft', // Default to 'draft' if no status
'post_date' => isset($post['date']) ? $post['date'] : current_time('mysql'),
'post_type' => 'post',
'post_author' => 1, // Change if you have specific user IDs
);
// Insert the post into the database
$post_id = wp_insert_post($post_data);
// If there was an issue inserting the post, skip this one
if (is_wp_error($post_id)) {
continue;
}
// Store the post ID in the array
$post_ids[] = $post_id;
// Assign categories (if they exist)
if (!empty($post['category'])) {
$category = term_exists($post['category'], 'category');
if ($category) {
wp_set_post_terms($post_id, array($category['term_id']), 'category');
} else {
// If category doesn't exist, create it
$category_id = wp_create_term($post['category'], 'category');
wp_set_post_terms($post_id, array($category_id['term_id']), 'category');
}
}
// Assign tags (if they exist)
if (!empty($post['tags'])) {
wp_set_post_terms($post_id, $post['tags'], 'post_tag');
}
// Handle thumbnail (featured image)
if (!empty($post['thumbnail'])) {
$thumbnail_url = get_template_directory_uri() . '/assets/img/demo-post-thumbnails/' . $post['thumbnail'];
// Download the image and add it to the media library
$thumbnail_id = media_handle_sideload(
array(
'name' => basename($thumbnail_url),
'tmp_name' => download_url($thumbnail_url)
),
$post_id
);
// If the image was uploaded successfully, set it as the post's featured image
if (!is_wp_error($thumbnail_id)) {
set_post_thumbnail($post_id, $thumbnail_id);
// Store the media ID in the array
$media_ids[] = $thumbnail_id;
}
}
// You can add additional meta fields if necessary
// Example:
// update_post_meta($post_id, 'some_meta_key', 'some_value');
}
// After all posts are imported, update the 'lcp_demo_posts' option
$demo_posts_data = array(
'post_ids' => $post_ids,
'media_ids' => $media_ids,
);
update_option('lcp_demo_posts', $demo_posts_data);
// Optionally, you can log the post and media IDs
// var_dump($post_ids, $media_ids); // Uncomment this line if you need to inspect the result
}
/* Delete the Demo Posts */
// Get the lcp_demo_posts option and delete all the posts from there
function lcp_delete_demo_posts() {
// Get the lcp_demo_posts option
$demo_posts_data = get_option('lcp_demo_posts');
// Check if the option exists and contains data
if (!empty($demo_posts_data) && isset($demo_posts_data['post_ids']) && isset($demo_posts_data['media_ids'])) {
// Loop through and delete posts
foreach ($demo_posts_data['post_ids'] as $post_id) {
// Delete post, force delete if necessary (set true for delete permanently)
wp_delete_post($post_id, true); // true will permanently delete
}
// Loop through and delete media (attachments)
foreach ($demo_posts_data['media_ids'] as $media_id) {
// Delete attachment (media file)
wp_delete_attachment($media_id, true); // true will permanently delete
}
// After deletion, remove the option from wp_options table
delete_option('lcp_demo_posts');
// Optionally, you can log the deletion for confirmation
// error_log('Demo posts and media have been deleted.');
} else {
// If the option doesn't exist, or it's empty
error_log('No demo posts data found or already deleted.');
}
}
/* Localize */
add_action('wp_ajax_lcp_import_demo_posts', 'lcp_import_demo_posts_ajax_handler');
// Define the function to handle the AJAX request
function lcp_import_demo_posts_ajax_handler() {
// Check for permissions (optional: can be used to ensure only admins can trigger this)
if (!current_user_can('manage_options')) {
wp_send_json_error('You do not have sufficient permissions to perform this action.');
}
// Call the existing function that imports the demo posts
lcp_import_demo_posts();
// Send a success response back to the browser
wp_send_json_success('Demo posts imported successfully.');
}
add_action('wp_ajax_lcp_delete_demo_posts', 'lcp_delete_demo_posts_ajax_handler');
// Define the function to handle the delete demo posts AJAX request
function lcp_delete_demo_posts_ajax_handler() {
// Verify nonce for security
if (!isset($_POST['lcp_import_nonce']) || !wp_verify_nonce($_POST['lcp_import_nonce'], 'lcp_import_demo_posts_nonce')) {
wp_send_json_error('Invalid nonce');
}
// Check if the current user has permissions to manage options
if (!current_user_can('manage_options')) {
wp_send_json_error('You do not have sufficient permissions to perform this action.');
}
// Call the function that deletes the demo posts
lcp_delete_demo_posts();
// Send a success response back to the browser
wp_send_json_success('Demo posts deleted successfully.');
}