915 lines
32 KiB
PHP
915 lines
32 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Plugin Settings
|
||
|
*
|
||
|
* @package visual-portfolio
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
require_once visual_portfolio()->plugin_path . 'vendors/class-settings-api.php';
|
||
|
|
||
|
/**
|
||
|
* Visual Portfolio Settings Class
|
||
|
*/
|
||
|
class Visual_Portfolio_Settings {
|
||
|
/**
|
||
|
* Settings API instance
|
||
|
*
|
||
|
* @var object
|
||
|
*/
|
||
|
public static $settings_api;
|
||
|
|
||
|
/**
|
||
|
* Cached settings fields. We call settings fields method a lot of times to get default values.
|
||
|
* So, for performance reasons we need to cache the output.
|
||
|
*
|
||
|
* @var object
|
||
|
*/
|
||
|
public static $cached_settings_fields;
|
||
|
|
||
|
/**
|
||
|
* Visual_Portfolio_Settings constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
self::init_actions();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Option Value
|
||
|
*
|
||
|
* @param string $option - option name.
|
||
|
* @param string $section - section name.
|
||
|
* @param string $deprecated_default - default option value.
|
||
|
*
|
||
|
* @return bool|string
|
||
|
*/
|
||
|
// phpcs:ignore
|
||
|
public static function get_option( $option, $section, $deprecated_default = '' ) {
|
||
|
$options = get_option( $section );
|
||
|
$result = '';
|
||
|
|
||
|
if ( isset( $options[ $option ] ) ) {
|
||
|
$result = $options[ $option ];
|
||
|
} else {
|
||
|
// find default.
|
||
|
$fields = self::get_settings_fields();
|
||
|
|
||
|
if ( isset( $fields[ $section ] ) && is_array( $fields[ $section ] ) ) {
|
||
|
foreach ( $fields[ $section ] as $field_data ) {
|
||
|
if ( $option === $field_data['name'] && isset( $field_data['default'] ) ) {
|
||
|
$result = $field_data['default'];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 'off' === $result ? false : ( 'on' === $result ? true : $result );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update Option Value
|
||
|
*
|
||
|
* @param string $option - option name.
|
||
|
* @param string $section - section name.
|
||
|
* @param string $value - new option value.
|
||
|
*/
|
||
|
public static function update_option( $option, $section, $value ) {
|
||
|
$options = get_option( $section );
|
||
|
|
||
|
if ( ! is_array( $options ) ) {
|
||
|
$options = array();
|
||
|
}
|
||
|
|
||
|
$options[ $option ] = $value;
|
||
|
|
||
|
update_option( $section, $options );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Init actions
|
||
|
*/
|
||
|
public static function init_actions() {
|
||
|
self::$settings_api = new Visual_Portfolio_Settings_API();
|
||
|
|
||
|
add_action( 'admin_init', array( __CLASS__, 'admin_init' ) );
|
||
|
add_action( 'admin_menu', array( __CLASS__, 'admin_menu' ), 11 );
|
||
|
|
||
|
add_action( 'admin_enqueue_scripts', array( __CLASS__, 'admin_enqueue_scripts' ) );
|
||
|
add_action( 'wp_ajax_vp_get_pages_list', array( __CLASS__, 'get_posts_ajax_callback' ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Initialize the settings
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function admin_init() {
|
||
|
self::redirect_if_toggle_unregistered_portfolio_post_type();
|
||
|
// set the settings.
|
||
|
self::$settings_api->set_sections( self::get_settings_sections() );
|
||
|
self::$settings_api->set_fields( self::get_settings_fields() );
|
||
|
|
||
|
// initialize settings.
|
||
|
self::$settings_api->admin_init();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register the admin settings menu
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function admin_menu() {
|
||
|
remove_submenu_page( 'visual-portfolio-settings', 'visual-portfolio-settings' );
|
||
|
add_submenu_page(
|
||
|
Visual_Portfolio_Custom_Post_Type::get_menu_slug(),
|
||
|
esc_html__( 'Settings', 'visual-portfolio' ),
|
||
|
esc_html__( 'Settings', 'visual-portfolio' ),
|
||
|
'manage_options',
|
||
|
'visual-portfolio-settings',
|
||
|
array( __CLASS__, 'print_settings_page' )
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Redirect to actual admin page if unregistered portfolio post type.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function redirect_if_toggle_unregistered_portfolio_post_type() {
|
||
|
global $pagenow;
|
||
|
$register_portfolio_post_type = Visual_Portfolio_Custom_Post_Type::portfolio_post_type_is_registered();
|
||
|
// phpcs:disable WordPress.Security.NonceVerification.Recommended
|
||
|
if (
|
||
|
$register_portfolio_post_type &&
|
||
|
'admin.php' === $pagenow &&
|
||
|
isset( $_GET['page'] ) &&
|
||
|
'visual-portfolio-settings' === $_GET['page']
|
||
|
) {
|
||
|
wp_safe_redirect( admin_url( '/edit.php?post_type=portfolio&page=visual-portfolio-settings' ) );
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
! $register_portfolio_post_type &&
|
||
|
'edit.php' === $pagenow &&
|
||
|
isset( $_GET['page'] ) &&
|
||
|
'visual-portfolio-settings' === $_GET['page'] &&
|
||
|
isset( $_GET['post_type'] ) &&
|
||
|
'portfolio' === $_GET['post_type']
|
||
|
) {
|
||
|
wp_safe_redirect( admin_url( '/admin.php?page=visual-portfolio-settings' ) );
|
||
|
exit;
|
||
|
}
|
||
|
// phpcs:enable WordPress.Security.NonceVerification.Recommended
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enqueue archive select2 ajax script.
|
||
|
*
|
||
|
* @param string $page - Current admin page.
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function admin_enqueue_scripts( $page ) {
|
||
|
if ( 'portfolio_page_visual-portfolio-settings' === $page || 'toplevel_page_visual-portfolio-settings' === $page ) {
|
||
|
$data_init = array(
|
||
|
'nonce' => wp_create_nonce( 'vp-ajax-nonce' ),
|
||
|
);
|
||
|
|
||
|
Visual_Portfolio_Assets::enqueue_script( 'visual-portfolio-archive-page-selector', 'build/assets/admin/js/archive-page-selector', array( 'select2' ) );
|
||
|
|
||
|
wp_localize_script( 'visual-portfolio-archive-page-selector', 'VPAdminVariables', $data_init );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Plugin settings sections
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_settings_sections() {
|
||
|
$sections = array(
|
||
|
array(
|
||
|
'id' => 'vp_general',
|
||
|
'title' => esc_html__( 'General', 'visual-portfolio' ),
|
||
|
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4" /></svg>',
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'vp_images',
|
||
|
'title' => esc_html__( 'Images', 'visual-portfolio' ),
|
||
|
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" /></svg>',
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'vp_popup_gallery',
|
||
|
'title' => esc_html__( 'Popup & Lightbox', 'visual-portfolio' ),
|
||
|
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>',
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'vp_watermarks',
|
||
|
'title' => esc_html__( 'Watermarks', 'visual-portfolio' ),
|
||
|
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" /></svg>',
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'vp_social_integrations',
|
||
|
'title' => esc_html__( 'Social Feeds', 'visual-portfolio' ),
|
||
|
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9" /></svg>',
|
||
|
),
|
||
|
array(
|
||
|
'id' => 'vp_white_label',
|
||
|
'title' => esc_html__( 'White Label', 'visual-portfolio' ),
|
||
|
'icon' => '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" /></svg>',
|
||
|
),
|
||
|
);
|
||
|
|
||
|
return apply_filters( 'vpf_settings_sections', $sections );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns all the settings fields
|
||
|
*
|
||
|
* @return array settings fields
|
||
|
*/
|
||
|
public static function get_settings_fields() {
|
||
|
if ( ! empty( self::$cached_settings_fields ) ) {
|
||
|
return self::$cached_settings_fields;
|
||
|
}
|
||
|
|
||
|
$default_breakpoints = Visual_Portfolio_Breakpoints::get_default_breakpoints();
|
||
|
$go_pro_links = array(
|
||
|
'watermarks' => Visual_Portfolio_Admin::get_plugin_site_url(
|
||
|
array(
|
||
|
'utm_medium' => 'settings_page',
|
||
|
'utm_campaign' => 'watermarks',
|
||
|
)
|
||
|
),
|
||
|
'social' => Visual_Portfolio_Admin::get_plugin_site_url(
|
||
|
array(
|
||
|
'utm_medium' => 'settings_page',
|
||
|
'utm_campaign' => 'social_feeds',
|
||
|
)
|
||
|
),
|
||
|
'white_label' => Visual_Portfolio_Admin::get_plugin_site_url(
|
||
|
array(
|
||
|
'utm_medium' => 'settings_page',
|
||
|
'utm_campaign' => 'white_label',
|
||
|
)
|
||
|
),
|
||
|
);
|
||
|
|
||
|
$settings_fields = array(
|
||
|
'vp_general' => array(
|
||
|
array(
|
||
|
'name' => 'register_portfolio_post_type',
|
||
|
'label' => esc_html__( 'Register Portfolio Post Type', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Add custom post type `portfolio` to showcase your works.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'portfolio_archive_page',
|
||
|
'label' => esc_html__( 'Archive Page', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Base page of your portfolio, where will be placed your works archive.', 'visual-portfolio' ),
|
||
|
'type' => 'select',
|
||
|
'options' => self::get_pages_list(),
|
||
|
'sanitize_callback' => array( 'Visual_Portfolio_Archive_Mapping', 'save_archive_page_option' ),
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[type="checkbox"][name="vp_general[register_portfolio_post_type]"]',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'archive_page_items_per_page',
|
||
|
'label' => esc_html__( 'Archive Page Items Per Page', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'min' => -1,
|
||
|
'max' => 9999,
|
||
|
'default' => 6,
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[type="checkbox"][name="vp_general[register_portfolio_post_type]"]',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'filter_taxonomies',
|
||
|
'label' => esc_html__( 'Filter Taxonomies', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'You can show custom taxonomies in the portfolio Filter. Enter some taxonomies by "," separating values. Example: "product_cat,product_tag"', 'visual-portfolio' ),
|
||
|
'type' => 'text',
|
||
|
'default' => '',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'no_image',
|
||
|
'label' => esc_html__( 'Placeholder Image', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'This image used on items in layouts where image is not specified.', 'visual-portfolio' ),
|
||
|
'type' => 'image',
|
||
|
'default' => '',
|
||
|
'options' => array(
|
||
|
'button_label' => esc_html__( 'Choose image', 'visual-portfolio' ),
|
||
|
),
|
||
|
),
|
||
|
|
||
|
// AJAX Caching and Preloading.
|
||
|
array(
|
||
|
'name' => 'ajax_caching',
|
||
|
'label' => esc_html__( 'AJAX Cache and Preload', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Reduce AJAX calls request time.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => class_exists( 'Visual_Portfolio_Pro' ) ? 'on' : 'off',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
|
||
|
// Breakpoints.
|
||
|
array(
|
||
|
'name' => 'breakpoints_title',
|
||
|
'label' => esc_html__( 'Responsive Breakpoints', 'visual-portfolio' ),
|
||
|
'type' => 'section_title',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'breakpoint_xl',
|
||
|
'label' => esc_html__( 'Extra Large', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'min' => (float) $default_breakpoints['lg'] + 1,
|
||
|
'max' => 3840,
|
||
|
'placeholder' => (string) $default_breakpoints['xl'],
|
||
|
'default' => (float) $default_breakpoints['xl'],
|
||
|
// translators: %1$s - default breakpoint.
|
||
|
'desc' => sprintf( esc_html__( 'Sets the breakpoint on extra large screen sizes (Default: %1$spx).', 'visual-portfolio' ), $default_breakpoints['xl'] ),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'breakpoint_lg',
|
||
|
'label' => esc_html__( 'Large', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'min' => (float) $default_breakpoints['md'] + 1,
|
||
|
'max' => (float) $default_breakpoints['xl'] - 1,
|
||
|
'placeholder' => (string) $default_breakpoints['lg'],
|
||
|
'default' => (float) $default_breakpoints['lg'],
|
||
|
// translators: %1$s - default breakpoint.
|
||
|
'desc' => sprintf( esc_html__( 'Sets the breakpoint on large screen sizes (Default: %1$spx).', 'visual-portfolio' ), $default_breakpoints['lg'] ),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'breakpoint_md',
|
||
|
'label' => esc_html__( 'Medium', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'min' => (float) $default_breakpoints['sm'] + 1,
|
||
|
'max' => (float) $default_breakpoints['lg'] - 1,
|
||
|
'placeholder' => (string) $default_breakpoints['md'],
|
||
|
'default' => (float) $default_breakpoints['md'],
|
||
|
// translators: %1$s - default breakpoint.
|
||
|
'desc' => sprintf( esc_html__( 'Sets the breakpoint on medium screen sizes (Default: %1$spx).', 'visual-portfolio' ), $default_breakpoints['md'] ),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'breakpoint_sm',
|
||
|
'label' => esc_html__( 'Small', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'min' => (float) $default_breakpoints['xs'] + 1,
|
||
|
'max' => (float) $default_breakpoints['md'] - 1,
|
||
|
'placeholder' => (string) $default_breakpoints['sm'],
|
||
|
'default' => (float) $default_breakpoints['sm'],
|
||
|
// translators: %1$s - default breakpoint.
|
||
|
'desc' => sprintf( esc_html__( 'Sets the breakpoint on small screen sizes (Default: %1$spx).', 'visual-portfolio' ), $default_breakpoints['sm'] ),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'breakpoint_xs',
|
||
|
'label' => esc_html__( 'Extra Small', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'min' => 1,
|
||
|
'max' => (float) $default_breakpoints['sm'] - 1,
|
||
|
'placeholder' => (string) $default_breakpoints['xs'],
|
||
|
'default' => (float) $default_breakpoints['xs'],
|
||
|
// translators: %1$s - default breakpoint.
|
||
|
'desc' => sprintf( esc_html__( 'Sets the breakpoint on extra small screen sizes (Default: %1$spx).', 'visual-portfolio' ), $default_breakpoints['xs'] ),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
),
|
||
|
'vp_images' => array(
|
||
|
array(
|
||
|
'name' => 'lazy_loading',
|
||
|
'label' => esc_html__( 'Lazy Loading', 'visual-portfolio' ),
|
||
|
// translators: %s - plugin brand name.
|
||
|
'desc' => sprintf( esc_html__( 'Enable lazy loading for %s layouts only or for the whole website.', 'visual-portfolio' ), visual_portfolio()->plugin_name ),
|
||
|
'type' => 'select',
|
||
|
'default' => 'vp',
|
||
|
'options' => array(
|
||
|
'' => esc_html__( 'Disabled', 'visual-portfolio' ),
|
||
|
// translators: %s - plugin brand name.
|
||
|
'vp' => sprintf( esc_html__( '%s Only', 'visual-portfolio' ), visual_portfolio()->plugin_name ),
|
||
|
'full' => esc_html__( 'All images', 'visual-portfolio' ),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'lazy_loading_excludes',
|
||
|
'label' => esc_html__( 'Lazy Loading Excludes', 'visual-portfolio' ),
|
||
|
// translators: %s - doc url.
|
||
|
// translators: %s - link text.
|
||
|
'desc' => sprintf( __( 'Listed images will not be lazy loaded. Both full URLs and partial strings can be used. One per line. <a href="%1$s">%2$s</a>', 'visual-portfolio' ), 'https://visualportfolio.co/docs/settings/images/', esc_html__( 'More info', 'visual-portfolio' ) ),
|
||
|
'type' => 'textarea',
|
||
|
'placeholder' => "image-example.webp\nslider-image-classname",
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[name="vp_images[lazy_loading]"]',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
|
||
|
array(
|
||
|
'name' => 'images_layouts_title',
|
||
|
'label' => esc_html__( 'Layouts Image Sizes', 'visual-portfolio' ),
|
||
|
'desc' => __( 'Image sizes used in portfolio layouts.', 'visual-portfolio' ),
|
||
|
'type' => 'section_title',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'sm',
|
||
|
'label' => esc_html__( 'Small', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '500',
|
||
|
'default' => 500,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'md',
|
||
|
'label' => esc_html__( 'Medium', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '800',
|
||
|
'default' => 800,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'lg',
|
||
|
'label' => esc_html__( 'Large', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '1280',
|
||
|
'default' => 1280,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'xl',
|
||
|
'label' => esc_html__( 'Extra Large', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '1920',
|
||
|
'default' => 1920,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'images_popup_title',
|
||
|
'label' => esc_html__( 'Lightbox Image Sizes', 'visual-portfolio' ),
|
||
|
'desc' => __( 'Image sizes used in lightbox images.', 'visual-portfolio' ),
|
||
|
'type' => 'section_title',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'sm_popup',
|
||
|
'label' => esc_html__( 'Small', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '500',
|
||
|
'default' => 500,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'md_popup',
|
||
|
'label' => esc_html__( 'Medium', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '800',
|
||
|
'default' => 800,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'xl_popup',
|
||
|
'label' => esc_html__( 'Large', 'visual-portfolio' ),
|
||
|
'type' => 'number',
|
||
|
'placeholder' => '1920',
|
||
|
'default' => 1920,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'images_sizes_note',
|
||
|
// translators: %s: regenerate thumbnails url.
|
||
|
'desc' => sprintf( __( 'After publishing your changes, new image sizes may not be shown until you <a href="%s" target="_blank">Regenerate Thumbnails</a>.', 'visual-portfolio' ), 'https://wordpress.org/plugins/regenerate-thumbnails/' ),
|
||
|
'type' => 'html',
|
||
|
),
|
||
|
),
|
||
|
'vp_popup_gallery' => array(
|
||
|
// Vendor.
|
||
|
array(
|
||
|
'name' => 'vendor',
|
||
|
'label' => esc_html__( 'Vendor Script', 'visual-portfolio' ),
|
||
|
'type' => 'select',
|
||
|
'options' => array(
|
||
|
'fancybox' => esc_html__( 'Fancybox', 'visual-portfolio' ),
|
||
|
'photoswipe' => esc_html__( 'PhotoSwipe', 'visual-portfolio' ),
|
||
|
),
|
||
|
'default' => 'fancybox',
|
||
|
),
|
||
|
|
||
|
// Default WordPress Images.
|
||
|
array(
|
||
|
'name' => 'enable_on_wordpress_images',
|
||
|
'label' => esc_html__( 'Lightbox for WordPress Images', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Enable lightbox for WordPress native galleries and images.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'off',
|
||
|
),
|
||
|
|
||
|
// Section divider.
|
||
|
array(
|
||
|
'name' => 'popup_general_divider_title',
|
||
|
'type' => 'section_title',
|
||
|
),
|
||
|
|
||
|
// Deeplinking.
|
||
|
array(
|
||
|
'name' => 'deep_linking',
|
||
|
'label' => esc_html__( 'Deep Linking', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Makes URL automatically change to reflect the current opened popup, and you can easily link directly to that image or video.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => class_exists( 'Visual_Portfolio_Pro' ) ? 'on' : 'off',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'deep_linking_url_to_share_images',
|
||
|
'label' => esc_html__( 'Use Deep Linking URL to Share Images', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Check to share Deep Linking URLs when sharing images. When disabled, all galleries will share direct links to image files.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => class_exists( 'Visual_Portfolio_Pro' ) ? 'on' : 'off',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
|
||
|
// Loop.
|
||
|
array(
|
||
|
'name' => 'loop',
|
||
|
'label' => esc_html__( 'Loop', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
|
||
|
// Click to Zoom.
|
||
|
array(
|
||
|
'name' => 'click_to_zoom',
|
||
|
'label' => esc_html__( 'Click to Zoom', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
|
||
|
// Restore Focus.
|
||
|
array(
|
||
|
'name' => 'restore_focus',
|
||
|
'label' => esc_html__( 'Restore Focus', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Restore focus on the last active item after Popup is closed.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
|
||
|
// UI Elements.
|
||
|
array(
|
||
|
'name' => 'popup_ui_elements_title',
|
||
|
'label' => esc_html__( 'UI Elements', 'visual-portfolio' ),
|
||
|
'type' => 'section_title',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_arrows',
|
||
|
'label' => esc_html__( 'Display Arrows', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Arrows to navigate between images.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_counter',
|
||
|
'label' => esc_html__( 'Display Images Counter', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'On the top left corner will be showed images counter.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_zoom_button',
|
||
|
'label' => esc_html__( 'Display Zoom Button', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_fullscreen_button',
|
||
|
'label' => esc_html__( 'Display Fullscreen Button', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_share_button',
|
||
|
'label' => esc_html__( 'Display Share Button', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_close_button',
|
||
|
'label' => esc_html__( 'Display Close Button', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
),
|
||
|
|
||
|
// Fancybox Popup Settings.
|
||
|
array(
|
||
|
'name' => 'show_thumbs',
|
||
|
'label' => esc_html__( 'Display Thumbnails', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[name="vp_popup_gallery[vendor]"]',
|
||
|
'operator' => '===',
|
||
|
'value' => 'fancybox',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'thumbs_auto_start',
|
||
|
'label' => esc_html__( 'Thumbnails Opened At Startup', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'off',
|
||
|
'is_pro' => true,
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[type="checkbox"][name="vp_popup_gallery[show_thumbs]"]',
|
||
|
),
|
||
|
array(
|
||
|
'control' => '[name="vp_popup_gallery[vendor]"]',
|
||
|
'operator' => '===',
|
||
|
'value' => 'fancybox',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'thumbs_position',
|
||
|
'label' => esc_html__( 'Thumbnails Position', 'visual-portfolio' ),
|
||
|
'type' => 'select',
|
||
|
'default' => 'vertical',
|
||
|
'options' => array(
|
||
|
'vertical' => esc_html__( 'Vertical', 'visual-portfolio' ),
|
||
|
'horizontal' => esc_html__( 'Horizontal', 'visual-portfolio' ),
|
||
|
),
|
||
|
'is_pro' => true,
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[type="checkbox"][name="vp_popup_gallery[show_thumbs]"]',
|
||
|
),
|
||
|
array(
|
||
|
'control' => '[name="vp_popup_gallery[vendor]"]',
|
||
|
'operator' => '===',
|
||
|
'value' => 'fancybox',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_download_button',
|
||
|
'label' => esc_html__( 'Display Download Button', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'off',
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[name="vp_popup_gallery[vendor]"]',
|
||
|
'operator' => '===',
|
||
|
'value' => 'fancybox',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'show_slideshow',
|
||
|
'label' => esc_html__( 'Display Slideshow', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'off',
|
||
|
'condition' => array(
|
||
|
array(
|
||
|
'control' => '[name="vp_popup_gallery[vendor]"]',
|
||
|
'operator' => '===',
|
||
|
'value' => 'fancybox',
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
|
||
|
// Quick View settings.
|
||
|
array(
|
||
|
'name' => 'popup_quick_view_title',
|
||
|
'label' => esc_html__( 'Quick View', 'visual-portfolio' ),
|
||
|
'type' => 'section_title',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'popup_quick_view_show_url_button',
|
||
|
'label' => esc_html__( 'Display URL Button', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'Button with page URL will be placed in the popup toolbar.', 'visual-portfolio' ),
|
||
|
'type' => 'toggle',
|
||
|
'default' => 'on',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'popup_quick_view_internal_links_target',
|
||
|
'label' => esc_html__( 'Internal Links', 'visual-portfolio' ),
|
||
|
'type' => 'select',
|
||
|
'default' => '_blank',
|
||
|
'options' => array(
|
||
|
'_blank' => esc_html__( 'Open in New Tab', 'visual-portfolio' ),
|
||
|
'_top' => esc_html__( 'Open in Current Tab', 'visual-portfolio' ),
|
||
|
'_self' => esc_html__( 'Open in Frame (not recommended)', 'visual-portfolio' ),
|
||
|
'prevent-click' => esc_html__( 'Prevent Click', 'visual-portfolio' ),
|
||
|
),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'popup_quick_view_external_links_target',
|
||
|
'label' => esc_html__( 'External Links', 'visual-portfolio' ),
|
||
|
'type' => 'select',
|
||
|
'default' => '_blank',
|
||
|
'options' => array(
|
||
|
'_blank' => esc_html__( 'Open in New Tab', 'visual-portfolio' ),
|
||
|
'_top' => esc_html__( 'Open in Current Tab', 'visual-portfolio' ),
|
||
|
'_self' => esc_html__( 'Open in Frame (not recommended)', 'visual-portfolio' ),
|
||
|
'prevent-click' => esc_html__( 'Prevent Click', 'visual-portfolio' ),
|
||
|
),
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'pages_iframe_custom_css',
|
||
|
'label' => esc_html__( 'Custom CSS', 'visual-portfolio' ),
|
||
|
'desc' => esc_html__( 'When you display posts and pages in popup iframe, you may not need some page elements like header and footer. Hide it using custom CSS with classname `.vp-popup-iframe`.', 'visual-portfolio' ),
|
||
|
'type' => 'textarea',
|
||
|
'default' => ! class_exists( 'Visual_Portfolio_Pro' ) ? '' : '
|
||
|
/* Hide header and footer in standard themes */
|
||
|
.vp-popup-iframe #site-header,
|
||
|
.vp-popup-iframe #masthead,
|
||
|
.vp-popup-iframe #site-footer,
|
||
|
.vp-popup-iframe #colophon {
|
||
|
display: none;
|
||
|
}
|
||
|
|
||
|
/* Hide header and footer in Twenty Twenty-Two theme (Full Site Editing) */
|
||
|
.vp-popup-iframe .wp-site-blocks > header.wp-block-template-part,
|
||
|
.vp-popup-iframe .wp-site-blocks > footer.wp-block-template-part {
|
||
|
display: none;
|
||
|
}',
|
||
|
'is_pro' => true,
|
||
|
),
|
||
|
|
||
|
// Misc settings.
|
||
|
array(
|
||
|
'name' => 'popup_misc_title',
|
||
|
'label' => esc_html__( 'Misc', 'visual-portfolio' ),
|
||
|
'type' => 'section_title',
|
||
|
),
|
||
|
array(
|
||
|
'name' => 'background_color',
|
||
|
'label' => esc_html__( 'Background Color', 'visual-portfolio' ),
|
||
|
'type' => 'color',
|
||
|
'default' => '#1e1e1e',
|
||
|
),
|
||
|
),
|
||
|
'vp_watermarks' => array(
|
||
|
array(
|
||
|
'name' => 'pro_info',
|
||
|
'desc' => '
|
||
|
<div class="vpf-pro-note vpf-settings-info-pro">
|
||
|
<h3>' . esc_html__( 'Premium Only', 'visual-portfolio' ) . '</h3>
|
||
|
<div>
|
||
|
<p class="vpf-pro-note-description">' . esc_html__( 'Protect your works using watermarks', 'visual-portfolio' ) . '</p>
|
||
|
<a class="vpf-pro-note-button" target="_blank" rel="noopener noreferrer" href="' . esc_url( $go_pro_links['watermarks'] ) . '">' . esc_html__( 'Go Pro', 'visual-portfolio' ) . '</a>
|
||
|
</div>
|
||
|
</div>
|
||
|
',
|
||
|
'type' => 'html',
|
||
|
),
|
||
|
),
|
||
|
'vp_social_integrations' => array(
|
||
|
array(
|
||
|
'name' => 'pro_info',
|
||
|
'desc' => '
|
||
|
<div class="vpf-pro-note vpf-settings-info-pro">
|
||
|
<h3>' . esc_html__( 'Premium Only', 'visual-portfolio' ) . '</h3>
|
||
|
<div>
|
||
|
<p class="vpf-pro-note-description">' . esc_html__( 'Social feeds such as Instagram, Youtube, Flickr, Twitter, etc...', 'visual-portfolio' ) . '</p>
|
||
|
<a class="vpf-pro-note-button" target="_blank" rel="noopener noreferrer" href="' . esc_url( $go_pro_links['social'] ) . '">' . esc_html__( 'Go Pro', 'visual-portfolio' ) . '</a>
|
||
|
</div>
|
||
|
</div>
|
||
|
',
|
||
|
'type' => 'html',
|
||
|
),
|
||
|
),
|
||
|
'vp_white_label' => array(
|
||
|
array(
|
||
|
'name' => 'pro_info',
|
||
|
'desc' => '
|
||
|
<div class="vpf-pro-note">
|
||
|
<h3>' . esc_html__( 'Premium Only', 'visual-portfolio' ) . '</h3>
|
||
|
<div>
|
||
|
<p class="vpf-pro-note-description">' . esc_html__( 'Remove our plugin brand and logos from Front and Admin areas', 'visual-portfolio' ) . '</p>
|
||
|
<a class="vpf-pro-note-button" target="_blank" rel="noopener noreferrer" href="' . esc_url( $go_pro_links['white_label'] ) . '">' . esc_html__( 'Go Pro', 'visual-portfolio' ) . '</a>
|
||
|
</div>
|
||
|
</div>
|
||
|
',
|
||
|
'type' => 'html',
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
self::$cached_settings_fields = apply_filters( 'vpf_settings_fields', $settings_fields );
|
||
|
|
||
|
return self::$cached_settings_fields;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The plugin page handler
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function print_settings_page() {
|
||
|
self::$settings_api->admin_enqueue_scripts();
|
||
|
|
||
|
echo '<div class="wrap">';
|
||
|
echo '<h2>' . esc_html__( 'Settings', 'visual-portfolio' ) . '</h2>';
|
||
|
|
||
|
self::$settings_api->show_navigation();
|
||
|
self::$settings_api->show_forms();
|
||
|
|
||
|
echo '</div>';
|
||
|
|
||
|
?>
|
||
|
<script>
|
||
|
(function( $ ) {
|
||
|
// Don't allow adding input number values that > then max attribute and < min attribute.
|
||
|
$('form').on('input', '[type="number"]', function(e) {
|
||
|
var current = parseFloat( this.value );
|
||
|
var min = parseFloat(this.min);
|
||
|
var max = parseFloat(this.max);
|
||
|
|
||
|
if ('' !== this.value) {
|
||
|
if (!Number.isNaN(min) && current < min) {
|
||
|
this.value = min;
|
||
|
}
|
||
|
if (!Number.isNaN(max) && current > max) {
|
||
|
this.value = max;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
<?php if ( ! class_exists( 'Visual_Portfolio_Pro' ) ) : ?>
|
||
|
// disable pro inputs.
|
||
|
$('.vpf-settings-control-pro').find('input, textarea').attr('disabled', 'disabled');
|
||
|
<?php endif; ?>
|
||
|
})(jQuery);
|
||
|
</script>
|
||
|
<?php
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Pages List.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_pages_list() {
|
||
|
$options = get_option( 'vp_general' );
|
||
|
$archive_page = $options['portfolio_archive_page'] ?? false;
|
||
|
$pages_list = array(
|
||
|
'' => esc_html__( '-- Select Page --', 'visual-portfolio' ),
|
||
|
);
|
||
|
if ( $archive_page ) {
|
||
|
$archive_title = get_post_field( 'post_title', $archive_page );
|
||
|
$pages_list[ $archive_page ] = $archive_title;
|
||
|
}
|
||
|
return $pages_list;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Posts for Select2 archive page field by Ajax.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public static function get_posts_ajax_callback() {
|
||
|
if ( isset( $_REQUEST['nonce'] ) && wp_verify_nonce( sanitize_key( $_REQUEST['nonce'] ), 'vp-ajax-nonce' ) ) {
|
||
|
$return = array();
|
||
|
$query_opts = array(
|
||
|
'post_status' => 'publish',
|
||
|
'ignore_sticky_posts' => 1,
|
||
|
'posts_per_page' => 50,
|
||
|
'post_type' => 'page',
|
||
|
'update_post_meta_cache' => false,
|
||
|
'update_post_term_cache' => false,
|
||
|
);
|
||
|
|
||
|
if ( isset( $_GET['q'] ) && ! empty( $_GET['q'] ) ) {
|
||
|
$query_opts['s'] = sanitize_text_field( wp_unslash( $_GET['q'] ) );
|
||
|
}
|
||
|
|
||
|
$search_results = new WP_Query( $query_opts );
|
||
|
|
||
|
if ( $search_results->have_posts() ) {
|
||
|
while ( $search_results->have_posts() ) {
|
||
|
$search_results->the_post();
|
||
|
$title = ( mb_strlen( $search_results->post->post_title ) > 50 ) ? mb_substr( $search_results->post->post_title, 0, 49 ) . '...' : $search_results->post->post_title;
|
||
|
$return[] = array( $search_results->post->ID, $title );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
echo wp_json_encode( $return );
|
||
|
}
|
||
|
|
||
|
die;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
new Visual_Portfolio_Settings();
|