Initial
This commit is contained in:
223
lcp-data-blocks.php
Normal file
223
lcp-data-blocks.php
Normal file
@ -0,0 +1,223 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugin Name: LCP Data Blocks
|
||||
* Plugin URI: https://coosguide.com
|
||||
* Description: A plugin for displaying various charts and graphs in Local Content Pro
|
||||
* Version: 1.0.0
|
||||
* Author: CoosGuide
|
||||
* Author URI: https://coosguide.com
|
||||
* License: GPL v2 or later
|
||||
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
||||
* Text Domain: lcp
|
||||
*/
|
||||
|
||||
if (!defined('ABSPATH')) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
// Include block files
|
||||
require_once plugin_dir_path(__FILE__) . 'blocks/bar-graph/lcp-bar-graph.php';
|
||||
|
||||
/**
|
||||
* Add custom category for LCP blocks
|
||||
*/
|
||||
function lcp_block_categories($categories) {
|
||||
return array_merge(
|
||||
$categories,
|
||||
array(
|
||||
array(
|
||||
'slug' => 'lcp-blocks',
|
||||
'title' => __('LCP Blocks', 'lcp'),
|
||||
'icon' => 'chart-bar',
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
add_filter('block_categories_all', 'lcp_block_categories', 10, 1);
|
||||
|
||||
// Register the Data Collection Custom Post Type
|
||||
function lcp_register_data_collection_post_type() {
|
||||
$labels = array(
|
||||
'name' => _x('Data Collections', 'Post type general name', 'lcp-data'),
|
||||
'singular_name' => _x('Data Collection', 'Post type singular name', 'lcp-data'),
|
||||
'menu_name' => _x('Data Collections', 'Admin Menu text', 'lcp-data'),
|
||||
'name_admin_bar' => _x('Data Collection', 'Add New on Toolbar', 'lcp-data'),
|
||||
'add_new' => __('Add New', 'lcp-data'),
|
||||
'add_new_item' => __('Add New Data Collection', 'lcp-data'),
|
||||
'new_item' => __('New Data Collection', 'lcp-data'),
|
||||
'edit_item' => __('Edit Data Collection', 'lcp-data'),
|
||||
'view_item' => __('View Data Collection', 'lcp-data'),
|
||||
'all_items' => __('All Data Collections', 'lcp-data'),
|
||||
'search_items' => __('Search Data Collections', 'lcp-data'),
|
||||
'parent_item_colon' => __('Parent Data Collections:', 'lcp-data'),
|
||||
'not_found' => __('No data collections found.', 'lcp-data'),
|
||||
'not_found_in_trash' => __('No data collections found in Trash.', 'lcp-data'),
|
||||
'featured_image' => _x('Data Collection Cover Image', 'Overrides the "Featured Image" phrase', 'lcp-data'),
|
||||
'set_featured_image' => _x('Set cover image', 'Overrides the "Set featured image" phrase', 'lcp-data'),
|
||||
'remove_featured_image'=> _x('Remove cover image', 'Overrides the "Remove featured image" phrase', 'lcp-data'),
|
||||
'use_featured_image' => _x('Use as cover image', 'Overrides the "Use as featured image" phrase', 'lcp-data'),
|
||||
'archives' => _x('Data Collection archives', 'The post type archive label used in nav menus', 'lcp-data'),
|
||||
'insert_into_item' => _x('Insert into data collection', 'Overrides the "Insert into post" phrase', 'lcp-data'),
|
||||
'uploaded_to_this_item'=> _x('Uploaded to this data collection', 'Overrides the "Uploaded to this post" phrase', 'lcp-data'),
|
||||
'filter_items_list' => _x('Filter data collections list', 'Screen reader text for the filter links', 'lcp-data'),
|
||||
'items_list_navigation'=> _x('Data Collections list navigation', 'Screen reader text for the pagination', 'lcp-data'),
|
||||
'items_list' => _x('Data Collections list', 'Screen reader text for the items list', 'lcp-data'),
|
||||
);
|
||||
|
||||
$args = array(
|
||||
'labels' => $labels,
|
||||
'public' => true,
|
||||
'publicly_queryable' => true,
|
||||
'show_ui' => true,
|
||||
'show_in_menu' => true,
|
||||
'query_var' => true,
|
||||
'rewrite' => array('slug' => 'data-collection'),
|
||||
'capability_type' => 'post',
|
||||
'has_archive' => true,
|
||||
'hierarchical' => false,
|
||||
'menu_position' => null,
|
||||
'menu_icon' => 'dashicons-chart-area',
|
||||
'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields'),
|
||||
'show_in_rest' => true, // Enable Gutenberg editor
|
||||
);
|
||||
|
||||
register_post_type('lcp-data-collection', $args);
|
||||
}
|
||||
add_action('init', 'lcp_register_data_collection_post_type');
|
||||
|
||||
// Register meta field for datasets
|
||||
function lcp_register_meta_fields() {
|
||||
register_post_meta('lcp-data-collection', 'lcp_datasets', array(
|
||||
'show_in_rest' => true,
|
||||
'single' => true,
|
||||
'type' => 'array',
|
||||
'auth_callback' => function() {
|
||||
return current_user_can('edit_posts');
|
||||
},
|
||||
'sanitize_callback' => function($meta_value) {
|
||||
if (!is_array($meta_value)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$sanitized = array();
|
||||
foreach ($meta_value as $key => $dataset) {
|
||||
$sanitized[$key] = array(
|
||||
'dataset_name' => sanitize_text_field($dataset['dataset_name']),
|
||||
'dataset_source' => sanitize_text_field($dataset['dataset_source']),
|
||||
'dataset_json' => json_decode(wp_unslash($dataset['dataset_json']), true)
|
||||
);
|
||||
}
|
||||
return $sanitized;
|
||||
}
|
||||
));
|
||||
}
|
||||
add_action('init', 'lcp_register_meta_fields');
|
||||
|
||||
// Add meta box for datasets
|
||||
function lcp_add_datasets_meta_box() {
|
||||
add_meta_box(
|
||||
'lcp_datasets_meta_box',
|
||||
'Datasets',
|
||||
'lcp_render_datasets_meta_box',
|
||||
'lcp-data-collection',
|
||||
'normal',
|
||||
'high'
|
||||
);
|
||||
}
|
||||
add_action('add_meta_boxes', 'lcp_add_datasets_meta_box');
|
||||
|
||||
// Render the meta box
|
||||
function lcp_render_datasets_meta_box($post) {
|
||||
// Get existing datasets
|
||||
$datasets = get_post_meta($post->ID, 'lcp_datasets', true);
|
||||
|
||||
// Ensure it's an array
|
||||
if (!is_array($datasets)) {
|
||||
$datasets = array();
|
||||
}
|
||||
|
||||
// Convert PHP array to JSON for the React component
|
||||
$datasets_json = json_encode($datasets);
|
||||
|
||||
// Add nonce for verification
|
||||
wp_nonce_field('lcp_datasets_meta_box', 'lcp_datasets_meta_box_nonce');
|
||||
|
||||
// Add hidden input for data
|
||||
?>
|
||||
<input type="hidden" id="lcp_datasets_data" name="lcp_datasets_data" value="<?php echo esc_attr($datasets_json); ?>" />
|
||||
<div id="lcp-datasets-repeater" data-datasets="<?php echo esc_attr($datasets_json); ?>"></div>
|
||||
<?php
|
||||
}
|
||||
|
||||
// Save the meta box data
|
||||
function lcp_save_datasets_meta($post_id) {
|
||||
// Check if our nonce is set and verify it
|
||||
if (!isset($_POST['lcp_datasets_meta_box_nonce']) ||
|
||||
!wp_verify_nonce($_POST['lcp_datasets_meta_box_nonce'], 'lcp_datasets_meta_box')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an autosave, don't do anything
|
||||
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check the user's permissions
|
||||
if (!current_user_can('edit_post', $post_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Save the data
|
||||
if (isset($_POST['lcp_datasets_data'])) {
|
||||
$datasets = json_decode(wp_unslash($_POST['lcp_datasets_data']), true);
|
||||
if (is_array($datasets)) {
|
||||
update_post_meta($post_id, 'lcp_datasets', $datasets);
|
||||
}
|
||||
}
|
||||
}
|
||||
add_action('save_post_lcp-data-collection', 'lcp_save_datasets_meta');
|
||||
|
||||
// Enqueue scripts and styles for the admin
|
||||
function lcp_enqueue_admin_scripts($hook) {
|
||||
global $post;
|
||||
|
||||
// Only enqueue on our custom post type edit screen
|
||||
if ($hook == 'post-new.php' || $hook == 'post.php') {
|
||||
if (is_object($post) && $post->post_type == 'lcp-data-collection') {
|
||||
// Enqueue React and dependencies
|
||||
wp_enqueue_script('wp-element');
|
||||
wp_enqueue_script('wp-components');
|
||||
wp_enqueue_script('wp-data');
|
||||
|
||||
// Enqueue our custom scripts
|
||||
wp_enqueue_script(
|
||||
'lcp-form-repeater',
|
||||
plugins_url('build/index.js', __FILE__),
|
||||
array('wp-element', 'wp-components', 'wp-data'),
|
||||
filemtime(plugin_dir_path(__FILE__) . 'build/index.js'),
|
||||
true
|
||||
);
|
||||
|
||||
// Pass data to JavaScript
|
||||
wp_localize_script('lcp-form-repeater', 'lcpDataSettings', array(
|
||||
'root' => esc_url_raw(rest_url()),
|
||||
'nonce' => wp_create_nonce('wp_rest'),
|
||||
'postId' => $post->ID
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
add_action('admin_enqueue_scripts', 'lcp_enqueue_admin_scripts');
|
||||
|
||||
// Flush rewrite rules on plugin activation
|
||||
function lcp_data_activate() {
|
||||
lcp_register_data_collection_post_type();
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
register_activation_hook(__FILE__, 'lcp_data_activate');
|
||||
|
||||
// Flush rewrite rules on plugin deactivation
|
||||
function lcp_data_deactivate() {
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
register_deactivation_hook(__FILE__, 'lcp_data_deactivate');
|
||||
Reference in New Issue
Block a user