Files
local-content-pro/functions.php
2025-01-02 03:07:43 -08:00

620 lines
23 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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');
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');
wp_enqueue_script('lcp-ui', get_template_directory_uri() . '/assets/js/lcp-ui.js');
// Enqueue custom script to handle the Demo post import AJAX request
wp_enqueue_script('lcp-import-demo-posts-ajax', get_template_directory_uri() . '/assets/js/demo-posts-import.js', array(), null, true);
// Add the AJAX URL and nonce as JavaScript variables
wp_localize_script('lcp-import-demo-posts-ajax', 'lcp_ajax_obj', array(
'ajax_url' => admin_url('admin-ajax.php'), // This is the URL that well send the AJAX request to
'nonce' => wp_create_nonce('lcp_import_demo_posts_nonce') // Security nonce for validation
));
}
add_action('admin_enqueue_scripts', 'lcp_backend_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);
}
/* BACKEND ICON ADDER */
// Register the dashboard page in the admin menu
function lcp_register_dashboard_page() {
add_menu_page(
'Icon Management', // Page Title
'Icon Management', // Menu Title
'manage_options', // Capability
'icon-management', // Menu Slug
'lcp_dashboard_page', // Callback function
'dashicons-images-alt2', // Icon for the menu item
60 // Position
);
}
add_action('admin_menu', 'lcp_register_dashboard_page');
// Callback function to display the dashboard page content
function lcp_dashboard_page() {
?>
<div class="wrap">
<h1><?php esc_html_e('Icon Management Dashboard', 'lcp'); ?></h1>
<div id="icon-dashboard-container">
<?php lcp_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 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);
}
function lcp_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', 'lcp_ajax', array(
'ajax_url' => admin_url('admin-ajax.php')
));
}
add_action('admin_enqueue_scripts', 'lcp_enqueue_dashboard_scripts');
// 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.');
}