HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/biblioteka/wp-content/plugins/accordion-blocks/accordion-blocks.php
<?php

/**
 * Plugin Name: Accordion Blocks
 * Plugin URI: https://github.com/philbuchanan/Accordion-Blocks
 * Description: Gutenberg blocks for creating responsive accordion drop-downs.
 * Version: 1.5.0
 * Requires at least: 5.9
 * Tested up to: 5.9
 * Requires PHP: 7.3
 * Author: Phil Buchanan
 * Author URI: https://philbuchanan.com
 * License: GPLv2 or later
 */

// Make sure to not redeclare the class
if (!class_exists('PB_Accordion_Blocks')) :

class PB_Accordion_Blocks {

	/**
	 * Current plugin version number
	 * Set from parent plugin file
	 */
	public $plugin_version;



	/**
	 * Class constructor
	 * Sets up the plugin, including registering scripts.
	 */
	function __construct() {
		$basename = plugin_basename(__FILE__);

		$this->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('<a href="%s">%s</a>',
			'http://wordpress.org/plugins/accordion-blocks/',
			_x('Documentation', 'link to documentation on wordpress.org site', 'accordion-blocks')
		));

		array_push($links, sprintf('<a href="%s">%s</a>',
			'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'));
		} ?>

		<div class="wrap">
			<h2><?php _e('Accordion Blocks Settings', 'accordion-blocks'); ?></h2>
			<form method="POST" action="options.php">
				<?php
					settings_fields('accordion_blocks_settings');
					do_settings_sections('accordion_blocks_settings');
					submit_button();
				?>
			</form>
		</div>
	<?php }



	/**
	 * Register setting sections and individual settings
	 */
	public function settings_api_init() {
		add_settings_section(
			'accordion_blocks_global_settings_section',
			__('Global Settings', 'accordion-blocks'),
			array($this, 'accordion_blocks_global_settings_section_callback'),
			'accordion_blocks_settings'
		);

		add_settings_field(
			'accordion_blocks_load_scripts_globally',
			__('Scripts and Styles', 'accordion-blocks'),
			array($this, 'load_scripts_globally_setting_callback'),
			'accordion_blocks_settings',
			'accordion_blocks_global_settings_section',
			array(
				'label_for' => 'accordion_blocks_load_scripts_globally',
			)
		);
	}



	/**
	 * Callback function for Accordion Blocks global settings section
	 * Add section intro copy here (if necessary)
	 */
	public function accordion_blocks_global_settings_section_callback() {}



	/**
	 * Callback function for load scripts globally setting
	 */
	public function load_scripts_globally_setting_callback() {
		$load_scripts_globally = $this->should_load_scripts_globally(); ?>
		<fieldset>
			<legend class="screen-reader-text">
				<span><?php _e('Scripts and Styles', 'accordion-blocks'); ?></span>
			</legend>
			<label for="accordion_blocks_load_scripts_globally">
				<input
					type="checkbox"
					id="accordion_blocks_load_scripts_globally"
					name="accordion_blocks_load_scripts_globally"
					aria-describedby="load-scripts-globally"
					<?php checked($load_scripts_globally); ?>
				>
				<?php _e('Load scripts and styles globally', 'accordion-blocks'); ?>
			</label>
			<div id="load-scripts-globally">
				<p class="description">
					<?php _e('Turning this off may cause accordions to stop working in some instances.', 'accordion-blocks'); ?>
				</p>
				<p class="description">
					<?php _e('Turn this on if you use accordions outside of the main content editor, or are adding accordions programatically.', 'accordion-blocks'); ?>
				</p>
			</div>
		</fieldset>
	<?php }

}

$PB_Accordion_Blocks = new PB_Accordion_Blocks;

endif;