web/wp-content/plugins/acf-extended/includes/admin/settings.php (633 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('acfe_admin_settings')):
class acfe_admin_settings{
// vars
public $defaults = array();
public $updated = array();
public $fields = array();
/**
* construct
*/
function __construct(){
add_action('acf/init', array($this, 'acf_pre_init'), 1);
add_action('acf/init', array($this, 'acf_post_init'), 100);
$this->register_fields();
}
/**
* acf_pre_init
*/
function acf_pre_init(){
$this->defaults = acf()->settings;
}
/**
* acf_post_init
*/
function acf_post_init(){
$settings = acf_get_array(acf()->settings);
foreach($settings as $name => $value){
// pass thru acf/settings filter
$this->updated[ $name ] = acf_get_setting($name, $value);
}
}
/**
* register_fields
*/
function register_fields(){
$this->fields = array(
// ACF
'acf' => array(
array(
'label' => 'Path',
'name' => 'path',
'type' => 'text',
'description' => 'Absolute path to ACF plugin folder including trailing slash.<br />Defaults to plugin_dir_path',
'category' => 'acf',
),
array(
'label' => 'URL',
'name' => 'url',
'type' => 'text',
'description' => 'URL to ACF plugin folder including trailing slash. Defaults to plugin_dir_url',
'category' => 'acf',
),
array(
'label' => 'Show admin',
'name' => 'show_admin',
'type' => 'true_false',
'description' => 'Show/hide ACF menu item. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Strip slashes',
'name' => 'stripslashes',
'type' => 'true_false',
'description' => 'Runs the function stripslashes on all $_POST data. Some servers / WP instals may require this extra functionality. Defaults to false',
'category' => 'acf',
),
array(
'label' => 'Local',
'name' => 'local',
'type' => 'true_false',
'description' => 'Enable/Disable local (PHP/json) fields. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Json',
'name' => 'json',
'type' => 'true_false',
'description' => 'Enable/Disable json fields. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Json folder (save)',
'name' => 'save_json',
'type' => 'text',
'description' => 'Absolute path to folder where json files will be created when field groups are saved.<br />Defaults to ‘acf-json’ folder within current theme',
'category' => 'acf',
),
array(
'label' => 'Json folder (load)',
'name' => 'load_json',
'type' => 'text',
'description' => 'Array of absolutes paths to folders where field group json files can be read.<br />Defaults to an array containing at index 0, the ‘acf-json’ folder within current theme',
'category' => 'acf',
'format' => 'array',
),
array(
'label' => 'Default language',
'name' => 'default_language',
'type' => 'true_false',
'description' => 'Language code of the default language. Defaults to ”.<br />If WPML is active, ACF will default this to the WPML default language setting',
'category' => 'acf',
),
array(
'label' => 'Current language',
'name' => 'current_language',
'type' => 'true_false',
'description' => 'Language code of the current post’s language. Defaults to ”.<br />If WPML is active, ACF will default this to the WPML current language',
'category' => 'acf',
),
array(
'label' => 'Capability',
'name' => 'capability',
'type' => 'text',
'description' => 'Capability used for ACF post types and if the current user can see the ACF menu item.<br />Defaults to ‘manage_options’.',
'category' => 'acf',
),
array(
'label' => 'Show updates',
'name' => 'show_updates',
'type' => 'true_false',
'description' => 'Enable/Disable updates to appear in plugin list and show/hide the ACF updates admin page.<br />Defaults to true.',
'category' => 'acf',
),
array(
'label' => 'Auto load',
'name' => 'autoload',
'type' => 'true_false',
'description' => 'Sets the text domain used when translating field and field group settings.<br />Defaults to ”. Strings will not be translated if this setting is empty',
'category' => 'acf',
),
array(
'label' => 'l10n',
'name' => 'l10n',
'type' => 'true_false',
'description' => 'Allows ACF to translate field and field group settings using the __() function.<br />Defaults to true. Useful to override translation without modifying the textdomain',
'category' => 'acf',
),
array(
'label' => 'l10n textdomain',
'name' => 'l10n_textdomain',
'type' => 'text',
'description' => 'Sets the text domain used when translating field and field group settings.<br />Defaults to ”. Strings will not be translated if this setting is empty',
'category' => 'acf',
),
array(
'label' => 'Google API key',
'name' => 'google_api_key',
'type' => 'text',
'description' => 'Specify a Google Maps API authentication key to prevent usage limits.<br />Defaults to ”',
'category' => 'acf',
),
array(
'label' => 'Google API client',
'name' => 'google_api_client',
'type' => 'text',
'description' => 'Specify a Google Maps API Client ID to prevent usage limits.<br />Not needed if using <code>google_api_key</code>. Defaults to ”',
'category' => 'acf',
),
array(
'label' => 'Enqueue Google Maps',
'name' => 'enqueue_google_maps',
'type' => 'true_false',
'description' => 'Allows ACF to enqueue and load the Google Maps API JS library.<br />Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Enqueue Select2',
'name' => 'enqueue_select2',
'type' => 'true_false',
'description' => 'Allows ACF to enqueue and load the Select2 JS/CSS library.<br />Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Select2 version',
'name' => 'select2_version',
'type' => 'text',
'description' => 'Defines which version of Select2 library to enqueue. Either 3 or 4.<br />Defaults to 4 since ACF 5.6.0',
'category' => 'acf',
),
array(
'label' => 'Enqueue Date picker',
'name' => 'enqueue_datepicker',
'type' => 'true_false',
'description' => 'Allows ACF to enqueue and load the WP datepicker JS/CSS library.<br />Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Enqueue Date Time picker',
'name' => 'enqueue_datetimepicker',
'type' => 'true_false',
'description' => 'Allows ACF to enqueue and load the datetimepicker JS/CSS library.<br />Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Row index offset',
'name' => 'row_index_offset',
'type' => 'text',
'description' => 'Defines the starting index used in all ‘loop’ and ‘row’ functions.<br />Defaults to 1 (1 is the first row), can be changed to 0 (0 is the first row)',
'category' => 'acf',
),
array(
'label' => 'Remove WP meta box',
'name' => 'remove_wp_meta_box',
'type' => 'true_false',
'description' => 'Allows ACF to remove the default WP custom fields metabox. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Rest API enabled',
'name' => 'rest_api_enabled',
'type' => 'true_false',
'description' => 'Enables/disables the ACF REST API integration.. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Rest API format',
'name' => 'rest_api_format',
'type' => 'text',
'description' => 'Defines how ACF formats field values in the REST API. Defaults to light',
'category' => 'acf',
),
array(
'label' => 'Rest API Embed Links',
'name' => 'rest_api_embed_links',
'type' => 'true_false',
'description' => 'Enables/disables embed links for ACF fields in the REST API. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Preload Blocks',
'name' => 'preload_blocks',
'type' => 'true_false',
'description' => 'Allows ACF to preload the initial render html of ACF Blocks into the block editor. Defaults to true',
'category' => 'acf',
),
array(
'label' => 'Enable Shortcode',
'name' => 'enable_shortcode',
'type' => 'true_false',
'description' => 'Enable the ACF shortcode. Defaults to true',
'category' => 'acf',
),
),
// ACFE
'acfe' => array(
array(
'label' => 'Theme Folder',
'name' => 'acfe/theme_folder',
'type' => 'text',
'description' => 'Detected Theme Folder',
'category' => 'acfe',
),
array(
'label' => 'Theme Path',
'name' => 'acfe/theme_path',
'type' => 'text',
'description' => 'Detected Theme Path',
'category' => 'acfe',
),
array(
'label' => 'Theme URL',
'name' => 'acfe/theme_url',
'type' => 'text',
'description' => 'Detected Theme URL',
'category' => 'acfe',
),
),
// AutoSync
'autosync' => array(
array(
'label' => 'Json',
'name' => 'acfe/json',
'type' => 'true_false',
'description' => 'Whenever Json AutoSync is enabled',
'category' => 'autosync',
),
array(
'label' => 'Json: Load',
'name' => 'acfe/json_load',
'type' => 'text',
'description' => 'Json AutoSync load paths (array)',
'category' => 'autosync',
'format' => 'array',
),
array(
'label' => 'Json: Save',
'name' => 'acfe/json_save',
'type' => 'text',
'description' => 'Json AutoSync saving path',
'category' => 'autosync',
),
array(
'label' => 'PHP',
'name' => 'acfe/php',
'type' => 'true_false',
'description' => 'Whenever PHP AutoSync is enabled',
'category' => 'autosync',
),
array(
'label' => 'PHP: Load',
'name' => 'acfe/php_load',
'type' => 'text',
'description' => 'PHP AutoSync load paths (array)',
'category' => 'autosync',
'format' => 'array',
),
array(
'label' => 'PHP: Save',
'name' => 'acfe/php_save',
'type' => 'text',
'description' => 'PHP AutoSync saving path',
'category' => 'autosync',
),
),
// Modules
'modules' => array(
array(
'label' => 'Author',
'name' => 'acfe/modules/author',
'type' => 'true_false',
'description' => 'Show/hide the Author module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Block Types',
'name' => 'acfe/modules/block_types',
'type' => 'true_false',
'description' => 'Show/hide the Block Types module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Categories',
'name' => 'acfe/modules/categories',
'type' => 'true_false',
'description' => 'Enable/disable the Field Group Categories taxonomy. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Developer mode',
'name' => 'acfe/dev',
'type' => 'true_false',
'description' => 'Show/hide the advanced WP post meta box. Defaults to false',
'category' => 'modules',
),
array(
'label' => 'Forms',
'name' => 'acfe/modules/forms',
'type' => 'true_false',
'description' => 'Show/hide the Forms module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Forms: Top Level',
'name' => 'acfe/modules/forms/top_level',
'type' => 'true_false',
'description' => 'Show/hide the Forms module as top level menu. Defaults to false',
'category' => 'modules',
),
array(
'label' => 'Multilangual',
'name' => 'acfe/modules/multilang',
'type' => 'true_false',
'description' => 'Enable/disable Multilang compatibility module for WPML & Polylang. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Options',
'name' => 'acfe/modules/options',
'type' => 'true_false',
'description' => 'Show/hide the Options module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Options Pages',
'name' => 'acfe/modules/options_pages',
'type' => 'true_false',
'description' => 'Show/hide the Options Pages module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Performance',
'name' => 'acfe/modules/performance',
'type' => 'text',
'description' => 'Enable/disable Performance module. Defaults to false',
'category' => 'modules',
),
array(
'label' => 'Post Types',
'name' => 'acfe/modules/post_types',
'type' => 'true_false',
'description' => 'Show/hide the Post Types module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'Taxonomies',
'name' => 'acfe/modules/taxonomies',
'type' => 'true_false',
'description' => 'Show/hide the Taxonomies module. Defaults to true',
'category' => 'modules',
),
array(
'label' => 'UI Enhancements',
'name' => 'acfe/modules/ui',
'type' => 'true_false',
'description' => 'Show/hide the UI enhancements module. Defaults to true',
'category' => 'modules',
),
),
// Fields
'fields' => array(
array(
'label' => 'reCaptcha: Secret key',
'name' => 'acfe/field/recaptcha/secret_key',
'type' => 'text',
'description' => 'The default reCaptcha secret key',
'category' => 'fields',
),
array(
'label' => 'reCaptcha: Site key',
'name' => 'acfe/field/recaptcha/site_key',
'type' => 'text',
'description' => 'The default reCaptcha site key',
'category' => 'fields',
),
array(
'label' => 'reCaptcha: Version',
'name' => 'acfe/field/recaptcha/version',
'type' => 'text',
'description' => 'The default reCaptcha version',
'category' => 'fields',
),
array(
'label' => 'reCaptcha: V2 size',
'name' => 'acfe/field/recaptcha/v2/size',
'type' => 'text',
'description' => 'The default reCaptcha v2 size',
'category' => 'fields',
),
array(
'label' => 'reCaptcha: V2 theme',
'name' => 'acfe/field/recaptcha/v2/theme',
'type' => 'text',
'description' => 'The default reCaptcha v2 theme',
'category' => 'fields',
),
array(
'label' => 'reCaptcha: V3 hide logo',
'name' => 'acfe/field/recaptcha/v3/hide_logo',
'type' => 'true_false',
'description' => 'Show/hide reCaptcha v3 logo',
'category' => 'fields',
),
),
);
}
}
// instantiate
acf_new_instance('acfe_admin_settings');
endif;
if(!class_exists('acfe_admin_settings_ui')):
class acfe_admin_settings_ui{
// vars
public $defaults = array();
public $updated = array();
public $fields = array();
/**
* construct
*/
function __construct(){
add_action('admin_menu', array($this, 'admin_menu'));
add_action('acfe/admin_settings/load', array($this, 'load'));
add_action('acfe/admin_settings/html', array($this, 'html'));
}
/**
* admin_menu
*/
function admin_menu(){
if(!acf_get_setting('show_admin')){
return;
}
$page = add_submenu_page('edit.php?post_type=acf-field-group', __('Settings'), __('Settings'), acf_get_setting('capability'), 'acfe-settings', array($this, 'menu_html'));
add_action("load-{$page}", array($this, 'menu_load'));
}
/**
* menu_load
*/
function menu_load(){
do_action('acfe/admin_settings/load');
}
/**
* menu_html
*/
function menu_html(){
do_action('acfe/admin_settings/html');
}
/**
* load
*/
function load(){
$acfe_admin_settings = acf_get_instance('acfe_admin_settings');
$this->defaults = $acfe_admin_settings->defaults;
$this->updated = $acfe_admin_settings->updated;
$this->fields = $acfe_admin_settings->fields;
// Enqueue
acf_enqueue_scripts();
add_action('admin_footer', array($this, 'admin_footer'));
}
/**
* admin_footer
*/
function admin_footer(){
?>
<script type="text/javascript">
(function($) {
$('body').removeClass('post-type-acf-field-group');
})(jQuery);
</script>
<?php
}
/**
* prepare_setting
*
* @param $setting
*
* @return array|false
*/
function prepare_setting($setting){
$setting = wp_parse_args($setting, array(
'label' => '',
'name' => '',
'type' => '',
'description' => '',
'category' => '',
'format' => '',
'default' => '',
'updated' => '',
'diff' => false,
));
$name = $setting['name'];
$type = $setting['type'];
// setting doesn't exist in default acf settings
// probably an older version of acf
if(!isset($this->defaults[ $name ])){
return false;
}
$format = $setting['format'];
$default = $this->defaults[ $name ];
$updated = $this->updated[ $name ];
$vars = array(
'default' => $this->defaults[ $name ],
'updated' => $this->updated[ $name ]
);
foreach($vars as $v => $var){
$result = $var;
if($type === 'true_false'){
$result = $var ? '<span class="dashicons dashicons-saved"></span>' : '<span class="dashicons dashicons-no-alt"></span>';
}elseif($type === 'text'){
$result = '<span class="dashicons dashicons-no-alt"></span>';
if($format === 'array' && empty($var) && $v === 'updated' && $default !== $updated){
$var = array('(empty)');
}
if(!empty($var)){
if(!is_array($var)){
$var = explode(',', $var);
}
foreach($var as $k => &$r){
if(is_array($r)){
$encode = json_encode($r);
$r = '<div class="acfe-settings-text"><code>' . $encode . '</code></div>';
}else{
if(!is_numeric($k)){
$r = "{$k} = {$r}";
}
$r = '<div class="acf-js-tooltip acfe-settings-text" title="' . $r . '"><code>' . $r . '</code></div>';
}
}
$result = implode('', $var);
}
}
$setting[$v] = $result;
}
// Local Changes
if($default !== $updated){
$setting['updated'] .= '<span style="color:#888; margin-left:7px;vertical-align: 6px;font-size:11px;">(Local code)</span>';
$setting['diff'] = true;
}
return $setting;
}
/**
* html
*/
function html(){
?>
<div class="wrap" id="acfe-admin-settings">
<h1><?php _e('Settings'); ?></h1>
<div id="poststuff">
<div id="post-body" class="metabox-holder">
<!-- Metabox -->
<div id="postbox-container-2" class="postbox-container">
<div class="postbox acf-postbox">
<div class="postbox-header">
<h2 class="hndle ui-sortable-handle"><span><?php _e('Settings'); ?></span></h2>
</div>
<div class="inside acf-fields -left">
<?php $this->render_fields(); ?>
<script type="text/javascript">
if(typeof acf !== 'undefined'){
acf.newPostbox({
'id': 'acfe-settings',
'label': 'left'
});
}
</script>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
}
/**
* render_fields
*/
function render_fields(){
foreach(array('ACF', 'ACFE', 'AutoSync', 'Modules', 'Fields') as $tab){
// Category
$category = sanitize_title($tab);
if(isset($this->fields[$category])){
$fields = array();
$count = 0;
foreach($this->fields[$category] as $field){
$field = $this->prepare_setting($field);
// make sure the setting exists
if($field){
$fields[] = $field;
}
}
foreach($fields as $field){
if(!$field['diff']) continue;
$count++;
}
$class = $count > 0 ? 'acfe-tab-badge' : 'acfe-tab-badge acf-hidden';
$tab .= ' <span class="' . $class . '">' . $count . '</span>';
// Tab
acf_render_field_wrap(array(
'type' => 'tab',
'label' => $tab,
'key' => 'field_acfe_settings_tabs',
'wrapper' => array(
'data-no-preference' => true,
),
));
// Thead
acf_render_field_wrap(array(
'type' => 'acfe_dynamic_render',
'label' => '',
'key' => 'field_acfe_settings_thead_' . $category,
'wrapper' => array(
'class' => 'acfe-settings-thead'
),
'render' => function($field){
?>
<div>Default</div>
<div>Registered</div>
<?php
}
));
$icon = acf_version_compare('wp', '>=', '5.5') ? 'dashicons-info-outline' : 'dashicons-info';
foreach($fields as $field){ ?>
<div class="acf-field">
<div class="acf-label">
<span class="acfe-field-tooltip acf-js-tooltip dashicons <?php echo $icon; ?>" title="<?php echo $field['name']; ?>"></span>
<label><?php echo $field['label']; ?></label>
<?php if($field['description']){ ?>
<p class="description"><?php echo $field['description']; ?></p>
<?php } ?>
</div>
<div class="acf-input">
<div><?php echo $field['default']; ?></div>
<div><?php echo $field['updated']; ?></div>
</div>
</div>
<?php
}
}
}
}
}
acf_new_instance('acfe_admin_settings_ui');
endif;