plugin_version = $this->get_plugin_version(); // Register block add_action('init', array($this, 'register_block')); // Enqueue frontend assets add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets')); // Tell WordPress which JavaScript files contain translations add_action('init', array($this, 'set_script_translations')); if (is_admin()) { // Add link to documentation on plugin page add_filter("plugin_action_links_$basename", array($this, 'add_documentation_link')); } // Register defaults site setting add_action('rest_api_init', array($this, 'register_settings')); add_action('admin_init', array($this, 'register_settings')); // Add API endpoint to get and set settings add_action('rest_api_init', array($this, 'register_rest_routes')); // Add settings page add_action('admin_menu', array($this, 'add_settings_menu')); add_action('admin_init', array($this, 'settings_api_init')); } /** * Current plugin version number */ private function get_plugin_version() { $plugin_data = get_file_data(__FILE__, array('Version' => 'Version'), false); return (defined('WP_DEBUG') && WP_DEBUG) ? time() : $plugin_data['Version']; } /** * Register the block's assets for the editor */ public function register_block() { register_block_type(__DIR__); } /** * Enqueue the block's assets for the frontend */ public function enqueue_frontend_assets() { $load_scripts_globally = $this->should_load_scripts_globally(); if ($load_scripts_globally || has_block('pb/accordion-item', get_the_ID())) { $min = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min'; wp_enqueue_script( 'pb-accordion-blocks-frontend-script', plugins_url("js/accordion-blocks$min.js", __FILE__), array('jquery'), $this->plugin_version, true ); wp_enqueue_style( 'pb-accordion-blocks-style', plugins_url('build/index.css', __FILE__), array(), $this->plugin_version ); } } /** * Tell WordPress which JavaScript files contain translations */ function set_script_translations() { wp_set_script_translations('pb-accordion-blocks-editor-script', 'accordion-blocks'); } /** * Register accordion defaults site setting */ public function register_settings() { register_setting( 'general', 'accordion_blocks_defaults', array( 'type' => 'object', 'show_in_rest' => array( 'schema' => array( 'type' => 'object', 'properties' => array( 'initiallyOpen' => array( 'type' => 'boolean', ), 'clickToClose' => array( 'type' => 'boolean', ), 'autoClose' => array( 'type' => 'boolean', ), 'scroll' => array( 'type' => 'boolean', ), 'scrollOffset' => array( 'type' => 'integer', ), ), ), ), 'default' => array( 'initiallyOpen' => false, 'clickToClose' => true, 'autoClose' => true, 'scroll' => false, 'scrollOffset' => 0, ), ) ); register_setting( 'accordion_blocks_settings', 'accordion_blocks_load_scripts_globally', array( 'type' => 'boolean', 'default' => 'on', ) ); } /** * Register rest endpoint to get and set plugin defaults */ public function register_rest_routes() { register_rest_route('accordion-blocks/v1', '/defaults', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array($this, 'api_get_defaults'), 'permission_callback' => function() { return current_user_can('edit_posts'); } )); register_rest_route('accordion-blocks/v1', '/defaults', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array($this, 'api_set_defaults'), 'permission_callback' => function() { return current_user_can('publish_pages'); } )); } /** * Get accordion block default settings * * @return object Default accordion block settings object */ public function api_get_defaults(WP_REST_Request $request) { $response = new WP_REST_Response(get_option('accordion_blocks_defaults')); $response->set_status(200); return $response; } /** * Set accordion block default settings * * @param data object The date passed from the API * @return object Default accordion block settings object */ public function api_set_defaults($request) { $old_defaults = get_option('accordion_blocks_defaults'); $new_defaults = json_decode($request->get_body()); $new_defaults = (object) array( 'initiallyOpen' => isset($new_defaults->initiallyOpen) ? $new_defaults->initiallyOpen : $old_defaults->initiallyOpen, 'clickToClose' => isset($new_defaults->clickToClose) ? $new_defaults->clickToClose : $old_defaults->clickToClose, 'autoClose' => isset($new_defaults->autoClose) ? $new_defaults->autoClose : $old_defaults->autoClose, 'scroll' => isset($new_defaults->scroll) ? $new_defaults->scroll : $old_defaults->scroll, 'scrollOffset' => isset($new_defaults->scrollOffset) ? $new_defaults->scrollOffset : $old_defaults->scrollOffset, ); $updated = update_option('accordion_blocks_defaults', $new_defaults); $response = new WP_REST_Response($new_defaults); $response->set_status($updated ? 201 : 500); return $response; } /** * Add documentation link on plugin page */ public function add_documentation_link($links) { array_push($links, sprintf('%s', 'http://wordpress.org/plugins/accordion-blocks/', _x('Documentation', 'link to documentation on wordpress.org site', 'accordion-blocks') )); array_push($links, sprintf('%s', 'https://philbuchanan.com/donate/', __('Donate', 'accordion-blocks') )); return $links; } /** * Get the load_scripts_globally option and return true or false. */ private function should_load_scripts_globally() { /** * This removes the old option (the option name had a typo), but ensures * the new option gets updated with the same setting. */ if (get_option('accordion_blocks_load_scripts_globablly') == 'on') { update_option('accordion_blocks_load_scripts_globally', 'on'); } delete_option('accordion_blocks_load_scripts_globablly'); $load_scripts_globally = get_option('accordion_blocks_load_scripts_globally', 'on'); return !!$load_scripts_globally; } /** * Add the admin menu settings page */ public function add_settings_menu() { add_options_page( __('Accordion Blocks Settings', 'accordion-blocks'), __('Accordion Blocks', 'accordion-blocks'), 'manage_options', 'accordion_blocks_settings', array($this, 'render_settings_page') ); } /** * Render the settings page */ public function render_settings_page() { if (!current_user_can('manage_options')) { wp_die(__('You do not have sufficient permissions to access this page.', 'accordion-blocks')); } ?>