<?php /** * Override field methods * * @package kirki-framework/control-typography * @copyright Copyright (c) 2023, Themeum * @license https://opensource.org/licenses/MIT * @since 1.0 */ namespace Kirki\Field; use Kirki\Field; /** * Field overrides. * * @since 1.0 */ class Upload extends Field { /** * The field type. * * @access public * @since 1.0 * @var string */ public $type = 'kirki-upload'; /** * The control class-name. * * @access protected * @since 0.1 * @var string */ protected $control_class = '\Kirki\Control\Upload'; /** * Filter arguments before creating the setting. * * @access public * @since 0.1 * @param array $args The field arguments. * @param WP_Customize_Manager $wp_customize The customizer instance. * @return array */ public function filter_setting_args( $args, $wp_customize ) { if ( $args['settings'] === $this->args['settings'] ) { $args = parent::filter_setting_args( $args, $wp_customize ); // Set the sanitize-callback if none is defined. if ( ! isset( $args['sanitize_callback'] ) || ! $args['sanitize_callback'] ) { $args['sanitize_callback'] = function( $value ) { $save_as = isset( $this->args['choices']['save_as'] ) ? $this->args['choices']['save_as'] : 'url'; return self::sanitize( $value, $save_as ); }; } } return $args; } /** * Filter arguments before creating the control. * * @access public * @since 0.1 * @param array $args The field arguments. * @param WP_Customize_Manager $wp_customize The customizer instance. * @return array */ public function filter_control_args( $args, $wp_customize ) { if ( $args['settings'] === $this->args['settings'] ) { $args = parent::filter_control_args( $args, $wp_customize ); $args['type'] = 'upload'; } return $args; } /** * Sanitizes the field value. * * @since 1.0.2 * * @param mixed $value The field value. * @param string $save_as The expected saving format. * * @return mixed */ public static function sanitize( $value, $save_as = 'url' ) { if ( 'array' === $save_as ) { if ( is_array( $value ) ) { return [ 'id' => ( isset( $value['id'] ) && '' !== $value['id'] ) ? (int) $value['id'] : '', 'url' => ( isset( $value['url'] ) && '' !== $value['url'] ) ? esc_url_raw( $value['url'] ) : '', 'filename' => ( isset( $value['filename'] ) && '' !== $value['filename'] ) ? sanitize_text_field( $value['filename'] ) : '', ]; } elseif ( is_string( $value ) && ! is_numeric( $value ) ) { // Here, we assume that the value is the URL. $attachment_id = attachment_url_to_postid( $value ); return [ 'id' => $attachment_id, 'url' => $value, 'filename' => basename( get_attached_file( $attachment_id ) ), ]; } else { // Here, we assume that the value is int or numeric (the attachment ID). $value = absint( $value ); return [ 'id' => $value, 'url' => wp_get_attachment_url( $value ), 'filename' => basename( get_attached_file( $value ) ), ]; } } elseif ( 'id' === $save_as ) { if ( is_string( $value ) && ! is_numeric( $value ) ) { // Here, we assume that the value is the URL. return attachment_url_to_postid( $value ); } elseif ( is_array( $value ) && isset( $value['id'] ) ) { return absint( $value['id'] ); } // Here, we assume that the value is int or numeric (the attachment ID). return absint( $value ); } // If we're reaching this point, then we're saving the URL. if ( is_array( $value ) && isset( $value['url'] ) ) { $value = $value['url']; } elseif ( is_numeric( $value ) ) { $value = absint( $value ); $value = wp_get_attachment_url( $value ); } else { $value = esc_url_raw( $value ); } return $value; } }