357 lines
9.3 KiB
PHP
357 lines
9.3 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Controls
|
||
|
*
|
||
|
* @package visual-portfolio
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Class Visual_Portfolio_Controls
|
||
|
*/
|
||
|
class Visual_Portfolio_Controls {
|
||
|
/**
|
||
|
* Registered user categories to print it in the future.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private static $registered_categories = array();
|
||
|
|
||
|
/**
|
||
|
* Registered user fields to print it in the future.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private static $registered_fields = array();
|
||
|
|
||
|
/**
|
||
|
* Cached all registered controls.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private static $cached_all_registered_controls = array();
|
||
|
|
||
|
/**
|
||
|
* Cached saved layout meta.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private static $cached_saved_layout_meta = array();
|
||
|
|
||
|
/**
|
||
|
* Default control args.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
private static $default_args = array(
|
||
|
// category for registered fields.
|
||
|
'category' => '',
|
||
|
|
||
|
'type' => 'text',
|
||
|
'label' => false,
|
||
|
'description' => false,
|
||
|
'group' => false,
|
||
|
'name' => '',
|
||
|
'value' => '',
|
||
|
'placeholder' => '',
|
||
|
'readonly' => false,
|
||
|
'value_callback' => '',
|
||
|
'sanitize_callback' => '',
|
||
|
'reload_iframe' => true,
|
||
|
|
||
|
// control-specific args.
|
||
|
// notice.
|
||
|
'status' => 'info',
|
||
|
// select.
|
||
|
'options' => array(),
|
||
|
'searchable' => false,
|
||
|
'multiple' => false,
|
||
|
'creatable' => false,
|
||
|
// range.
|
||
|
'min' => '',
|
||
|
'max' => '',
|
||
|
'step' => '1',
|
||
|
// textarea.
|
||
|
'cols' => '',
|
||
|
'rows' => '',
|
||
|
// color.
|
||
|
'alpha' => false,
|
||
|
'gradient' => false,
|
||
|
// align.
|
||
|
'extended' => false,
|
||
|
// code editor.
|
||
|
'mode' => 'css',
|
||
|
'max_lines' => 20,
|
||
|
'min_lines' => 5,
|
||
|
'allow_modal' => true,
|
||
|
'classes_tree' => false,
|
||
|
'encode' => false,
|
||
|
'code_placeholder' => '',
|
||
|
// elements selector.
|
||
|
'locations' => array(),
|
||
|
// gallery.
|
||
|
'focal_point' => false,
|
||
|
|
||
|
// hint, deprecated.
|
||
|
'hint' => false,
|
||
|
'hint_place' => 'top',
|
||
|
|
||
|
// display in setup wizard.
|
||
|
'setup_wizard' => false,
|
||
|
|
||
|
// support for WPML.
|
||
|
'wpml' => false,
|
||
|
|
||
|
// condition.
|
||
|
'condition' => array(
|
||
|
/**
|
||
|
* Array of arrays with data:
|
||
|
* 'control' - control name.
|
||
|
* 'operator' - operator (==, !==, >, <, >=, <=).
|
||
|
* 'value' - condition value.
|
||
|
*/
|
||
|
),
|
||
|
|
||
|
// style.
|
||
|
'style' => array(
|
||
|
/**
|
||
|
* Array of arrays with data:
|
||
|
* 'element' - CSS selector string (.vp-portfolio__item, .vp-portfolio__item-overlay, etc).
|
||
|
* 'property' - CSS property (color, font-size, etc).
|
||
|
* 'mask' - CSS value mask, for ex. "$px".
|
||
|
*/
|
||
|
),
|
||
|
|
||
|
'class' => '',
|
||
|
'wrapper_class' => '',
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* Visual_Portfolio_Controls constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
add_action( 'wp_ajax_vp_dynamic_control_callback', array( $this, 'ajax_dynamic_control_callback' ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dynamic control AJAX callback.
|
||
|
*/
|
||
|
public function ajax_dynamic_control_callback() {
|
||
|
check_ajax_referer( 'vp-ajax-nonce', 'nonce' );
|
||
|
if ( ! isset( $_POST['vp_control_name'] ) ) {
|
||
|
wp_die();
|
||
|
}
|
||
|
|
||
|
$result = null;
|
||
|
$found = null;
|
||
|
$controls = self::get_registered_array();
|
||
|
|
||
|
// find control callback.
|
||
|
foreach ( $controls as $control ) {
|
||
|
if (
|
||
|
isset( $control['name'] ) &&
|
||
|
$control['name'] === $_POST['vp_control_name'] &&
|
||
|
isset( $control['value_callback'] ) &&
|
||
|
is_callable( $control['value_callback'] )
|
||
|
) {
|
||
|
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
|
||
|
$attributes = isset( $_POST['vp_attributes'] ) ? Visual_Portfolio_Security::sanitize_attributes( $_POST['vp_attributes'] ) : array();
|
||
|
$found = true;
|
||
|
$result = call_user_func( $control['value_callback'], $attributes, $control );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( null === $found ) {
|
||
|
echo wp_json_encode(
|
||
|
array(
|
||
|
'response' => esc_attr__( 'Dynamic control callback function is not found.', 'visual-portfolio' ),
|
||
|
'error' => true,
|
||
|
)
|
||
|
);
|
||
|
} else {
|
||
|
echo wp_json_encode(
|
||
|
array(
|
||
|
'response' => $result,
|
||
|
'success' => true,
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
wp_die();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register category to print in the future.
|
||
|
*
|
||
|
* @param array $categories - categories args.
|
||
|
*/
|
||
|
public static function register_categories( $categories = array() ) {
|
||
|
self::$registered_categories = array_merge( self::$registered_categories, $categories );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register control to print in the future.
|
||
|
*
|
||
|
* @param array $args - control args.
|
||
|
*/
|
||
|
public static function register( $args = array() ) {
|
||
|
if ( ! isset( $args['name'] ) ) {
|
||
|
return;
|
||
|
}
|
||
|
self::$registered_fields[ $args['name'] ] = apply_filters( 'vpf_register_control', $args, $args['name'] );
|
||
|
|
||
|
do_action( 'vpf_registered_control', $args['name'], $args );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all registered controls.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_registered_array() {
|
||
|
// Return cached version of all controls.
|
||
|
if ( ! empty( self::$cached_all_registered_controls ) ) {
|
||
|
return self::$cached_all_registered_controls;
|
||
|
}
|
||
|
|
||
|
$result = array();
|
||
|
|
||
|
foreach ( self::$registered_fields as $k => $args ) {
|
||
|
$result[ $k ] = array_merge( self::$default_args, $args );
|
||
|
|
||
|
// Gallery image controls.
|
||
|
if ( 'gallery' === $result[ $k ]['type'] && isset( $result[ $k ]['image_controls'] ) && ! empty( $result[ $k ]['image_controls'] ) ) {
|
||
|
$img_controls = array();
|
||
|
|
||
|
// Extend.
|
||
|
// phpcs:ignore Squiz.PHP.CommentedOutCode.Found, Squiz.Commenting.BlockComment.NoEmptyLineBefore
|
||
|
/*
|
||
|
* Example:
|
||
|
array(
|
||
|
'title' => array(
|
||
|
'type' => 'text',
|
||
|
'label' => esc_html__( 'Title', 'visual-portfolio' ),
|
||
|
),
|
||
|
'description' => array(
|
||
|
'type' => 'textarea',
|
||
|
'label' => esc_html__( 'Description', 'visual-portfolio' ),
|
||
|
),
|
||
|
)
|
||
|
*/
|
||
|
$result[ $k ]['image_controls'] = apply_filters( 'vpf_extend_image_controls', $result[ $k ]['image_controls'], $result[ $k ]['name'] );
|
||
|
|
||
|
// Get default controls data.
|
||
|
foreach ( $result[ $k ]['image_controls'] as $i => $img_args ) {
|
||
|
$img_controls[ $i ] = array_merge( self::$default_args, $img_args );
|
||
|
}
|
||
|
|
||
|
$result[ $k ]['image_controls'] = $img_controls;
|
||
|
}
|
||
|
|
||
|
$result[ $k ] = apply_filters( 'vpf_registered_control_args', $result[ $k ] );
|
||
|
}
|
||
|
|
||
|
self::$cached_all_registered_controls = apply_filters( 'vpf_registered_controls', $result );
|
||
|
|
||
|
return self::$cached_all_registered_controls;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all registered categories.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_registered_categories() {
|
||
|
return self::$registered_categories;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get registered control value.
|
||
|
*
|
||
|
* @param string $name - field name.
|
||
|
* @param int|bool $post_id - post id to get meta data.
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public static function get_registered_value( $name, $post_id = false ) {
|
||
|
// get meta data.
|
||
|
$result = null;
|
||
|
|
||
|
// get meta data from saved layout.
|
||
|
// get all layout meta at once and cache them (works faster).
|
||
|
if ( $post_id ) {
|
||
|
if ( ! isset( self::$cached_saved_layout_meta[ $post_id ] ) ) {
|
||
|
$saved_meta = get_post_meta( $post_id );
|
||
|
$result_meta = array();
|
||
|
|
||
|
// We should unserialize array data as in standard function https://developer.wordpress.org/reference/functions/get_metadata_raw/.
|
||
|
if ( is_array( $saved_meta ) ) {
|
||
|
foreach ( $saved_meta as $key => $val ) {
|
||
|
if ( isset( $val[0] ) ) {
|
||
|
$result_meta[ $key ] = maybe_unserialize( $val[0] );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
self::$cached_saved_layout_meta[ $post_id ] = $result_meta;
|
||
|
}
|
||
|
if ( isset( self::$cached_saved_layout_meta[ $post_id ] ) && isset( self::$cached_saved_layout_meta[ $post_id ][ 'vp_' . $name ] ) ) {
|
||
|
$result = self::$cached_saved_layout_meta[ $post_id ][ 'vp_' . $name ];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// registered data.
|
||
|
$registered_array = self::get_registered_array();
|
||
|
$registered_data = isset( $registered_array[ $name ] ) ? $registered_array[ $name ] : false;
|
||
|
|
||
|
// find default.
|
||
|
$default = null;
|
||
|
if ( isset( $registered_data ) ) {
|
||
|
$default = isset( $registered_data['default'] ) ? $registered_data['default'] : $default;
|
||
|
}
|
||
|
if ( ! isset( $result ) && isset( $default ) ) {
|
||
|
$result = $default;
|
||
|
}
|
||
|
|
||
|
// filter.
|
||
|
$result = apply_filters( 'vpf_control_value', $result, $name, $post_id );
|
||
|
|
||
|
// fix for gallery array.
|
||
|
if ( isset( $registered_data['type'] ) && 'gallery' === $registered_data['type'] ) {
|
||
|
$result = (array) ( is_string( $result ) ? json_decode( $result, true ) : $result );
|
||
|
|
||
|
// add image url if doesn't exist.
|
||
|
foreach ( $result as $k => $data ) {
|
||
|
if ( ! isset( $data['imgUrl'] ) && isset( $data['id'] ) ) {
|
||
|
$result[ $k ]['imgUrl'] = Visual_Portfolio_Images::wp_get_attachment_image_url( $data['id'], 'full' );
|
||
|
$result[ $k ]['imgThumbnailUrl'] = Visual_Portfolio_Images::wp_get_attachment_image_url( $data['id'], 'thumbnail' );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// fix bool values.
|
||
|
if ( 'false' === $result ) {
|
||
|
$result = false;
|
||
|
}
|
||
|
if ( 'true' === $result ) {
|
||
|
$result = true;
|
||
|
}
|
||
|
|
||
|
if ( 'custom_css' === $name && $result ) {
|
||
|
// Decode.
|
||
|
$result = visual_portfolio_decode( $result );
|
||
|
|
||
|
// Fix for old plugin versions (< 2.0).
|
||
|
$result = str_replace( '>', '>', $result );
|
||
|
}
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
new Visual_Portfolio_Controls();
|