File "class-settings.php"

Full path: /home/dora/public_html/wp-content/plugins/wp-grid-builder/includes/settings/class-settings.php
File size: 3.87 KB
MIME-type: --
Charset: utf-8

<?php
/**
 * Registry
 *
 * @package   WP Grid Builder
 * @author    Loïc Blascos
 * @copyright 2019-2022 Loïc Blascos
 */

namespace WP_Grid_Builder\Includes\Settings;

use WP_Grid_Builder\Includes\Singleton;

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Setting fields API
 *
 * @class WP_Grid_Builder\Includes\Settings\Settings
 * @since 1.0.0
 */
class Settings extends Form {

	use Registry;
	use Singleton;

	/**
	 * Holds settings.
	 *
	 * @since 1.0.0
	 * @var array
	 */
	public $settings = [];

	/**
	 * Field nonce.
	 *
	 * @since 1.0.0
	 * @var string
	 */
	private $nonce = 'wpgb_fields_nonce';

	/**
	 * Save acton name.
	 *
	 * @since 1.0.0
	 * @var string
	 */
	private $action = 'wpgb_fields';

	/**
	 * Metadata key.
	 *
	 * @since 1.0.0
	 * @var string
	 */
	private $key = '_wpgb';

	/**
	 * Fields slug.
	 *
	 * @since 1.0.0
	 * @var string
	 */
	public $slug = 'wpgb';

	/**
	 * Constructor
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function __construct() { // phpcs:ignore Generic.CodeAnalysis.UselessOverridingMethod.Found

		parent::__construct();

	}

	/**
	 * Register settings
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $settings Holds settings.
	 * @param array $defaults Holds default setting values.
	 */
	public function register( $settings = [], $defaults = [] ) {

		$this->add( $settings, $defaults );

	}

	/**
	 * Render settings form
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param string $id     Settings id.
	 * @param array  $values Holds field values.
	 */
	public function render( $id = '', $values = [] ) {

		$this->settings = $this->get( $id );

		if ( empty( $this->settings ) ) {
			return;
		}

		$this->settings['values'] = $values;
		do_action( 'wp_grid_builder/settings/render_fields', $this->settings );

		$this->output();

	}

	/**
	 * Save setting fields (metadata)
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param string $id   Settings id.
	 * @param string $type Metadata type.
	 */
	public function save( $id = '', $type = '' ) {

		$post = $this->post();

		if ( false === $post ) {
			return;
		}

		$old = get_metadata( $type, $id, $this->key, true );
		$new = $this->sanitize( $post );
		$new = wp_parse_args( $new, $old );
		$new = apply_filters( 'wp_grid_builder/settings/save_fields', $new, $type, $id );
		$new = wp_slash( $new );

		update_metadata( $type, $id, $this->key, $new );

	}

	/**
	 * Sanitize setting fields
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $settings Holds settings values.
	 * @param array $fields   Holds settings fields.
	 * @param array $values   Holds Sanitized values.
	 * @return array Sanitized values.
	 */
	public function sanitize( $settings = [], $fields = [], $values = [] ) {

		if ( empty( $fields ) ) {
			$fields = $this->get_fields();
		}

		foreach ( $settings as $key => $value ) {

			if ( ! empty( $fields[ $key ]['fields'] ) ) {
				// Recursively sanitize subfield values.
				$value = $this->sanitize( $value, $fields[ $key ]['fields'] );
			}

			if ( isset( $fields[ $key ] ) ) {
				// Sanitize field value or all subfield values from table, repeater, builder, etc...
				$values[ $key ] = $this->sanitize_field_value( $fields[ $key ], $value );
			} elseif ( is_array( $value ) ) {

				// We sanitize unknown key.
				$key = sanitize_key( $key );
				// Allow to sanitize array of values if sub keys exist.
				$values[ $key ] = $this->sanitize( $value, $fields );

			}
		}

		return $values;

	}

	/**
	 * Check nonce and get field values.
	 *
	 * @since 1.0.0
	 * @access private
	 *
	 * @return array Holds field values.
	 */
	private function post() {

		$data = wp_unslash( $_POST );

		if ( empty( $data[ $this->slug ] ) ) {
			return false;
		}

		if ( empty( $data[ $this->nonce ] ) ) {
			return false;
		}

		if ( ! wp_verify_nonce( $data[ $this->nonce ], $this->action ) ) {
			return false;
		}

		return $data[ $this->slug ];

	}
}