Merge tag '5.10.2' into develop
5.10.2 Release Date - 31 August 2021 - Fix - Fixed block duplication issues which created blocks with duplicate block IDs - Fix - Fixed an issue with ACF errors displaying in the media library outside of ACF fields - Fix - Changed label of "Enable Opacity?" to "Allow transparency" in the colour picker - Fix - Revert "style" attributes of ACF Blocks to 5.9.x behaviour for template compatibility - Fix - Allow safe HTML inside select2 field labels - Fix - Don't render the "acf-block-preview" div when preloading blocks in edit mode 5.10.1 Release Date - 26 August 2021 - Fix - Fixed conflict with WooCommerce loading SelectWoo which is not directly compatible with Select2. 5.10 Release Date - 25 August 2021 - View Release Post - Enhancement - Improved security by running all user-generated content through wp_kses() by default - Enhancement - New ACF Blocks features - Switched to v2 of the Blocks API for WordPress 5.6+ - Block preloading now enabled by default- - Block preloading now supports blocks set to "Edit" mode - Add support for full height alignment setting - Enhancement - Added setting to color picker field to enable an opacity slider - Enhancement - Allow deletion of first field group location rule if multiple rules have been added thanks to Arthur Shlain - Fix - Fixed vulnerability with acf_shortcode() where users with subscriber role could view arbitrary ACF data, thanks to Keitaro Yamazaki - Fix - Fixed vulnerability where users with subscriber role could move fields and view field groups, thanks to Keitaro Yamazaki - Fix - Fixed issue where fields in legacy widgets weren't saving in new widget block editor - Fix - Fixed issue with custom field validation in scheduled posts - Fix - Fixed warnings thrown by clone field if the cloned field group is empty - Fix - Fixed issue where Select2 search input wouldn't have focus in WordPress 5.8+ - Fix - Fixed issue with Select2 value sorting when Yoast SEO is installed - Fix - Fixed deprecation warnings in block editor in WordPress 5.6+ - i18n - Updated Swedish translation thanks to Erik Betshammar
This commit is contained in:
commit
5257f76538
|
|
@ -255,7 +255,6 @@
|
|||
}
|
||||
.rule-groups .rule-group {
|
||||
margin: 0 0 5px;
|
||||
/* Don't allow user to delete the first field group */
|
||||
}
|
||||
.rule-groups .rule-group h4 {
|
||||
margin: 0 0 3px;
|
||||
|
|
@ -279,12 +278,13 @@
|
|||
.rule-groups .rule-group tr:hover td.remove a {
|
||||
visibility: visible;
|
||||
}
|
||||
.rule-groups .rule-group:first-child tr:first-child td.remove a {
|
||||
visibility: hidden !important;
|
||||
}
|
||||
.rule-groups .rule-group select:empty {
|
||||
background: #f8f8f8;
|
||||
}
|
||||
.rule-groups:not(.rule-groups-multiple) .rule-group:first-child tr:first-child td.remove a {
|
||||
/* Don't allow user to delete the only rule group */
|
||||
visibility: hidden !important;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1266,6 +1266,36 @@
|
|||
acf.registerFieldSetting( TimePickerDisplayFormatFieldSetting );
|
||||
acf.registerFieldSetting( TimePickerReturnFormatFieldSetting );
|
||||
|
||||
/**
|
||||
* Color Picker Settings.
|
||||
*
|
||||
* @date 16/12/20
|
||||
* @since 5.9.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
var ColorPickerReturnFormat = acf.FieldSetting.extend({
|
||||
type: 'color_picker',
|
||||
name: 'enable_opacity',
|
||||
render: function(){
|
||||
var $return_format_setting = this.fieldObject.$setting('return_format');
|
||||
var $default_value_setting = this.fieldObject.$setting('default_value');
|
||||
var $labelText = $return_format_setting.find('input[type="radio"][value="string"]').parent('label').contents().last();
|
||||
var $defaultPlaceholder = $default_value_setting.find('input[type="text"]');
|
||||
var l10n = acf.get('colorPickerL10n');
|
||||
|
||||
if( this.field.val() ) {
|
||||
$labelText.replaceWith( l10n.rgba_string );
|
||||
$defaultPlaceholder.attr('placeholder', 'rgba(255,255,255,0.8)');
|
||||
} else {
|
||||
$labelText.replaceWith( l10n.hex_string );
|
||||
$defaultPlaceholder.attr('placeholder', '#FFFFFF');
|
||||
}
|
||||
}
|
||||
});
|
||||
acf.registerFieldSetting( ColorPickerReturnFormat );
|
||||
|
||||
})(jQuery);
|
||||
(function($, undefined){
|
||||
|
||||
|
|
@ -2166,6 +2196,7 @@
|
|||
|
||||
initialize: function(){
|
||||
this.$el = $('#acf-field-group-locations');
|
||||
this.updateGroupsClass();
|
||||
},
|
||||
|
||||
onClickAddRule: function( e, $el ){
|
||||
|
|
@ -2186,6 +2217,7 @@
|
|||
|
||||
addRule: function( $tr ){
|
||||
acf.duplicate( $tr );
|
||||
this.updateGroupsClass();
|
||||
},
|
||||
|
||||
removeRule: function( $tr ){
|
||||
|
|
@ -2194,6 +2226,13 @@
|
|||
} else {
|
||||
$tr.remove();
|
||||
}
|
||||
|
||||
// Update h4
|
||||
var $group = this.$('.rule-group:first');
|
||||
$group.find('h4').text( acf.__('Show this field group if') );
|
||||
|
||||
|
||||
this.updateGroupsClass();
|
||||
},
|
||||
|
||||
changeRule: function( $rule ){
|
||||
|
|
@ -2238,7 +2277,24 @@
|
|||
|
||||
// remove all tr's except the first one
|
||||
$group2.find('tr').not(':first').remove();
|
||||
}
|
||||
|
||||
// update the groups class
|
||||
this.updateGroupsClass();
|
||||
},
|
||||
|
||||
updateGroupsClass: function () {
|
||||
var $group = this.$(".rule-group:last");
|
||||
|
||||
var $ruleGroups = $group.closest(".rule-groups");
|
||||
|
||||
var rows_count = $ruleGroups.find(".acf-table tr").length;
|
||||
|
||||
if (rows_count > 1) {
|
||||
$ruleGroups.addClass("rule-groups-multiple");
|
||||
} else {
|
||||
$ruleGroups.removeClass("rule-groups-multiple");
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -7729,10 +7729,25 @@
|
|||
placeholder: this.get('placeholder'),
|
||||
multiple: this.get('multiple'),
|
||||
data: [],
|
||||
escapeMarkup: function( string ){
|
||||
return acf.escHtml( string );
|
||||
},
|
||||
escapeMarkup: function( markup ) {
|
||||
if (typeof markup !== 'string') {
|
||||
return markup;
|
||||
}
|
||||
return acf.escHtml( markup );
|
||||
}
|
||||
};
|
||||
|
||||
// Only use the template if SelectWoo is not loaded to work around https://github.com/woocommerce/woocommerce/pull/30473
|
||||
if ( ! acf.isset(window, 'jQuery', 'fn', 'selectWoo') ) {
|
||||
|
||||
options.templateSelection = function( selection ) {
|
||||
var $selection = $('<span class="acf-selection"></span>');
|
||||
$selection.html( acf.escHtml( selection.text ) );
|
||||
$selection.data('element', selection.element);
|
||||
return $selection;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
// multiple
|
||||
if( options.multiple ) {
|
||||
|
|
@ -7788,8 +7803,12 @@
|
|||
// loop
|
||||
$ul.find('.select2-selection__choice').each(function() {
|
||||
|
||||
// vars
|
||||
var $option = $( $(this).data('data').element );
|
||||
// Attempt to use .data if it exists (select2 version < 4.0.6) or use our template data instead.
|
||||
if ( $(this).data('data') ) {
|
||||
var $option = $( $(this).data('data').element );
|
||||
} else {
|
||||
var $option = $( $(this).children('span.acf-selection').data('element') );
|
||||
}
|
||||
|
||||
// detach and re-append to end
|
||||
$option.detach().appendTo( $select );
|
||||
|
|
@ -9656,7 +9675,7 @@
|
|||
var lastPostStatus = '';
|
||||
wp.data.subscribe(function() {
|
||||
var postStatus = editorSelect.getEditedPostAttribute( 'status' );
|
||||
useValidation = ( postStatus === 'publish' );
|
||||
useValidation = ( postStatus === 'publish' || postStatus === 'future' );
|
||||
lastPostStatus = ( postStatus !== 'publish' ) ? postStatus : lastPostStatus;
|
||||
});
|
||||
|
||||
|
|
@ -9676,7 +9695,7 @@
|
|||
return resolve( 'Validation ignored (autosave).' );
|
||||
}
|
||||
|
||||
// Bail early if validation is not neeed.
|
||||
// Bail early if validation is not needed.
|
||||
if( !useValidation ) {
|
||||
return resolve( 'Validation ignored (draft).' );
|
||||
}
|
||||
|
|
@ -9728,6 +9747,8 @@
|
|||
}
|
||||
}).then(function(){
|
||||
return savePost.apply(_this, _args);
|
||||
}).catch(function(err){
|
||||
// Nothing to do here, user is alerted of validation issues.
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,635 @@
|
|||
/**!
|
||||
* wp-color-picker-alpha
|
||||
*
|
||||
* Overwrite Automattic Iris for enabled Alpha Channel in wpColorPicker
|
||||
* Only run in input and is defined data alpha in true
|
||||
*
|
||||
* Version: 3.0.0
|
||||
* https://github.com/kallookoo/wp-color-picker-alpha
|
||||
* Licensed under the GPLv2 license or later.
|
||||
*/
|
||||
|
||||
( function( $, undef ) {
|
||||
|
||||
var wpColorPickerAlpha = {
|
||||
'version' : 300
|
||||
};
|
||||
|
||||
// Always try to use the last version of this script.
|
||||
if ( 'wpColorPickerAlpha' in window && 'version' in window.wpColorPickerAlpha ) {
|
||||
var version = parseInt( window.wpColorPickerAlpha.version, 10 );
|
||||
if ( ! isNaN( version ) && version >= wpColorPickerAlpha.version ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Prevent multiple initiations
|
||||
if ( Color.fn.hasOwnProperty( 'to_s' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create new method to replace the `Color.toString()` inside the scripts.
|
||||
Color.fn.to_s = function( type ) {
|
||||
type = ( type || 'hex' );
|
||||
// Change hex to rgba to return the correct color.
|
||||
if ( 'hex' === type && this._alpha < 1 ) {
|
||||
type = 'rgba';
|
||||
}
|
||||
|
||||
var color = '';
|
||||
if ( 'hex' === type ) {
|
||||
color = this.toString();
|
||||
} else if ( ! this.error ) {
|
||||
color = this.toCSS( type ).replace( /\(\s+/, '(' ).replace( /\s+\)/, ')' );
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
// Register the global variable.
|
||||
window.wpColorPickerAlpha = wpColorPickerAlpha;
|
||||
|
||||
// Background image encoded
|
||||
var backgroundImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAAHnlligAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHJJREFUeNpi+P///4EDBxiAGMgCCCAGFB5AADGCRBgYDh48CCRZIJS9vT2QBAggFBkmBiSAogxFBiCAoHogAKIKAlBUYTELAiAmEtABEECk20G6BOmuIl0CIMBQ/IEMkO0myiSSraaaBhZcbkUOs0HuBwDplz5uFJ3Z4gAAAABJRU5ErkJggg==';
|
||||
|
||||
/**
|
||||
* Iris
|
||||
*/
|
||||
$.widget( 'a8c.iris', $.a8c.iris, {
|
||||
/**
|
||||
* Alpha options
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
alphaOptions: {
|
||||
alphaEnabled: false,
|
||||
},
|
||||
/**
|
||||
* Get the current color or the new color.
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @param {Object|*} The color instance if not defined return the cuurent color.
|
||||
*
|
||||
* @return {string} The element's color.
|
||||
*/
|
||||
_getColor: function( color ) {
|
||||
if ( color === undef ) {
|
||||
color = this._color;
|
||||
}
|
||||
|
||||
if ( this.alphaOptions.alphaEnabled ) {
|
||||
color = color.to_s( this.alphaOptions.alphaColorType );
|
||||
if ( ! this.alphaOptions.alphaColorWithSpace ) {
|
||||
color = color.replace( /\s+/g, '' );
|
||||
}
|
||||
return color;
|
||||
}
|
||||
return color.toString();
|
||||
},
|
||||
/**
|
||||
* Create widget
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_create: function() {
|
||||
try {
|
||||
// Try to get the wpColorPicker alpha options.
|
||||
this.alphaOptions = this.element.wpColorPicker( 'instance' ).alphaOptions;
|
||||
} catch( e ) {}
|
||||
|
||||
// We make sure there are all options
|
||||
$.extend( {}, this.alphaOptions, {
|
||||
alphaEnabled: false,
|
||||
alphaCustomWidth: 130,
|
||||
alphaReset: false,
|
||||
alphaColorType: 'hex',
|
||||
alphaColorWithSpace: false,
|
||||
} );
|
||||
|
||||
this._super();
|
||||
},
|
||||
/**
|
||||
* Binds event listeners to the Iris.
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_addInputListeners: function( input ) {
|
||||
var self = this,
|
||||
debounceTimeout = 100,
|
||||
callback = function( event ){
|
||||
var val = input.val(),
|
||||
color = new Color( val ),
|
||||
val = val.replace( /^(#|(rgb|hsl)a?)/, '' ),
|
||||
type = self.alphaOptions.alphaColorType;
|
||||
|
||||
input.removeClass( 'iris-error' );
|
||||
|
||||
if ( ! color.error ) {
|
||||
// let's not do this on keyup for hex shortcodes
|
||||
if ( 'hex' !== type || ! ( event.type === 'keyup' && val.match( /^[0-9a-fA-F]{3}$/ ) ) ) {
|
||||
// Compare color ( #AARRGGBB )
|
||||
if ( color.toIEOctoHex() !== self._color.toIEOctoHex() ) {
|
||||
self._setOption( 'color', self._getColor( color ) );
|
||||
}
|
||||
}
|
||||
} else if ( val !== '' ) {
|
||||
input.addClass( 'iris-error' );
|
||||
}
|
||||
};
|
||||
|
||||
input.on( 'change', callback ).on( 'keyup', self._debounce( callback, debounceTimeout ) );
|
||||
|
||||
// If we initialized hidden, show on first focus. The rest is up to you.
|
||||
if ( self.options.hide ) {
|
||||
input.one( 'focus', function() {
|
||||
self.show();
|
||||
});
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Init Controls
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_initControls: function() {
|
||||
this._super();
|
||||
|
||||
if ( this.alphaOptions.alphaEnabled ) {
|
||||
// Create Alpha controls
|
||||
var self = this,
|
||||
stripAlpha = self.controls.strip.clone(false, false),
|
||||
stripAlphaSlider = stripAlpha.find( '.iris-slider-offset' ),
|
||||
controls = {
|
||||
stripAlpha : stripAlpha,
|
||||
stripAlphaSlider : stripAlphaSlider
|
||||
};
|
||||
|
||||
stripAlpha.addClass( 'iris-strip-alpha' );
|
||||
stripAlphaSlider.addClass( 'iris-slider-offset-alpha' );
|
||||
stripAlpha.appendTo( self.picker.find( '.iris-picker-inner' ) );
|
||||
|
||||
// Push new controls
|
||||
$.each( controls, function( k, v ) {
|
||||
self.controls[k] = v;
|
||||
} );
|
||||
|
||||
// Create slider
|
||||
self.controls.stripAlphaSlider.slider( {
|
||||
orientation : 'vertical',
|
||||
min : 0,
|
||||
max : 100,
|
||||
step : 1,
|
||||
value : parseInt( self._color._alpha * 100 ),
|
||||
slide : function( event, ui ) {
|
||||
self.active = 'strip';
|
||||
// Update alpha value
|
||||
self._color._alpha = parseFloat( ui.value / 100 );
|
||||
self._change.apply( self, arguments );
|
||||
}
|
||||
} );
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Create the controls sizes
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @param {bool} reset Set to True for recreate the controls sizes.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_dimensions: function( reset ) {
|
||||
this._super( reset );
|
||||
|
||||
if ( this.alphaOptions.alphaEnabled ) {
|
||||
var self = this,
|
||||
opts = self.options,
|
||||
controls = self.controls,
|
||||
square = controls.square,
|
||||
strip = self.picker.find( '.iris-strip' ),
|
||||
innerWidth, squareWidth, stripWidth, stripMargin, totalWidth;
|
||||
|
||||
/**
|
||||
* I use Math.round() to avoid possible size errors,
|
||||
* this function returns the value of a number rounded
|
||||
* to the nearest integer.
|
||||
*
|
||||
* The width to append all widgets,
|
||||
* if border is enabled, 22 is subtracted.
|
||||
* 20 for css left and right property
|
||||
* 2 for css border
|
||||
*/
|
||||
innerWidth = Math.round( self.picker.outerWidth( true ) - ( opts.border ? 22 : 0 ) );
|
||||
// The width of the draggable, aka square.
|
||||
squareWidth = Math.round( square.outerWidth() );
|
||||
// The width for the sliders
|
||||
stripWidth = Math.round( ( innerWidth - squareWidth ) / 2 );
|
||||
// The margin for the sliders
|
||||
stripMargin = Math.round( stripWidth / 2 );
|
||||
// The total width of the elements.
|
||||
totalWidth = Math.round( squareWidth + ( stripWidth * 2 ) + ( stripMargin * 2 ) );
|
||||
|
||||
// Check and change if necessary.
|
||||
while ( totalWidth > innerWidth ) {
|
||||
stripWidth = Math.round( stripWidth - 2 );
|
||||
stripMargin = Math.round( stripMargin - 1 );
|
||||
totalWidth = Math.round( squareWidth + ( stripWidth * 2 ) + ( stripMargin * 2 ) );
|
||||
}
|
||||
|
||||
|
||||
square.css( 'margin', '0' );
|
||||
strip.width( stripWidth ).css( 'margin-left', stripMargin + 'px' );
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Callback to update the controls and the current color.
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_change: function() {
|
||||
var self = this,
|
||||
active = self.active;
|
||||
|
||||
self._super();
|
||||
|
||||
if ( self.alphaOptions.alphaEnabled ) {
|
||||
var controls = self.controls,
|
||||
alpha = parseInt( self._color._alpha * 100 ),
|
||||
color = self._color.toRgb(),
|
||||
gradient = [
|
||||
'rgb(' + color.r + ',' + color.g + ',' + color.b + ') 0%',
|
||||
'rgba(' + color.r + ',' + color.g + ',' + color.b + ', 0) 100%'
|
||||
],
|
||||
target = self.picker.closest( '.wp-picker-container' ).find( '.wp-color-result' );
|
||||
|
||||
self.options.color = self._getColor();
|
||||
// Generate background slider alpha, only for CSS3.
|
||||
controls.stripAlpha.css( { 'background' : 'linear-gradient(to bottom, ' + gradient.join( ', ' ) + '), url(' + backgroundImage + ')' } );
|
||||
// Update alpha value
|
||||
if ( active ) {
|
||||
controls.stripAlphaSlider.slider( 'value', alpha );
|
||||
}
|
||||
|
||||
if ( ! self._color.error ) {
|
||||
self.element.removeClass( 'iris-error' ).val( self.options.color );
|
||||
}
|
||||
|
||||
self.picker.find( '.iris-palette-container' ).on( 'click.palette', '.iris-palette', function() {
|
||||
var color = $( this ).data( 'color' );
|
||||
if ( self.alphaOptions.alphaReset ) {
|
||||
self._color._alpha = 1;
|
||||
color = self._getColor();
|
||||
}
|
||||
self._setOption( 'color', color );
|
||||
} );
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Paint dimensions.
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @param {string} origin Origin (position).
|
||||
* @param {string} control Type of the control,
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_paintDimension: function( origin, control ) {
|
||||
var self = this,
|
||||
color = false;
|
||||
|
||||
// Fix for slider hue opacity.
|
||||
if ( self.alphaOptions.alphaEnabled && 'strip' === control ) {
|
||||
color = self._color;
|
||||
self._color = new Color( color.toString() );
|
||||
self.hue = self._color.h();
|
||||
}
|
||||
|
||||
self._super( origin, control );
|
||||
|
||||
// Restore the color after paint.
|
||||
if ( color ) {
|
||||
self._color = color;
|
||||
}
|
||||
},
|
||||
/**
|
||||
* To update the options, see original source to view the available options.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @param {string} key The Option name.
|
||||
* @param {mixed} value The Option value to update.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_setOption: function( key, value ) {
|
||||
var self = this;
|
||||
if ( 'color' === key && self.alphaOptions.alphaEnabled ) {
|
||||
// cast to string in case we have a number
|
||||
value = '' + value;
|
||||
newColor = new Color( value ).setHSpace( self.options.mode );
|
||||
// Check if error && Check the color to prevent callbacks with the same color.
|
||||
if ( ! newColor.error && self._getColor( newColor ) !== self._getColor() ) {
|
||||
self._color = newColor;
|
||||
self.options.color = self._getColor();
|
||||
self.active = 'external';
|
||||
self._change();
|
||||
}
|
||||
} else {
|
||||
return self._super( key, value );
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Returns the iris object if no new color is provided. If a new color is provided, it sets the new color.
|
||||
*
|
||||
* @param newColor {string|*} The new color to use. Can be undefined.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @return {string} The element's color.
|
||||
*/
|
||||
color: function( newColor ) {
|
||||
if ( newColor === true ) {
|
||||
return this._color.clone();
|
||||
}
|
||||
if ( newColor === undef ) {
|
||||
return this._getColor();
|
||||
}
|
||||
this.option( 'color', newColor );
|
||||
},
|
||||
} );
|
||||
|
||||
/**
|
||||
* wpColorPicker
|
||||
*/
|
||||
$.widget( 'wp.wpColorPicker', $.wp.wpColorPicker, {
|
||||
/**
|
||||
* Alpha options
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
alphaOptions: {
|
||||
alphaEnabled: false,
|
||||
},
|
||||
/**
|
||||
* Get the alpha options.
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {object} The current alpha options.
|
||||
*/
|
||||
_getAlphaOptions: function() {
|
||||
var el = this.element,
|
||||
type = ( el.data( 'type' ) || this.options.type ),
|
||||
color = ( el.data( 'defaultColor' ) || el.val() ),
|
||||
options = {
|
||||
alphaEnabled: ( el.data( 'alphaEnabled' ) || false ),
|
||||
alphaCustomWidth: 130,
|
||||
alphaReset: false,
|
||||
alphaColorType: 'rgb',
|
||||
alphaColorWithSpace: false,
|
||||
};
|
||||
|
||||
if ( options.alphaEnabled ) {
|
||||
options.alphaEnabled = ( el.is( 'input' ) && 'full' === type );
|
||||
}
|
||||
|
||||
if ( ! options.alphaEnabled ) {
|
||||
return options;
|
||||
}
|
||||
|
||||
options.alphaColorWithSpace = ( color && color.match( /\s/ ) );
|
||||
|
||||
$.each( options, function( name, defaultValue ) {
|
||||
var value = ( el.data( name ) || defaultValue );
|
||||
switch ( name ) {
|
||||
case 'alphaCustomWidth':
|
||||
value = ( value ? parseInt( value, 10 ) : 0 );
|
||||
value = ( isNaN( value ) ? defaultValue : value );
|
||||
break;
|
||||
case 'alphaColorType':
|
||||
if ( ! value.match( /^(hex|(rgb|hsl)a?)$/ ) ) {
|
||||
if ( color && color.match( /^#/ ) ) {
|
||||
value = 'hex';
|
||||
} else if ( color && color.match( /^hsla?/ ) ) {
|
||||
value = 'hsl';
|
||||
} else {
|
||||
value = defaultValue;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
value = !!value;
|
||||
break;
|
||||
}
|
||||
options[name] = value;
|
||||
} );
|
||||
|
||||
return options;
|
||||
},
|
||||
/**
|
||||
* Create widget
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_create: function() {
|
||||
// Return early if Iris support is missing.
|
||||
if ( ! $.support.iris ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Set the alpha options for the current instance.
|
||||
this.alphaOptions = this._getAlphaOptions();
|
||||
|
||||
// Create widget.
|
||||
this._super();
|
||||
},
|
||||
/**
|
||||
* Binds event listeners to the color picker and create options, etc...
|
||||
*
|
||||
* @since 3.0.0
|
||||
* @access private
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
_addListeners: function() {
|
||||
if ( ! this.alphaOptions.alphaEnabled ) {
|
||||
return this._super();
|
||||
}
|
||||
|
||||
var self = this,
|
||||
el = self.element,
|
||||
isDeprecated = self.toggler.is( 'a' );
|
||||
|
||||
this.alphaOptions.defaultWidth = el.width();
|
||||
if ( this.alphaOptions.alphaCustomWidth ) {
|
||||
el.width( parseInt( this.alphaOptions.defaultWidth + this.alphaOptions.alphaCustomWidth, 10 ) );
|
||||
}
|
||||
|
||||
self.toggler.css( {
|
||||
'position': 'relative',
|
||||
'background-image' : 'url(' + backgroundImage + ')'
|
||||
} );
|
||||
|
||||
if ( isDeprecated ) {
|
||||
self.toggler.html( '<span class="color-alpha" />' );
|
||||
} else {
|
||||
self.toggler.append( '<span class="color-alpha" />' );
|
||||
}
|
||||
|
||||
self.colorAlpha = self.toggler.find( 'span.color-alpha' ).css( {
|
||||
'width' : '30px',
|
||||
'height' : '100%',
|
||||
'position' : 'absolute',
|
||||
'top' : 0,
|
||||
'background-color' : el.val(),
|
||||
} );
|
||||
|
||||
// Define the correct position for ltr or rtl direction.
|
||||
if ( 'ltr' === self.colorAlpha.css( 'direction' ) ) {
|
||||
self.colorAlpha.css( {
|
||||
'border-bottom-left-radius' : '2px',
|
||||
'border-top-left-radius' : '2px',
|
||||
'left' : 0
|
||||
} );
|
||||
} else {
|
||||
self.colorAlpha.css( {
|
||||
'border-bottom-right-radius' : '2px',
|
||||
'border-top-right-radius' : '2px',
|
||||
'right' : 0
|
||||
} );
|
||||
}
|
||||
|
||||
|
||||
el.iris( {
|
||||
/**
|
||||
* @summary Handles the onChange event if one has been defined in the options.
|
||||
*
|
||||
* Handles the onChange event if one has been defined in the options and additionally
|
||||
* sets the background color for the toggler element.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @param {Event} event The event that's being called.
|
||||
* @param {HTMLElement} ui The HTMLElement containing the color picker.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
change: function( event, ui ) {
|
||||
self.colorAlpha.css( { 'background-color': ui.color.to_s( self.alphaOptions.alphaColorType ) } );
|
||||
|
||||
// fire change callback if we have one
|
||||
if ( $.isFunction( self.options.change ) ) {
|
||||
self.options.change.call( this, event, ui );
|
||||
}
|
||||
}
|
||||
} );
|
||||
|
||||
|
||||
/**
|
||||
* Prevent any clicks inside this widget from leaking to the top and closing it.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @param {Event} event The event that's being called.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
self.wrap.on( 'click.wpcolorpicker', function( event ) {
|
||||
event.stopPropagation();
|
||||
});
|
||||
|
||||
/**
|
||||
* Open or close the color picker depending on the class.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*/
|
||||
self.toggler.click( function() {
|
||||
if ( self.toggler.hasClass( 'wp-picker-open' ) ) {
|
||||
self.close();
|
||||
} else {
|
||||
self.open();
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Checks if value is empty when changing the color in the color picker.
|
||||
* If so, the background color is cleared.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @param {Event} event The event that's being called.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
el.change( function( event ) {
|
||||
var val = $( this ).val();
|
||||
|
||||
if ( el.hasClass( 'iris-error' ) || val === '' || val.match( /^(#|(rgb|hsl)a?)$/ ) ) {
|
||||
if ( isDeprecated ) {
|
||||
self.toggler.removeAttr( 'style' );
|
||||
}
|
||||
|
||||
self.colorAlpha.css( 'background-color', '' );
|
||||
|
||||
// fire clear callback if we have one
|
||||
if ( $.isFunction( self.options.clear ) ) {
|
||||
self.options.clear.call( this, event );
|
||||
}
|
||||
}
|
||||
} );
|
||||
|
||||
/**
|
||||
* Enables the user to either clear the color in the color picker or revert back to the default color.
|
||||
*
|
||||
* @since 3.0.0
|
||||
*
|
||||
* @param {Event} event The event that's being called.
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
self.button.click( function( event ) {
|
||||
if ( $( this ).hasClass( 'wp-picker-default' ) ) {
|
||||
el.val( self.options.defaultColor ).change();
|
||||
} else if ( $( this ).hasClass( 'wp-picker-clear' ) ) {
|
||||
el.val( '' );
|
||||
if ( isDeprecated ) {
|
||||
self.toggler.removeAttr( 'style' );
|
||||
}
|
||||
|
||||
self.colorAlpha.css( 'background-color', '' );
|
||||
|
||||
// fire clear callback if we have one
|
||||
if ( $.isFunction( self.options.clear ) ) {
|
||||
self.options.clear.call( this, event );
|
||||
}
|
||||
|
||||
el.trigger( 'change' );
|
||||
}
|
||||
} );
|
||||
},
|
||||
} );
|
||||
} ( jQuery ) );
|
||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 525 B After Width: | Height: | Size: 525 B |
|
Before Width: | Height: | Size: 653 B After Width: | Height: | Size: 653 B |
|
|
@ -118,12 +118,14 @@
|
|||
.select2-hidden-accessible {
|
||||
border: 0 !important;
|
||||
clip: rect(0 0 0 0) !important;
|
||||
-webkit-clip-path: inset(50%) !important;
|
||||
clip-path: inset(50%) !important;
|
||||
height: 1px !important;
|
||||
margin: -1px !important;
|
||||
overflow: hidden !important;
|
||||
padding: 0 !important;
|
||||
position: absolute !important;
|
||||
width: 1px !important; }
|
||||
width: 1px !important;
|
||||
white-space: nowrap !important; }
|
||||
|
||||
.select2-container--default .select2-selection--single {
|
||||
background-color: #fff;
|
||||
|
|
@ -186,16 +188,13 @@
|
|||
width: 100%; }
|
||||
.select2-container--default .select2-selection--multiple .select2-selection__rendered li {
|
||||
list-style: none; }
|
||||
.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
|
||||
color: #999;
|
||||
margin-top: 5px;
|
||||
float: left; }
|
||||
.select2-container--default .select2-selection--multiple .select2-selection__clear {
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
font-weight: bold;
|
||||
margin-top: 5px;
|
||||
margin-right: 10px; }
|
||||
margin-right: 10px;
|
||||
padding: 1px; }
|
||||
.select2-container--default .select2-selection--multiple .select2-selection__choice {
|
||||
background-color: #e4e4e4;
|
||||
border: 1px solid #aaa;
|
||||
|
|
@ -214,7 +213,7 @@
|
|||
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
|
||||
color: #333; }
|
||||
|
||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
||||
float: right; }
|
||||
|
||||
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||
|
|
@ -420,9 +419,7 @@
|
|||
color: #555; }
|
||||
|
||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||
float: right; }
|
||||
|
||||
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
margin-right: auto; }
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,4 +1,4 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// Register store for form data.
|
||||
acf_register_store( 'form' );
|
||||
|
|
@ -8,12 +8,12 @@ acf_register_store( 'form' );
|
|||
*
|
||||
* Sets data about the current form.
|
||||
*
|
||||
* @date 6/10/13
|
||||
* @since 5.0.0
|
||||
* @date 6/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $name The store name.
|
||||
* @param array $data Array of data to start the store with.
|
||||
* @return ACF_Data
|
||||
* @param string $name The store name.
|
||||
* @param array $data Array of data to start the store with.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function acf_set_form_data( $name = '', $data = false ) {
|
||||
return acf_get_store( 'form' )->set( $name, $data );
|
||||
|
|
@ -24,11 +24,11 @@ function acf_set_form_data( $name = '', $data = false ) {
|
|||
*
|
||||
* Gets data about the current form.
|
||||
*
|
||||
* @date 6/10/13
|
||||
* @since 5.0.0
|
||||
* @date 6/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $name The store name.
|
||||
* @return mixed
|
||||
* @param string $name The store name.
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_get_form_data( $name = '' ) {
|
||||
return acf_get_store( 'form' )->get( $name );
|
||||
|
|
@ -39,61 +39,66 @@ function acf_get_form_data( $name = '' ) {
|
|||
*
|
||||
* Called within a form to set important information and render hidden inputs.
|
||||
*
|
||||
* @date 15/10/13
|
||||
* @since 5.0.0
|
||||
* @date 15/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function acf_form_data( $data = array() ) {
|
||||
|
||||
|
||||
// Apply defaults.
|
||||
$data = wp_parse_args($data, array(
|
||||
|
||||
/** @type string The current screen (post, user, taxonomy, etc). */
|
||||
'screen' => 'post',
|
||||
|
||||
/** @type int|string The ID of current post being edited. */
|
||||
'post_id' => 0,
|
||||
|
||||
/** @type bool Enables AJAX validation. */
|
||||
'validation' => true,
|
||||
));
|
||||
|
||||
$data = wp_parse_args(
|
||||
$data,
|
||||
array(
|
||||
|
||||
/** @type string The current screen (post, user, taxonomy, etc). */
|
||||
'screen' => 'post',
|
||||
|
||||
/** @type int|string The ID of current post being edited. */
|
||||
'post_id' => 0,
|
||||
|
||||
/** @type bool Enables AJAX validation. */
|
||||
'validation' => true,
|
||||
)
|
||||
);
|
||||
|
||||
// Create nonce using screen.
|
||||
$data['nonce'] = wp_create_nonce( $data['screen'] );
|
||||
|
||||
|
||||
// Append "changed" input used within "_wp_post_revision_fields" action.
|
||||
$data['changed'] = 0;
|
||||
|
||||
|
||||
// Set data.
|
||||
acf_set_form_data( $data );
|
||||
|
||||
|
||||
// Render HTML.
|
||||
?>
|
||||
<div id="acf-form-data" class="acf-hidden">
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
// Create hidden inputs from $data
|
||||
foreach( $data as $name => $value ) {
|
||||
acf_hidden_input(array(
|
||||
'id' => '_acf_' . $name,
|
||||
'name' => '_acf_' . $name,
|
||||
'value' => $value
|
||||
));
|
||||
foreach ( $data as $name => $value ) {
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'id' => '_acf_' . $name,
|
||||
'name' => '_acf_' . $name,
|
||||
'value' => $value,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fires within the #acf-form-data element to add extra HTML.
|
||||
*
|
||||
* @date 15/10/13
|
||||
* @since 5.0.0
|
||||
* @date 15/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $data The form data.
|
||||
* @param array $data The form data.
|
||||
*/
|
||||
do_action( 'acf/form_data', $data );
|
||||
do_action( 'acf/input/form_data', $data );
|
||||
|
||||
|
||||
?>
|
||||
</div>
|
||||
<?php
|
||||
|
|
@ -105,36 +110,36 @@ function acf_form_data( $data = array() ) {
|
|||
*
|
||||
* Saves the $_POST data.
|
||||
*
|
||||
* @date 15/10/13
|
||||
* @since 5.0.0
|
||||
* @date 15/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param int|string $post_id The post id.
|
||||
* @param array $values An array of values to override $_POST.
|
||||
* @return bool True if save was successful.
|
||||
* @param int|string $post_id The post id.
|
||||
* @param array $values An array of values to override $_POST.
|
||||
* @return bool True if save was successful.
|
||||
*/
|
||||
function acf_save_post( $post_id = 0, $values = null ) {
|
||||
|
||||
|
||||
// Override $_POST data with $values.
|
||||
if( $values !== null ) {
|
||||
if ( $values !== null ) {
|
||||
$_POST['acf'] = $values;
|
||||
}
|
||||
|
||||
|
||||
// Bail early if no data to save.
|
||||
if( empty($_POST['acf']) ) {
|
||||
if ( empty( $_POST['acf'] ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Set form data (useful in various filters/actions).
|
||||
acf_set_form_data( 'post_id', $post_id );
|
||||
|
||||
|
||||
// Filter $_POST data for users without the 'unfiltered_html' capability.
|
||||
if( !acf_allow_unfiltered_html() ) {
|
||||
if ( ! acf_allow_unfiltered_html() ) {
|
||||
$_POST['acf'] = wp_kses_post_deep( $_POST['acf'] );
|
||||
}
|
||||
|
||||
|
||||
// Do generic action.
|
||||
do_action( 'acf/save_post', $post_id );
|
||||
|
||||
|
||||
// Return true.
|
||||
return true;
|
||||
}
|
||||
|
|
@ -145,18 +150,18 @@ function acf_save_post( $post_id = 0, $values = null ) {
|
|||
* Private function hooked into 'acf/save_post' to actually save the $_POST data.
|
||||
* This allows developers to hook in before and after ACF has actually saved the data.
|
||||
*
|
||||
* @date 11/1/19
|
||||
* @since 5.7.10
|
||||
* @date 11/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param int|string $post_id The post id.
|
||||
* @return void
|
||||
* @param int|string $post_id The post id.
|
||||
* @return void
|
||||
*/
|
||||
function _acf_do_save_post( $post_id = 0 ) {
|
||||
|
||||
|
||||
// Check and update $_POST data.
|
||||
if( $_POST['acf'] ) {
|
||||
if ( $_POST['acf'] ) {
|
||||
acf_update_values( $_POST['acf'], $post_id );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Run during generic action.
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
/*
|
||||
* acf_is_empty
|
||||
*
|
||||
* Returns true if the value provided is considered "empty". Allows numbers such as 0.
|
||||
*
|
||||
* @date 6/7/16
|
||||
* @since 5.4.0
|
||||
* @date 6/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param mixed $var The value to check.
|
||||
* @return bool
|
||||
* @param mixed $var The value to check.
|
||||
* @return bool
|
||||
*/
|
||||
function acf_is_empty( $var ) {
|
||||
return ( !$var && !is_numeric($var) );
|
||||
return ( ! $var && ! is_numeric( $var ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -20,14 +20,14 @@ function acf_is_empty( $var ) {
|
|||
*
|
||||
* Returns true if the value provided is considered "not empty". Allows numbers such as 0.
|
||||
*
|
||||
* @date 15/7/19
|
||||
* @since 5.8.1
|
||||
* @date 15/7/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param mixed $var The value to check.
|
||||
* @return bool
|
||||
* @param mixed $var The value to check.
|
||||
* @return bool
|
||||
*/
|
||||
function acf_not_empty( $var ) {
|
||||
return ( $var || is_numeric($var) );
|
||||
return ( $var || is_numeric( $var ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -35,20 +35,20 @@ function acf_not_empty( $var ) {
|
|||
*
|
||||
* Returns a unique numeric based id.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $prefix The id prefix. Defaults to 'acf'.
|
||||
* @return string
|
||||
* @param string $prefix The id prefix. Defaults to 'acf'.
|
||||
* @return string
|
||||
*/
|
||||
function acf_uniqid( $prefix = 'acf' ) {
|
||||
|
||||
|
||||
// Instantiate global counter.
|
||||
global $acf_uniqid;
|
||||
if( !isset($acf_uniqid) ) {
|
||||
if ( ! isset( $acf_uniqid ) ) {
|
||||
$acf_uniqid = 1;
|
||||
}
|
||||
|
||||
|
||||
// Return id.
|
||||
return $prefix . '-' . $acf_uniqid++;
|
||||
}
|
||||
|
|
@ -58,25 +58,25 @@ function acf_uniqid( $prefix = 'acf' ) {
|
|||
*
|
||||
* Merges together two arrays but with extra functionality to append class names.
|
||||
*
|
||||
* @date 22/1/19
|
||||
* @since 5.7.10
|
||||
* @date 22/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param array $array1 An array of attributes.
|
||||
* @param array $array2 An array of attributes.
|
||||
* @return array
|
||||
* @param array $array1 An array of attributes.
|
||||
* @param array $array2 An array of attributes.
|
||||
* @return array
|
||||
*/
|
||||
function acf_merge_attributes( $array1, $array2 ) {
|
||||
|
||||
|
||||
// Merge together attributes.
|
||||
$array3 = array_merge( $array1, $array2 );
|
||||
|
||||
|
||||
// Append together special attributes.
|
||||
foreach( array('class', 'style') as $key ) {
|
||||
if( isset($array1[$key]) && isset($array2[$key]) ) {
|
||||
$array3[$key] = trim($array1[$key]) . ' ' . trim($array2[$key]);
|
||||
foreach ( array( 'class', 'style' ) as $key ) {
|
||||
if ( isset( $array1[ $key ] ) && isset( $array2[ $key ] ) ) {
|
||||
$array3[ $key ] = trim( $array1[ $key ] ) . ' ' . trim( $array2[ $key ] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return.
|
||||
return $array3;
|
||||
}
|
||||
|
|
@ -86,24 +86,24 @@ function acf_merge_attributes( $array1, $array2 ) {
|
|||
*
|
||||
* Returns a filtered cache key.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $key The cache key.
|
||||
* @return string
|
||||
* @param string $key The cache key.
|
||||
* @return string
|
||||
*/
|
||||
function acf_cache_key( $key = '' ) {
|
||||
|
||||
|
||||
/**
|
||||
* Filters the cache key.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $key The cache key.
|
||||
* @param string $original_key The original cache key.
|
||||
* @param string $key The cache key.
|
||||
* @param string $original_key The original cache key.
|
||||
*/
|
||||
return apply_filters( "acf/get_cache_key", $key, $key );
|
||||
return apply_filters( 'acf/get_cache_key', $key, $key );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -111,15 +111,15 @@ function acf_cache_key( $key = '' ) {
|
|||
*
|
||||
* Returns an array of $_REQUEST values using the provided defaults.
|
||||
*
|
||||
* @date 28/2/19
|
||||
* @since 5.7.13
|
||||
* @date 28/2/19
|
||||
* @since 5.7.13
|
||||
*
|
||||
* @param array $args An array of args.
|
||||
* @return array
|
||||
* @param array $args An array of args.
|
||||
* @return array
|
||||
*/
|
||||
function acf_request_args( $args = array() ) {
|
||||
foreach( $args as $k => $v ) {
|
||||
$args[ $k ] = isset($_REQUEST[ $k ]) ? $_REQUEST[ $k ] : $args[ $k ];
|
||||
foreach ( $args as $k => $v ) {
|
||||
$args[ $k ] = isset( $_REQUEST[ $k ] ) ? $_REQUEST[ $k ] : $args[ $k ];
|
||||
}
|
||||
return $args;
|
||||
}
|
||||
|
|
@ -127,12 +127,12 @@ function acf_request_args( $args = array() ) {
|
|||
/**
|
||||
* Returns a single $_REQUEST arg with fallback.
|
||||
*
|
||||
* @date 23/10/20
|
||||
* @since 5.9.2
|
||||
* @date 23/10/20
|
||||
* @since 5.9.2
|
||||
*
|
||||
* @param string $key The property name.
|
||||
* @param mixed $default The default value to fallback to.
|
||||
* @return mixed
|
||||
* @param string $key The property name.
|
||||
* @param mixed $default The default value to fallback to.
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_request_arg( $name = '', $default = null ) {
|
||||
return isset( $_REQUEST[ $name ] ) ? $_REQUEST[ $name ] : $default;
|
||||
|
|
@ -146,11 +146,11 @@ acf_register_store( 'filters' );
|
|||
*
|
||||
* Enables a filter with the given name.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param string name The modifer name.
|
||||
* @return void
|
||||
* @param string name The modifer name.
|
||||
* @return void
|
||||
*/
|
||||
function acf_enable_filter( $name = '' ) {
|
||||
acf_get_store( 'filters' )->set( $name, true );
|
||||
|
|
@ -161,11 +161,11 @@ function acf_enable_filter( $name = '' ) {
|
|||
*
|
||||
* Disables a filter with the given name.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param string name The modifer name.
|
||||
* @return void
|
||||
* @param string name The modifer name.
|
||||
* @return void
|
||||
*/
|
||||
function acf_disable_filter( $name = '' ) {
|
||||
acf_get_store( 'filters' )->set( $name, false );
|
||||
|
|
@ -176,11 +176,11 @@ function acf_disable_filter( $name = '' ) {
|
|||
*
|
||||
* Returns the state of a filter for the given name.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param string name The modifer name.
|
||||
* @return array
|
||||
* @param string name The modifer name.
|
||||
* @return array
|
||||
*/
|
||||
function acf_is_filter_enabled( $name = '' ) {
|
||||
return acf_get_store( 'filters' )->get( $name );
|
||||
|
|
@ -191,11 +191,11 @@ function acf_is_filter_enabled( $name = '' ) {
|
|||
*
|
||||
* Returns an array of filters in their current state.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param void
|
||||
* @return array
|
||||
* @param void
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_filters() {
|
||||
return acf_get_store( 'filters' )->get();
|
||||
|
|
@ -206,11 +206,11 @@ function acf_get_filters() {
|
|||
*
|
||||
* Sets an array of filter states.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param array $filters An Array of modifers
|
||||
* @return array
|
||||
* @param array $filters An Array of modifers
|
||||
* @return array
|
||||
*/
|
||||
function acf_set_filters( $filters = array() ) {
|
||||
acf_get_store( 'filters' )->set( $filters );
|
||||
|
|
@ -221,20 +221,20 @@ function acf_set_filters( $filters = array() ) {
|
|||
*
|
||||
* Disables all filters and returns the previous state.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param void
|
||||
* @return array
|
||||
* @param void
|
||||
* @return array
|
||||
*/
|
||||
function acf_disable_filters() {
|
||||
|
||||
|
||||
// Get state.
|
||||
$prev_state = acf_get_filters();
|
||||
|
||||
|
||||
// Set all modifers as false.
|
||||
acf_set_filters( array_map('__return_false', $prev_state) );
|
||||
|
||||
acf_set_filters( array_map( '__return_false', $prev_state ) );
|
||||
|
||||
// Return prev state.
|
||||
return $prev_state;
|
||||
}
|
||||
|
|
@ -244,26 +244,26 @@ function acf_disable_filters() {
|
|||
*
|
||||
* Enables all or an array of specific filters and returns the previous state.
|
||||
*
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
* @date 14/7/16
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param array $filters An Array of modifers
|
||||
* @return array
|
||||
* @param array $filters An Array of modifers
|
||||
* @return array
|
||||
*/
|
||||
function acf_enable_filters( $filters = array() ) {
|
||||
|
||||
|
||||
// Get state.
|
||||
$prev_state = acf_get_filters();
|
||||
|
||||
|
||||
// Allow specific filters to be enabled.
|
||||
if( $filters ) {
|
||||
if ( $filters ) {
|
||||
acf_set_filters( $filters );
|
||||
|
||||
// Set all modifers as true.
|
||||
|
||||
// Set all modifers as true.
|
||||
} else {
|
||||
acf_set_filters( array_map('__return_true', $prev_state) );
|
||||
acf_set_filters( array_map( '__return_true', $prev_state ) );
|
||||
}
|
||||
|
||||
|
||||
// Return prev state.
|
||||
return $prev_state;
|
||||
}
|
||||
|
|
@ -273,27 +273,27 @@ function acf_enable_filters( $filters = array() ) {
|
|||
*
|
||||
* Parses the provided value for an ID.
|
||||
*
|
||||
* @date 29/3/19
|
||||
* @since 5.7.14
|
||||
* @date 29/3/19
|
||||
* @since 5.7.14
|
||||
*
|
||||
* @param mixed $value A value to parse.
|
||||
* @return int
|
||||
* @param mixed $value A value to parse.
|
||||
* @return int
|
||||
*/
|
||||
function acf_idval( $value ) {
|
||||
|
||||
|
||||
// Check if value is numeric.
|
||||
if( is_numeric($value) ) {
|
||||
if ( is_numeric( $value ) ) {
|
||||
return (int) $value;
|
||||
|
||||
// Check if value is array.
|
||||
} elseif( is_array($value) ) {
|
||||
return (int) isset($value['ID']) ? $value['ID'] : 0;
|
||||
|
||||
// Check if value is object.
|
||||
} elseif( is_object($value) ) {
|
||||
return (int) isset($value->ID) ? $value->ID : 0;
|
||||
|
||||
// Check if value is array.
|
||||
} elseif ( is_array( $value ) ) {
|
||||
return (int) isset( $value['ID'] ) ? $value['ID'] : 0;
|
||||
|
||||
// Check if value is object.
|
||||
} elseif ( is_object( $value ) ) {
|
||||
return (int) isset( $value->ID ) ? $value->ID : 0;
|
||||
}
|
||||
|
||||
|
||||
// Return default.
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -303,14 +303,14 @@ function acf_idval( $value ) {
|
|||
*
|
||||
* Checks value for potential id value.
|
||||
*
|
||||
* @date 6/4/19
|
||||
* @since 5.7.14
|
||||
* @date 6/4/19
|
||||
* @since 5.7.14
|
||||
*
|
||||
* @param mixed $value A value to parse.
|
||||
* @return mixed
|
||||
* @param mixed $value A value to parse.
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_maybe_idval( $value ) {
|
||||
if( $id = acf_idval( $value ) ) {
|
||||
if ( $id = acf_idval( $value ) ) {
|
||||
return $id;
|
||||
}
|
||||
return $value;
|
||||
|
|
@ -321,14 +321,14 @@ function acf_maybe_idval( $value ) {
|
|||
*
|
||||
* Casts the provided value as eiter an int or float using a simple hack.
|
||||
*
|
||||
* @date 11/4/19
|
||||
* @since 5.7.14
|
||||
* @date 11/4/19
|
||||
* @since 5.7.14
|
||||
*
|
||||
* @param mixed $value A value to parse.
|
||||
* @return (int|float)
|
||||
* @param mixed $value A value to parse.
|
||||
* @return (int|float)
|
||||
*/
|
||||
function acf_numval( $value ) {
|
||||
return ( intval($value) == floatval($value) ) ? intval($value) : floatval($value);
|
||||
return ( intval( $value ) == floatval( $value ) ) ? intval( $value ) : floatval( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -336,14 +336,14 @@ function acf_numval( $value ) {
|
|||
*
|
||||
* Returns an id attribute friendly string.
|
||||
*
|
||||
* @date 24/12/17
|
||||
* @since 5.6.5
|
||||
* @date 24/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string $str The string to convert.
|
||||
* @return string
|
||||
* @param string $str The string to convert.
|
||||
* @return string
|
||||
*/
|
||||
function acf_idify( $str = '' ) {
|
||||
return str_replace(array('][', '[', ']'), array('-', '-', ''), strtolower($str));
|
||||
return str_replace( array( '][', '[', ']' ), array( '-', '-', '' ), strtolower( $str ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -351,28 +351,28 @@ function acf_idify( $str = '' ) {
|
|||
*
|
||||
* Returns a slug friendly string.
|
||||
*
|
||||
* @date 24/12/17
|
||||
* @since 5.6.5
|
||||
* @date 24/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string $str The string to convert.
|
||||
* @param string $glue The glue between each slug piece.
|
||||
* @return string
|
||||
* @param string $str The string to convert.
|
||||
* @param string $glue The glue between each slug piece.
|
||||
* @return string
|
||||
*/
|
||||
function acf_slugify( $str = '', $glue = '-' ) {
|
||||
return str_replace(array('_', '-', '/', ' '), $glue, strtolower($str));
|
||||
return str_replace( array( '_', '-', '/', ' ' ), $glue, strtolower( $str ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string with correct full stop punctuation.
|
||||
*
|
||||
* @date 12/7/19
|
||||
* @since 5.8.2
|
||||
* @date 12/7/19
|
||||
* @since 5.8.2
|
||||
*
|
||||
* @param string $str The string to format.
|
||||
* @return string
|
||||
* @param string $str The string to format.
|
||||
* @return string
|
||||
*/
|
||||
function acf_punctify( $str = '' ) {
|
||||
if ( substr( trim( strip_tags( $str ) ), -1) !== '.' ) {
|
||||
if ( substr( trim( strip_tags( $str ) ), -1 ) !== '.' ) {
|
||||
return trim( $str ) . '.';
|
||||
}
|
||||
return trim( $str );
|
||||
|
|
@ -383,21 +383,21 @@ function acf_punctify( $str = '' ) {
|
|||
*
|
||||
* Returns true if ACF already did an event.
|
||||
*
|
||||
* @date 30/8/19
|
||||
* @since 5.8.1
|
||||
* @date 30/8/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param string $name The name of the event.
|
||||
* @return bool
|
||||
* @param string $name The name of the event.
|
||||
* @return bool
|
||||
*/
|
||||
function acf_did( $name ) {
|
||||
|
||||
|
||||
// Return true if already did the event (preventing event).
|
||||
if( acf_get_data("acf_did_$name") ) {
|
||||
if ( acf_get_data( "acf_did_$name" ) ) {
|
||||
return true;
|
||||
|
||||
// Otherwise, update store and return false (alowing event).
|
||||
|
||||
// Otherwise, update store and return false (alowing event).
|
||||
} else {
|
||||
acf_set_data("acf_did_$name", true);
|
||||
acf_set_data( "acf_did_$name", true );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -410,26 +410,26 @@ function acf_did( $name ) {
|
|||
* 2. Decode special characters because wp_kses() will normalize entities.
|
||||
* 3. Treat line-breaks as a single character instead of two.
|
||||
* 4. Use mb_strlen() to accomodate special characters.
|
||||
*
|
||||
* @date 04/06/2020
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $str The string to review.
|
||||
* @return int
|
||||
* @date 04/06/2020
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $str The string to review.
|
||||
* @return int
|
||||
*/
|
||||
function acf_strlen( $str ) {
|
||||
return mb_strlen( str_replace("\r\n", "\n", wp_specialchars_decode( wp_unslash( $str ) ) ) );
|
||||
return mb_strlen( str_replace( "\r\n", "\n", wp_specialchars_decode( wp_unslash( $str ) ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a value with default fallback.
|
||||
*
|
||||
* @date 6/4/20
|
||||
* @since 5.9.0
|
||||
* @date 6/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param mixed $value The value.
|
||||
* @param mixed $default_value The default value.
|
||||
* @return mixed
|
||||
* @param mixed $value The value.
|
||||
* @param mixed $default_value The default value.
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_with_default( $value, $default_value ) {
|
||||
return $value ? $value : $default_value;
|
||||
|
|
@ -438,15 +438,15 @@ function acf_with_default( $value, $default_value ) {
|
|||
/**
|
||||
* Returns the current priority of a running action.
|
||||
*
|
||||
* @date 14/07/2020
|
||||
* @since 5.9.0
|
||||
* @date 14/07/2020
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $action The action name.
|
||||
* @return int|bool
|
||||
* @param string $action The action name.
|
||||
* @return int|bool
|
||||
*/
|
||||
function acf_doing_action( $action ) {
|
||||
global $wp_filter;
|
||||
if( isset( $wp_filter[ $action ] ) ) {
|
||||
if ( isset( $wp_filter[ $action ] ) ) {
|
||||
return $wp_filter[ $action ]->current_priority();
|
||||
}
|
||||
return false;
|
||||
|
|
@ -455,16 +455,16 @@ function acf_doing_action( $action ) {
|
|||
/**
|
||||
* Returns the current URL.
|
||||
*
|
||||
* @date 23/01/2015
|
||||
* @since 5.1.5
|
||||
* @date 23/01/2015
|
||||
* @since 5.1.5
|
||||
*
|
||||
* @param void
|
||||
* @return string
|
||||
* @param void
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_current_url() {
|
||||
// Ensure props exist to avoid PHP Notice during CLI commands.
|
||||
if( isset( $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'] ) ) {
|
||||
if ( isset( $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'] ) ) {
|
||||
return ( is_ssl() ? 'https' : 'http' ) . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
}
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// Register store.
|
||||
acf_register_store( 'hook-variations' );
|
||||
|
|
@ -8,23 +8,26 @@ acf_register_store( 'hook-variations' );
|
|||
*
|
||||
* Registers variations for the given filter.
|
||||
*
|
||||
* @date 26/1/19
|
||||
* @since 5.7.11
|
||||
* @date 26/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $filter The filter name.
|
||||
* @param array $variations An array variation keys.
|
||||
* @param int $index The param index to find variation values.
|
||||
* @return void
|
||||
* @param string $filter The filter name.
|
||||
* @param array $variations An array variation keys.
|
||||
* @param int $index The param index to find variation values.
|
||||
* @return void
|
||||
*/
|
||||
function acf_add_filter_variations( $filter = '', $variations = array(), $index = 0 ) {
|
||||
|
||||
|
||||
// Store replacement data.
|
||||
acf_get_store('hook-variations')->set( $filter, array(
|
||||
'type' => 'filter',
|
||||
'variations' => $variations,
|
||||
'index' => $index,
|
||||
));
|
||||
|
||||
acf_get_store( 'hook-variations' )->set(
|
||||
$filter,
|
||||
array(
|
||||
'type' => 'filter',
|
||||
'variations' => $variations,
|
||||
'index' => $index,
|
||||
)
|
||||
);
|
||||
|
||||
// Add generic handler.
|
||||
// Use a priotiry of 10, and accepted args of 10 (ignored by WP).
|
||||
add_filter( $filter, '_acf_apply_hook_variations', 10, 10 );
|
||||
|
|
@ -35,23 +38,26 @@ function acf_add_filter_variations( $filter = '', $variations = array(), $index
|
|||
*
|
||||
* Registers variations for the given action.
|
||||
*
|
||||
* @date 26/1/19
|
||||
* @since 5.7.11
|
||||
* @date 26/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $action The action name.
|
||||
* @param array $variations An array variation keys.
|
||||
* @param int $index The param index to find variation values.
|
||||
* @return void
|
||||
* @param string $action The action name.
|
||||
* @param array $variations An array variation keys.
|
||||
* @param int $index The param index to find variation values.
|
||||
* @return void
|
||||
*/
|
||||
function acf_add_action_variations( $action = '', $variations = array(), $index = 0 ) {
|
||||
|
||||
|
||||
// Store replacement data.
|
||||
acf_get_store('hook-variations')->set( $action, array(
|
||||
'type' => 'action',
|
||||
'variations' => $variations,
|
||||
'index' => $index,
|
||||
));
|
||||
|
||||
acf_get_store( 'hook-variations' )->set(
|
||||
$action,
|
||||
array(
|
||||
'type' => 'action',
|
||||
'variations' => $variations,
|
||||
'index' => $index,
|
||||
)
|
||||
);
|
||||
|
||||
// Add generic handler.
|
||||
// Use a priotiry of 10, and accepted args of 10 (ignored by WP).
|
||||
add_action( $action, '_acf_apply_hook_variations', 10, 10 );
|
||||
|
|
@ -62,50 +68,50 @@ function acf_add_action_variations( $action = '', $variations = array(), $index
|
|||
*
|
||||
* Applys hook variations during apply_filters() or do_action().
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param mixed
|
||||
* @return mixed
|
||||
* @param mixed
|
||||
* @return mixed
|
||||
*/
|
||||
function _acf_apply_hook_variations() {
|
||||
|
||||
|
||||
// Get current filter.
|
||||
$filter = current_filter();
|
||||
|
||||
|
||||
// Get args provided.
|
||||
$args = func_get_args();
|
||||
|
||||
|
||||
// Get variation information.
|
||||
$variations = acf_get_store('hook-variations')->get( $filter );
|
||||
$variations = acf_get_store( 'hook-variations' )->get( $filter );
|
||||
extract( $variations );
|
||||
|
||||
|
||||
// Find field in args using index.
|
||||
$field = $args[ $index ];
|
||||
|
||||
|
||||
// Loop over variations and apply filters.
|
||||
foreach( $variations as $variation ) {
|
||||
|
||||
foreach ( $variations as $variation ) {
|
||||
|
||||
// Get value from field.
|
||||
// First look for "backup" value ("_name", "_key").
|
||||
if( isset($field[ "_$variation" ]) ) {
|
||||
if ( isset( $field[ "_$variation" ] ) ) {
|
||||
$value = $field[ "_$variation" ];
|
||||
} elseif( isset($field[ $variation ]) ) {
|
||||
} elseif ( isset( $field[ $variation ] ) ) {
|
||||
$value = $field[ $variation ];
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Apply filters.
|
||||
if( $type === 'filter' ) {
|
||||
if ( $type === 'filter' ) {
|
||||
$args[0] = apply_filters_ref_array( "$filter/$variation=$value", $args );
|
||||
|
||||
// Or do action.
|
||||
|
||||
// Or do action.
|
||||
} else {
|
||||
do_action_ref_array( "$filter/$variation=$value", $args );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return first arg.
|
||||
return $args[0];
|
||||
}
|
||||
|
|
@ -118,24 +124,26 @@ acf_register_store( 'deprecated-hooks' );
|
|||
*
|
||||
* Registers a deprecated filter to run during the replacement.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $deprecated The deprecated hook.
|
||||
* @param string $version The version this hook was deprecated.
|
||||
* @param string $replacement The replacement hook.
|
||||
* @return void
|
||||
* @param string $deprecated The deprecated hook.
|
||||
* @param string $version The version this hook was deprecated.
|
||||
* @param string $replacement The replacement hook.
|
||||
* @return void
|
||||
*/
|
||||
function acf_add_deprecated_filter( $deprecated, $version, $replacement ) {
|
||||
|
||||
|
||||
// Store replacement data.
|
||||
acf_get_store('deprecated-hooks')->append(array(
|
||||
'type' => 'filter',
|
||||
'deprecated' => $deprecated,
|
||||
'replacement' => $replacement,
|
||||
'version' => $version
|
||||
));
|
||||
|
||||
acf_get_store( 'deprecated-hooks' )->append(
|
||||
array(
|
||||
'type' => 'filter',
|
||||
'deprecated' => $deprecated,
|
||||
'replacement' => $replacement,
|
||||
'version' => $version,
|
||||
)
|
||||
);
|
||||
|
||||
// Add generic handler.
|
||||
// Use a priotiry of 10, and accepted args of 10 (ignored by WP).
|
||||
add_filter( $replacement, '_acf_apply_deprecated_hook', 10, 10 );
|
||||
|
|
@ -146,24 +154,26 @@ function acf_add_deprecated_filter( $deprecated, $version, $replacement ) {
|
|||
*
|
||||
* Registers a deprecated action to run during the replacement.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $deprecated The deprecated hook.
|
||||
* @param string $version The version this hook was deprecated.
|
||||
* @param string $replacement The replacement hook.
|
||||
* @return void
|
||||
* @param string $deprecated The deprecated hook.
|
||||
* @param string $version The version this hook was deprecated.
|
||||
* @param string $replacement The replacement hook.
|
||||
* @return void
|
||||
*/
|
||||
function acf_add_deprecated_action( $deprecated, $version, $replacement ) {
|
||||
|
||||
|
||||
// Store replacement data.
|
||||
acf_get_store('deprecated-hooks')->append(array(
|
||||
'type' => 'action',
|
||||
'deprecated' => $deprecated,
|
||||
'replacement' => $replacement,
|
||||
'version' => $version
|
||||
));
|
||||
|
||||
acf_get_store( 'deprecated-hooks' )->append(
|
||||
array(
|
||||
'type' => 'action',
|
||||
'deprecated' => $deprecated,
|
||||
'replacement' => $replacement,
|
||||
'version' => $version,
|
||||
)
|
||||
);
|
||||
|
||||
// Add generic handler.
|
||||
// Use a priotiry of 10, and accepted args of 10 (ignored by WP).
|
||||
add_filter( $replacement, '_acf_apply_deprecated_hook', 10, 10 );
|
||||
|
|
@ -174,46 +184,46 @@ function acf_add_deprecated_action( $deprecated, $version, $replacement ) {
|
|||
*
|
||||
* Applys a deprecated filter during apply_filters() or do_action().
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param mixed
|
||||
* @return mixed
|
||||
* @param mixed
|
||||
* @return mixed
|
||||
*/
|
||||
function _acf_apply_deprecated_hook() {
|
||||
|
||||
|
||||
// Get current hook.
|
||||
$hook = current_filter();
|
||||
|
||||
|
||||
// Get args provided.
|
||||
$args = func_get_args();
|
||||
|
||||
|
||||
// Get deprecated items for this hook.
|
||||
$items = acf_get_store('deprecated-hooks')->query(array( 'replacement' => $hook ));
|
||||
|
||||
$items = acf_get_store( 'deprecated-hooks' )->query( array( 'replacement' => $hook ) );
|
||||
|
||||
// Loop over results.
|
||||
foreach( $items as $item ) {
|
||||
|
||||
foreach ( $items as $item ) {
|
||||
|
||||
// Extract data.
|
||||
extract( $item );
|
||||
|
||||
|
||||
// Check if anyone is hooked into this deprecated hook.
|
||||
if( has_filter($deprecated) ) {
|
||||
|
||||
if ( has_filter( $deprecated ) ) {
|
||||
|
||||
// Log warning.
|
||||
//_deprecated_hook( $deprecated, $version, $hook );
|
||||
|
||||
// _deprecated_hook( $deprecated, $version, $hook );
|
||||
|
||||
// Apply filters.
|
||||
if( $type === 'filter' ) {
|
||||
if ( $type === 'filter' ) {
|
||||
$args[0] = apply_filters_ref_array( $deprecated, $args );
|
||||
|
||||
// Or do action.
|
||||
|
||||
// Or do action.
|
||||
} else {
|
||||
do_action_ref_array( $deprecated, $args );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return first arg.
|
||||
return $args[0];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,25 +1,25 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* acf_filter_attrs
|
||||
*
|
||||
* Filters out empty attrs from the provided array.
|
||||
*
|
||||
* @date 11/6/19
|
||||
* @since 5.8.1
|
||||
* @date 11/6/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return array
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return array
|
||||
*/
|
||||
function acf_filter_attrs( $attrs ) {
|
||||
|
||||
|
||||
// Filter out empty attrs but allow "0" values.
|
||||
$filtered = array_filter( $attrs, 'acf_not_empty' );
|
||||
|
||||
|
||||
// Correct specific attributes (required="required").
|
||||
foreach( array('required', 'readonly', 'disabled', 'multiple') as $key ) {
|
||||
unset($filtered[ $key ]);
|
||||
if( !empty($attrs[ $key ]) ) {
|
||||
foreach ( array( 'required', 'readonly', 'disabled', 'multiple' ) as $key ) {
|
||||
unset( $filtered[ $key ] );
|
||||
if ( ! empty( $attrs[ $key ] ) ) {
|
||||
$filtered[ $key ] = $key;
|
||||
}
|
||||
}
|
||||
|
|
@ -31,128 +31,102 @@ function acf_filter_attrs( $attrs ) {
|
|||
*
|
||||
* Generated valid HTML from an array of attrs.
|
||||
*
|
||||
* @date 11/6/19
|
||||
* @since 5.8.1
|
||||
* @date 11/6/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_attrs( $attrs ) {
|
||||
$html = '';
|
||||
|
||||
|
||||
// Loop over attrs and validate data types.
|
||||
foreach( $attrs as $k => $v ) {
|
||||
|
||||
foreach ( $attrs as $k => $v ) {
|
||||
|
||||
// String (but don't trim value).
|
||||
if( is_string($v) && ($k !== 'value') ) {
|
||||
$v = trim($v);
|
||||
|
||||
// Boolean
|
||||
} elseif( is_bool($v) ) {
|
||||
if ( is_string( $v ) && ( $k !== 'value' ) ) {
|
||||
$v = trim( $v );
|
||||
|
||||
// Boolean
|
||||
} elseif ( is_bool( $v ) ) {
|
||||
$v = $v ? 1 : 0;
|
||||
|
||||
// Object
|
||||
} elseif( is_array($v) || is_object($v) ) {
|
||||
$v = json_encode($v);
|
||||
|
||||
// Object
|
||||
} elseif ( is_array( $v ) || is_object( $v ) ) {
|
||||
$v = json_encode( $v );
|
||||
}
|
||||
|
||||
|
||||
// Generate HTML.
|
||||
$html .= sprintf( ' %s="%s"', esc_attr($k), esc_attr($v) );
|
||||
$html .= sprintf( ' %s="%s"', esc_attr( $k ), esc_attr( $v ) );
|
||||
}
|
||||
|
||||
|
||||
// Return trimmed.
|
||||
return trim( $html );
|
||||
}
|
||||
|
||||
if ( defined('ACF_EXPERIMENTAL_ESC_HTML') && ACF_EXPERIMENTAL_ESC_HTML ) {
|
||||
|
||||
/**
|
||||
* Sanitizes text content and strips out disallowed HTML.
|
||||
*
|
||||
* This function emulates `wp_kses_post()` with a context of "acf" for extensibility.
|
||||
*
|
||||
* @date 16/4/21
|
||||
* @since 5.9.6
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_html( $string = '' ) {
|
||||
return wp_kses( (string) $string, 'acf' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Private callback for the "wp_kses_allowed_html" filter used to return allowed HTML for "acf" context.
|
||||
*
|
||||
* @date 16/4/21
|
||||
* @since 5.9.6
|
||||
*
|
||||
* @param array $tags An array of allowed tags.
|
||||
* @param string $context The context name.
|
||||
* @return array.
|
||||
*/
|
||||
|
||||
function _acf_kses_allowed_html( $tags, $context ) {
|
||||
global $allowedposttags;
|
||||
|
||||
if( $context === 'acf' ) {
|
||||
return $allowedposttags;
|
||||
}
|
||||
return $tags;
|
||||
}
|
||||
|
||||
add_filter( 'wp_kses_allowed_html', '_acf_kses_allowed_html', 0, 2 );
|
||||
|
||||
} else {
|
||||
|
||||
/**
|
||||
* acf_esc_html
|
||||
*
|
||||
* Encodes <script> tags for safe HTML output.
|
||||
*
|
||||
* @date 12/6/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_html( $string = '' ) {
|
||||
$string = strval($string);
|
||||
|
||||
// Encode "<script" tags to invalidate DOM elements.
|
||||
if( strpos($string, '<script') !== false ) {
|
||||
$string = str_replace('<script', htmlspecialchars('<script'), $string);
|
||||
$string = str_replace('</script', htmlspecialchars('</script'), $string);
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
/**
|
||||
* Sanitizes text content and strips out disallowed HTML.
|
||||
*
|
||||
* This function emulates `wp_kses_post()` with a context of "acf" for extensibility.
|
||||
*
|
||||
* @date 16/4/21
|
||||
* @since 5.9.6
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_html( $string = '' ) {
|
||||
return wp_kses( (string) $string, 'acf' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Private callback for the "wp_kses_allowed_html" filter used to return allowed HTML for "acf" context.
|
||||
*
|
||||
* @date 16/4/21
|
||||
* @since 5.9.6
|
||||
*
|
||||
* @param array $tags An array of allowed tags.
|
||||
* @param string $context The context name.
|
||||
* @return array.
|
||||
*/
|
||||
|
||||
function _acf_kses_allowed_html( $tags, $context ) {
|
||||
global $allowedposttags;
|
||||
|
||||
if ( $context === 'acf' ) {
|
||||
return $allowedposttags;
|
||||
}
|
||||
return $tags;
|
||||
}
|
||||
|
||||
add_filter( 'wp_kses_allowed_html', '_acf_kses_allowed_html', 0, 2 );
|
||||
|
||||
/**
|
||||
* acf_html_input
|
||||
*
|
||||
* Returns the HTML of an input.
|
||||
*
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
//function acf_html_input( $attrs = array() ) {
|
||||
// return sprintf( '<input %s/>', acf_esc_attrs($attrs) );
|
||||
//}
|
||||
// function acf_html_input( $attrs = array() ) {
|
||||
// return sprintf( '<input %s/>', acf_esc_attrs($attrs) );
|
||||
// }
|
||||
|
||||
/**
|
||||
* acf_hidden_input
|
||||
*
|
||||
* Renders the HTML of a hidden input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_hidden_input( $attrs = array() ) {
|
||||
echo acf_get_hidden_input( $attrs );
|
||||
|
|
@ -163,14 +137,14 @@ function acf_hidden_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a hidden input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_hidden_input( $attrs = array() ) {
|
||||
return sprintf( '<input type="hidden" %s/>', acf_esc_attrs($attrs) );
|
||||
return sprintf( '<input type="hidden" %s/>', acf_esc_attrs( $attrs ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -178,11 +152,11 @@ function acf_get_hidden_input( $attrs = array() ) {
|
|||
*
|
||||
* Renders the HTML of a text input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_text_input( $attrs = array() ) {
|
||||
echo acf_get_text_input( $attrs );
|
||||
|
|
@ -193,16 +167,19 @@ function acf_text_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a text input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_text_input( $attrs = array() ) {
|
||||
$attrs = wp_parse_args($attrs, array(
|
||||
'type' => 'text'
|
||||
));
|
||||
$attrs = wp_parse_args(
|
||||
$attrs,
|
||||
array(
|
||||
'type' => 'text',
|
||||
)
|
||||
);
|
||||
if ( isset( $attrs['value'] ) && is_string( $attrs['value'] ) ) {
|
||||
$attrs['value'] = htmlspecialchars( $attrs['value'] );
|
||||
}
|
||||
|
|
@ -214,11 +191,11 @@ function acf_get_text_input( $attrs = array() ) {
|
|||
*
|
||||
* Renders the HTML of a file input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_file_input( $attrs = array() ) {
|
||||
echo acf_get_file_input( $attrs );
|
||||
|
|
@ -229,14 +206,14 @@ function acf_file_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a file input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_file_input( $attrs = array() ) {
|
||||
return sprintf( '<input type="file" %s/>', acf_esc_attrs($attrs) );
|
||||
return sprintf( '<input type="file" %s/>', acf_esc_attrs( $attrs ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -244,11 +221,11 @@ function acf_get_file_input( $attrs = array() ) {
|
|||
*
|
||||
* Renders the HTML of a textarea input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_textarea_input( $attrs = array() ) {
|
||||
echo acf_get_textarea_input( $attrs );
|
||||
|
|
@ -259,19 +236,19 @@ function acf_textarea_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a textarea input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_textarea_input( $attrs = array() ) {
|
||||
$value = '';
|
||||
if( isset($attrs['value']) ) {
|
||||
if ( isset( $attrs['value'] ) ) {
|
||||
$value = $attrs['value'];
|
||||
unset( $attrs['value'] );
|
||||
}
|
||||
return sprintf( '<textarea %s>%s</textarea>', acf_esc_attrs($attrs), esc_textarea($value) );
|
||||
return sprintf( '<textarea %s>%s</textarea>', acf_esc_attrs( $attrs ), esc_textarea( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -279,11 +256,11 @@ function acf_get_textarea_input( $attrs = array() ) {
|
|||
*
|
||||
* Renders the HTML of a checkbox input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_checkbox_input( $attrs = array() ) {
|
||||
echo acf_get_checkbox_input( $attrs );
|
||||
|
|
@ -294,29 +271,32 @@ function acf_checkbox_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a checkbox input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_checkbox_input( $attrs = array() ) {
|
||||
|
||||
|
||||
// Allow radio or checkbox type.
|
||||
$attrs = wp_parse_args($attrs, array(
|
||||
'type' => 'checkbox'
|
||||
));
|
||||
|
||||
$attrs = wp_parse_args(
|
||||
$attrs,
|
||||
array(
|
||||
'type' => 'checkbox',
|
||||
)
|
||||
);
|
||||
|
||||
// Get label.
|
||||
$label = '';
|
||||
if( isset($attrs['label']) ) {
|
||||
$label= $attrs['label'];
|
||||
if ( isset( $attrs['label'] ) ) {
|
||||
$label = $attrs['label'];
|
||||
unset( $attrs['label'] );
|
||||
}
|
||||
|
||||
|
||||
// Render.
|
||||
$checked = isset($attrs['checked']);
|
||||
return '<label' . ($checked ? ' class="selected"' : '') . '><input ' . acf_esc_attr($attrs) . '/> ' . acf_esc_html($label) . '</label>';
|
||||
$checked = isset( $attrs['checked'] );
|
||||
return '<label' . ( $checked ? ' class="selected"' : '' ) . '><input ' . acf_esc_attr( $attrs ) . '/> ' . acf_esc_html( $label ) . '</label>';
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -324,11 +304,11 @@ function acf_get_checkbox_input( $attrs = array() ) {
|
|||
*
|
||||
* Renders the HTML of a radio input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_radio_input( $attrs = array() ) {
|
||||
echo acf_get_radio_input( $attrs );
|
||||
|
|
@ -339,11 +319,11 @@ function acf_radio_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a radio input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_radio_input( $attrs = array() ) {
|
||||
$attrs['type'] = 'radio';
|
||||
|
|
@ -355,11 +335,11 @@ function acf_get_radio_input( $attrs = array() ) {
|
|||
*
|
||||
* Renders the HTML of a select input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_select_input( $attrs = array() ) {
|
||||
echo acf_get_select_input( $attrs );
|
||||
|
|
@ -370,19 +350,19 @@ function acf_select_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a select input.
|
||||
*
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
* @date 3/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_select_input( $attrs = array() ) {
|
||||
$value = (array) acf_extract_var( $attrs, 'value' );
|
||||
$value = (array) acf_extract_var( $attrs, 'value' );
|
||||
$choices = (array) acf_extract_var( $attrs, 'choices' );
|
||||
return sprintf(
|
||||
'<select %s>%s</select>',
|
||||
acf_esc_attrs($attrs),
|
||||
acf_walk_select_input($choices, $value)
|
||||
acf_esc_attrs( $attrs ),
|
||||
acf_walk_select_input( $choices, $value )
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -391,47 +371,47 @@ function acf_get_select_input( $attrs = array() ) {
|
|||
*
|
||||
* Returns the HTML of a select input's choices.
|
||||
*
|
||||
* @date 27/6/17
|
||||
* @since 5.6.0
|
||||
* @date 27/6/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param array $choices The choices to walk through.
|
||||
* @param array $values The selected choices.
|
||||
* @param array $depth The current walk depth.
|
||||
* @return string
|
||||
* @param array $choices The choices to walk through.
|
||||
* @param array $values The selected choices.
|
||||
* @param array $depth The current walk depth.
|
||||
* @return string
|
||||
*/
|
||||
function acf_walk_select_input( $choices = array(), $values = array(), $depth = 0 ) {
|
||||
$html = '';
|
||||
|
||||
|
||||
// Sanitize values for 'selected' matching (only once).
|
||||
if( $depth == 0 ) {
|
||||
$values = array_map('esc_attr', $values);
|
||||
if ( $depth == 0 ) {
|
||||
$values = array_map( 'esc_attr', $values );
|
||||
}
|
||||
|
||||
|
||||
// Loop over choices and append to html.
|
||||
if( $choices ) {
|
||||
foreach( $choices as $value => $label ) {
|
||||
|
||||
if ( $choices ) {
|
||||
foreach ( $choices as $value => $label ) {
|
||||
|
||||
// Multiple (optgroup)
|
||||
if( is_array($label) ){
|
||||
if ( is_array( $label ) ) {
|
||||
$html .= sprintf(
|
||||
'<optgroup label="%s">%s</optgroup>',
|
||||
esc_attr($value),
|
||||
acf_walk_select_input( $label, $values, $depth+1 )
|
||||
esc_attr( $value ),
|
||||
acf_walk_select_input( $label, $values, $depth + 1 )
|
||||
);
|
||||
|
||||
// single (option)
|
||||
|
||||
// single (option)
|
||||
} else {
|
||||
$attrs = array(
|
||||
'value' => $value
|
||||
'value' => $value,
|
||||
);
|
||||
|
||||
|
||||
// If is selected.
|
||||
$pos = array_search( esc_attr($value), $values );
|
||||
if( $pos !== false ) {
|
||||
$pos = array_search( esc_attr( $value ), $values );
|
||||
if ( $pos !== false ) {
|
||||
$attrs['selected'] = 'selected';
|
||||
$attrs['data-i'] = $pos;
|
||||
$attrs['data-i'] = $pos;
|
||||
}
|
||||
$html .= sprintf( '<option %s>%s</option>', acf_esc_attr($attrs), esc_html($label) );
|
||||
$html .= sprintf( '<option %s>%s</option>', acf_esc_attr( $attrs ), esc_html( $label ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -443,11 +423,11 @@ function acf_walk_select_input( $choices = array(), $values = array(), $depth =
|
|||
*
|
||||
* See acf_filter_attrs().
|
||||
*
|
||||
* @date 3/10/17
|
||||
* @since 5.6.3
|
||||
* @date 3/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_clean_atts( $attrs ) {
|
||||
return acf_filter_attrs( $attrs );
|
||||
|
|
@ -458,11 +438,11 @@ function acf_clean_atts( $attrs ) {
|
|||
*
|
||||
* See acf_esc_attrs().
|
||||
*
|
||||
* @date 27/6/17
|
||||
* @since 5.6.0
|
||||
* @date 27/6/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_atts( $attrs ) {
|
||||
return acf_esc_attrs( $attrs );
|
||||
|
|
@ -473,12 +453,12 @@ function acf_esc_atts( $attrs ) {
|
|||
*
|
||||
* See acf_esc_attrs().
|
||||
*
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @deprecated 5.6.0
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @deprecated 5.6.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_attr( $attrs ) {
|
||||
return acf_esc_attrs( $attrs );
|
||||
|
|
@ -489,12 +469,12 @@ function acf_esc_attr( $attrs ) {
|
|||
*
|
||||
* See acf_esc_attrs().
|
||||
*
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @deprecated 5.6.0
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @deprecated 5.6.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_attr_e( $attrs ) {
|
||||
echo acf_esc_attrs( $attrs );
|
||||
|
|
@ -505,12 +485,12 @@ function acf_esc_attr_e( $attrs ) {
|
|||
*
|
||||
* See acf_esc_attrs().
|
||||
*
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @deprecated 5.6.0
|
||||
* @date 13/6/19
|
||||
* @since 5.8.1
|
||||
* @deprecated 5.6.0
|
||||
*
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
* @param array $attrs The array of attrs.
|
||||
* @return string
|
||||
*/
|
||||
function acf_esc_atts_e( $attrs ) {
|
||||
echo acf_esc_attrs( $attrs );
|
||||
|
|
|
|||
|
|
@ -1,62 +1,62 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* acf_get_meta
|
||||
*
|
||||
* Returns an array of "ACF only" meta for the given post_id.
|
||||
*
|
||||
* @date 9/10/18
|
||||
* @since 5.8.0
|
||||
* @date 9/10/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param mixed $post_id The post_id for this data.
|
||||
* @return array
|
||||
* @param mixed $post_id The post_id for this data.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_meta( $post_id = 0 ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit load_value logic.
|
||||
$null = apply_filters( "acf/pre_load_meta", null, $post_id );
|
||||
if( $null !== null ) {
|
||||
$null = apply_filters( 'acf/pre_load_meta', null, $post_id );
|
||||
if ( $null !== null ) {
|
||||
return ( $null === '__return_null' ) ? null : $null;
|
||||
}
|
||||
|
||||
|
||||
// Decode $post_id for $type and $id.
|
||||
extract( acf_decode_post_id($post_id) );
|
||||
|
||||
extract( acf_decode_post_id( $post_id ) );
|
||||
|
||||
// Determine CRUD function.
|
||||
// - Relies on decoded post_id result to identify option or meta types.
|
||||
// - Uses xxx_metadata(type) instead of xxx_type_meta() to bypass additional logic that could alter the ID.
|
||||
if( $type === 'option' ) {
|
||||
if ( $type === 'option' ) {
|
||||
$allmeta = acf_get_option_meta( $id );
|
||||
} else {
|
||||
$allmeta = get_metadata( $type, $id, '' );
|
||||
}
|
||||
|
||||
|
||||
// Loop over meta and check that a reference exists for each value.
|
||||
$meta = array();
|
||||
if( $allmeta ) {
|
||||
foreach( $allmeta as $key => $value ) {
|
||||
|
||||
if ( $allmeta ) {
|
||||
foreach ( $allmeta as $key => $value ) {
|
||||
|
||||
// If a reference exists for this value, add it to the meta array.
|
||||
if( isset($allmeta["_$key"]) ) {
|
||||
$meta[ $key ] = $allmeta[ $key ][0];
|
||||
if ( isset( $allmeta[ "_$key" ] ) ) {
|
||||
$meta[ $key ] = $allmeta[ $key ][0];
|
||||
$meta[ "_$key" ] = $allmeta[ "_$key" ][0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Unserialized results (get_metadata does not unserialize if $key is empty).
|
||||
$meta = array_map('maybe_unserialize', $meta);
|
||||
|
||||
$meta = array_map( 'maybe_unserialize', $meta );
|
||||
|
||||
/**
|
||||
* Filters the $meta array after it has been loaded.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param array $meta The arary of loaded meta.
|
||||
* @param string $post_id The $post_id for this meta.
|
||||
* @param array $meta The arary of loaded meta.
|
||||
* @param string $post_id The $post_id for this meta.
|
||||
*/
|
||||
return apply_filters( "acf/load_meta", $meta, $post_id );
|
||||
return apply_filters( 'acf/load_meta', $meta, $post_id );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -65,42 +65,45 @@ function acf_get_meta( $post_id = 0 ) {
|
|||
*
|
||||
* Returns an array of meta for the given wp_option name prefix in the same format as get_post_meta().
|
||||
*
|
||||
* @date 9/10/18
|
||||
* @since 5.8.0
|
||||
* @date 9/10/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param string $prefix The wp_option name prefix.
|
||||
* @return array
|
||||
* @param string $prefix The wp_option name prefix.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_option_meta( $prefix = '' ) {
|
||||
|
||||
|
||||
// Globals.
|
||||
global $wpdb;
|
||||
|
||||
|
||||
// Vars.
|
||||
$meta = array();
|
||||
$search = "{$prefix}_%";
|
||||
$meta = array();
|
||||
$search = "{$prefix}_%";
|
||||
$_search = "_{$prefix}_%";
|
||||
|
||||
|
||||
// Escape underscores for LIKE.
|
||||
$search = str_replace('_', '\_', $search);
|
||||
$_search = str_replace('_', '\_', $_search);
|
||||
|
||||
$search = str_replace( '_', '\_', $search );
|
||||
$_search = str_replace( '_', '\_', $_search );
|
||||
|
||||
// Query database for results.
|
||||
$rows = $wpdb->get_results($wpdb->prepare(
|
||||
"SELECT *
|
||||
$rows = $wpdb->get_results(
|
||||
$wpdb->prepare(
|
||||
"SELECT *
|
||||
FROM $wpdb->options
|
||||
WHERE option_name LIKE %s
|
||||
OR option_name LIKE %s",
|
||||
$search,
|
||||
$_search
|
||||
), ARRAY_A);
|
||||
|
||||
$search,
|
||||
$_search
|
||||
),
|
||||
ARRAY_A
|
||||
);
|
||||
|
||||
// Loop over results and append meta (removing the $prefix from the option name).
|
||||
$len = strlen("{$prefix}_");
|
||||
foreach( $rows as $row ) {
|
||||
$meta[ substr($row['option_name'], $len) ][] = $row['option_value'];
|
||||
$len = strlen( "{$prefix}_" );
|
||||
foreach ( $rows as $row ) {
|
||||
$meta[ substr( $row['option_name'], $len ) ][] = $row['option_value'];
|
||||
}
|
||||
|
||||
|
||||
// Return results.
|
||||
return $meta;
|
||||
}
|
||||
|
|
@ -110,41 +113,41 @@ function acf_get_option_meta( $prefix = '' ) {
|
|||
*
|
||||
* Retrieves specific metadata from the database.
|
||||
*
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $name The meta name.
|
||||
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||||
* @return mixed
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $name The meta name.
|
||||
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_get_metadata( $post_id = 0, $name = '', $hidden = false ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit logic.
|
||||
$null = apply_filters( "acf/pre_load_metadata", null, $post_id, $name, $hidden );
|
||||
if( $null !== null ) {
|
||||
$null = apply_filters( 'acf/pre_load_metadata', null, $post_id, $name, $hidden );
|
||||
if ( $null !== null ) {
|
||||
return ( $null === '__return_null' ) ? null : $null;
|
||||
}
|
||||
|
||||
|
||||
// Decode $post_id for $type and $id.
|
||||
extract( acf_decode_post_id($post_id) );
|
||||
|
||||
extract( acf_decode_post_id( $post_id ) );
|
||||
|
||||
// Hidden meta uses an underscore prefix.
|
||||
$prefix = $hidden ? '_' : '';
|
||||
|
||||
|
||||
// Bail early if no $id (possible during new acf_form).
|
||||
if( !$id ) {
|
||||
if ( ! $id ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// Determine CRUD function.
|
||||
// - Relies on decoded post_id result to identify option or meta types.
|
||||
// - Uses xxx_metadata(type) instead of xxx_type_meta() to bypass additional logic that could alter the ID.
|
||||
if( $type === 'option' ) {
|
||||
if ( $type === 'option' ) {
|
||||
return get_option( "{$prefix}{$id}_{$name}", null );
|
||||
} else {
|
||||
$meta = get_metadata( $type, $id, "{$prefix}{$name}", false );
|
||||
return isset($meta[0]) ? $meta[0] : null;
|
||||
return isset( $meta[0] ) ? $meta[0] : null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -153,40 +156,40 @@ function acf_get_metadata( $post_id = 0, $name = '', $hidden = false ) {
|
|||
*
|
||||
* Updates metadata in the database.
|
||||
*
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $name The meta name.
|
||||
* @param mixed $value The meta value.
|
||||
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||||
* @return (int|bool) Meta ID if the key didn't exist, true on successful update, false on failure.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $name The meta name.
|
||||
* @param mixed $value The meta value.
|
||||
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||||
* @return (int|bool) Meta ID if the key didn't exist, true on successful update, false on failure.
|
||||
*/
|
||||
function acf_update_metadata( $post_id = 0, $name = '', $value = '', $hidden = false ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit logic.
|
||||
$pre = apply_filters( "acf/pre_update_metadata", null, $post_id, $name, $value, $hidden );
|
||||
if( $pre !== null ) {
|
||||
$pre = apply_filters( 'acf/pre_update_metadata', null, $post_id, $name, $value, $hidden );
|
||||
if ( $pre !== null ) {
|
||||
return $pre;
|
||||
}
|
||||
|
||||
|
||||
// Decode $post_id for $type and $id.
|
||||
extract( acf_decode_post_id($post_id) );
|
||||
|
||||
extract( acf_decode_post_id( $post_id ) );
|
||||
|
||||
// Hidden meta uses an underscore prefix.
|
||||
$prefix = $hidden ? '_' : '';
|
||||
|
||||
|
||||
// Bail early if no $id (possible during new acf_form).
|
||||
if( !$id ) {
|
||||
if ( ! $id ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Determine CRUD function.
|
||||
// - Relies on decoded post_id result to identify option or meta types.
|
||||
// - Uses xxx_metadata(type) instead of xxx_type_meta() to bypass additional logic that could alter the ID.
|
||||
if( $type === 'option' ) {
|
||||
$value = wp_unslash( $value );
|
||||
$autoload = (bool) acf_get_setting('autoload');
|
||||
if ( $type === 'option' ) {
|
||||
$value = wp_unslash( $value );
|
||||
$autoload = (bool) acf_get_setting( 'autoload' );
|
||||
return update_option( "{$prefix}{$id}_{$name}", $value, $autoload );
|
||||
} else {
|
||||
return update_metadata( $type, $id, "{$prefix}{$name}", $value );
|
||||
|
|
@ -198,37 +201,37 @@ function acf_update_metadata( $post_id = 0, $name = '', $value = '', $hidden = f
|
|||
*
|
||||
* Deletes metadata from the database.
|
||||
*
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $name The meta name.
|
||||
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||||
* @return bool
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $name The meta name.
|
||||
* @param bool $hidden If the meta is hidden (starts with an underscore).
|
||||
* @return bool
|
||||
*/
|
||||
function acf_delete_metadata( $post_id = 0, $name = '', $hidden = false ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit logic.
|
||||
$pre = apply_filters( "acf/pre_delete_metadata", null, $post_id, $name, $hidden );
|
||||
if( $pre !== null ) {
|
||||
$pre = apply_filters( 'acf/pre_delete_metadata', null, $post_id, $name, $hidden );
|
||||
if ( $pre !== null ) {
|
||||
return $pre;
|
||||
}
|
||||
|
||||
|
||||
// Decode $post_id for $type and $id.
|
||||
extract( acf_decode_post_id($post_id) );
|
||||
|
||||
extract( acf_decode_post_id( $post_id ) );
|
||||
|
||||
// Hidden meta uses an underscore prefix.
|
||||
$prefix = $hidden ? '_' : '';
|
||||
|
||||
|
||||
// Bail early if no $id (possible during new acf_form).
|
||||
if( !$id ) {
|
||||
if ( ! $id ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Determine CRUD function.
|
||||
// - Relies on decoded post_id result to identify option or meta types.
|
||||
// - Uses xxx_metadata(type) instead of xxx_type_meta() to bypass additional logic that could alter the ID.
|
||||
if( $type === 'option' ) {
|
||||
if ( $type === 'option' ) {
|
||||
return delete_option( "{$prefix}{$id}_{$name}" );
|
||||
} else {
|
||||
return delete_metadata( $type, $id, "{$prefix}{$name}" );
|
||||
|
|
@ -240,27 +243,27 @@ function acf_delete_metadata( $post_id = 0, $name = '', $hidden = false ) {
|
|||
*
|
||||
* Copies meta from one post to another. Useful for saving and restoring revisions.
|
||||
*
|
||||
* @date 25/06/2016
|
||||
* @since 5.3.8
|
||||
* @date 25/06/2016
|
||||
* @since 5.3.8
|
||||
*
|
||||
* @param (int|string) $from_post_id The post id to copy from.
|
||||
* @param (int|string) $to_post_id The post id to paste to.
|
||||
* @return void
|
||||
* @param (int|string) $from_post_id The post id to copy from.
|
||||
* @param (int|string) $to_post_id The post id to paste to.
|
||||
* @return void
|
||||
*/
|
||||
function acf_copy_metadata( $from_post_id = 0, $to_post_id = 0 ) {
|
||||
|
||||
|
||||
// Get all postmeta.
|
||||
$meta = acf_get_meta( $from_post_id );
|
||||
|
||||
|
||||
// Check meta.
|
||||
if( $meta ) {
|
||||
|
||||
if ( $meta ) {
|
||||
|
||||
// Slash data. WP expects all data to be slashed and will unslash it (fixes '\' character issues).
|
||||
$meta = wp_slash( $meta );
|
||||
|
||||
|
||||
// Loop over meta.
|
||||
foreach( $meta as $name => $value ) {
|
||||
acf_update_metadata( $to_post_id, $name, $value );
|
||||
foreach ( $meta as $name => $value ) {
|
||||
acf_update_metadata( $to_post_id, $name, $value );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -270,13 +273,13 @@ function acf_copy_metadata( $from_post_id = 0, $to_post_id = 0 ) {
|
|||
*
|
||||
* Copies meta from one post to another. Useful for saving and restoring revisions.
|
||||
*
|
||||
* @date 25/06/2016
|
||||
* @since 5.3.8
|
||||
* @date 25/06/2016
|
||||
* @since 5.3.8
|
||||
* @deprecated 5.7.11
|
||||
*
|
||||
* @param int $from_post_id The post id to copy from.
|
||||
* @param int $to_post_id The post id to paste to.
|
||||
* @return void
|
||||
* @param int $from_post_id The post id to copy from.
|
||||
* @param int $to_post_id The post id to paste to.
|
||||
* @return void
|
||||
*/
|
||||
function acf_copy_postmeta( $from_post_id = 0, $to_post_id = 0 ) {
|
||||
return acf_copy_metadata( $from_post_id, $to_post_id );
|
||||
|
|
@ -288,26 +291,26 @@ function acf_copy_postmeta( $from_post_id = 0, $to_post_id = 0 ) {
|
|||
* Returns a field using the provided $id and $post_id parameters.
|
||||
* Looks for a reference to help loading the correct field via name.
|
||||
*
|
||||
* @date 21/1/19
|
||||
* @since 5.7.10
|
||||
* @date 21/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $key The meta name (field name).
|
||||
* @param (int|string) $post_id The post_id where this field's value is saved.
|
||||
* @return (array|false) The field array.
|
||||
* @param string $key The meta name (field name).
|
||||
* @param (int|string) $post_id The post_id where this field's value is saved.
|
||||
* @return (array|false) The field array.
|
||||
*/
|
||||
function acf_get_meta_field( $key = 0, $post_id = 0 ) {
|
||||
|
||||
|
||||
// Try reference.
|
||||
$field_key = acf_get_reference( $key, $post_id );
|
||||
|
||||
if( $field_key ) {
|
||||
|
||||
if ( $field_key ) {
|
||||
$field = acf_get_field( $field_key );
|
||||
if( $field ) {
|
||||
if ( $field ) {
|
||||
$field['name'] = $key;
|
||||
return $field;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return false.
|
||||
return false;
|
||||
}
|
||||
|
|
@ -317,29 +320,29 @@ function acf_get_meta_field( $key = 0, $post_id = 0 ) {
|
|||
*
|
||||
* Retrieves reference metadata from the database.
|
||||
*
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string type The reference type (fields|groups).
|
||||
* @param string $name An optional specific name
|
||||
* @return mixed
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string type The reference type (fields|groups).
|
||||
* @param string $name An optional specific name
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_get_metaref( $post_id = 0, $type = 'fields', $name = '' ) {
|
||||
|
||||
|
||||
// Load existing meta.
|
||||
$meta = acf_get_metadata( $post_id, "_acf_$type" );
|
||||
|
||||
|
||||
// Handle no meta.
|
||||
if( !$meta ) {
|
||||
if ( ! $meta ) {
|
||||
return $name ? '' : array();
|
||||
}
|
||||
|
||||
|
||||
// Return specific reference.
|
||||
if( $name ) {
|
||||
return isset($meta[ $name ]) ? $meta[ $name ] : '';
|
||||
|
||||
// Or return all references.
|
||||
if ( $name ) {
|
||||
return isset( $meta[ $name ] ) ? $meta[ $name ] : '';
|
||||
|
||||
// Or return all references.
|
||||
} else {
|
||||
return $meta;
|
||||
}
|
||||
|
|
@ -350,30 +353,30 @@ function acf_get_metaref( $post_id = 0, $type = 'fields', $name = '' ) {
|
|||
*
|
||||
* Updates reference metadata in the database.
|
||||
*
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
* @date 16/10/2015
|
||||
* @since 5.2.3
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string type The reference type (fields|groups).
|
||||
* @param array $references An array of references.
|
||||
* @return (int|bool) Meta ID if the key didn't exist, true on successful update, false on failure.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string type The reference type (fields|groups).
|
||||
* @param array $references An array of references.
|
||||
* @return (int|bool) Meta ID if the key didn't exist, true on successful update, false on failure.
|
||||
*/
|
||||
function acf_update_metaref( $post_id = 0, $type = 'fields', $references = array() ) {
|
||||
|
||||
|
||||
// Get current references.
|
||||
$current = acf_get_metaref( $post_id, $type );
|
||||
|
||||
|
||||
// Merge in new references.
|
||||
$references = array_merge( $current, $references );
|
||||
|
||||
|
||||
// Simplify groups
|
||||
if( $type === 'groups' ) {
|
||||
$references = array_values($references);
|
||||
if ( $type === 'groups' ) {
|
||||
$references = array_values( $references );
|
||||
}
|
||||
|
||||
|
||||
// Remove duplicate references.
|
||||
$references = array_unique($references);
|
||||
|
||||
$references = array_unique( $references );
|
||||
|
||||
// Update metadata.
|
||||
return acf_update_metadata( $post_id, "_acf_$type", $references );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,40 +1,40 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Returns available templates for each post type.
|
||||
*
|
||||
* @date 29/8/17
|
||||
* @since 5.6.2
|
||||
* @date 29/8/17
|
||||
* @since 5.6.2
|
||||
*
|
||||
* @param void
|
||||
* @return array
|
||||
* @param void
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_post_templates() {
|
||||
|
||||
|
||||
// Check store.
|
||||
$cache = acf_get_data( 'post_templates' );
|
||||
if( $cache !== null ) {
|
||||
if ( $cache !== null ) {
|
||||
return $cache;
|
||||
}
|
||||
|
||||
|
||||
// Initialize templates with default placeholder for pages.
|
||||
$post_templates = array();
|
||||
$post_templates = array();
|
||||
$post_templates['page'] = array();
|
||||
|
||||
|
||||
// Loop over post types and append their templates.
|
||||
if( method_exists('WP_Theme', 'get_page_templates') ) {
|
||||
if ( method_exists( 'WP_Theme', 'get_page_templates' ) ) {
|
||||
$post_types = get_post_types();
|
||||
foreach( $post_types as $post_type ) {
|
||||
foreach ( $post_types as $post_type ) {
|
||||
$templates = wp_get_theme()->get_page_templates( null, $post_type );
|
||||
if( $templates ) {
|
||||
if ( $templates ) {
|
||||
$post_templates[ $post_type ] = $templates;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Update store.
|
||||
acf_set_data( 'post_templates', $post_templates );
|
||||
|
||||
// Return templates.
|
||||
return $post_templates;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,34 +1,34 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* acf_get_users
|
||||
*
|
||||
* Similar to the get_users() function but with extra functionality.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param array $args The query args.
|
||||
* @return array
|
||||
* @param array $args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_users( $args = array() ) {
|
||||
|
||||
|
||||
// Get users.
|
||||
$users = get_users( $args );
|
||||
|
||||
|
||||
// Maintain order.
|
||||
if( $users && $args['include'] ) {
|
||||
|
||||
if ( $users && $args['include'] ) {
|
||||
|
||||
// Generate order array.
|
||||
$order = array();
|
||||
foreach( $users as $i => $user ) {
|
||||
$order[ $i ] = array_search($user->ID, $args['include']);
|
||||
foreach ( $users as $i => $user ) {
|
||||
$order[ $i ] = array_search( $user->ID, $args['include'] );
|
||||
}
|
||||
|
||||
|
||||
// Sort results.
|
||||
array_multisort($order, $users);
|
||||
array_multisort( $order, $users );
|
||||
}
|
||||
|
||||
|
||||
// Return
|
||||
return $users;
|
||||
}
|
||||
|
|
@ -38,25 +38,25 @@ function acf_get_users( $args = array() ) {
|
|||
*
|
||||
* Returns a result containing "id" and "text" for the given user.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param WP_User $user The user object.
|
||||
* @return array
|
||||
* @param WP_User $user The user object.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_user_result( $user ) {
|
||||
|
||||
|
||||
// Vars.
|
||||
$id = $user->ID;
|
||||
$id = $user->ID;
|
||||
$text = $user->user_login;
|
||||
|
||||
|
||||
// Add name.
|
||||
if( $user->first_name && $user->last_name ) {
|
||||
if ( $user->first_name && $user->last_name ) {
|
||||
$text .= " ({$user->first_name} {$user->last_name})";
|
||||
} elseif( $user->first_name ) {
|
||||
} elseif ( $user->first_name ) {
|
||||
$text .= " ({$user->first_name})";
|
||||
}
|
||||
return compact('id', 'text');
|
||||
return compact( 'id', 'text' );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -65,28 +65,28 @@ function acf_get_user_result( $user ) {
|
|||
*
|
||||
* Returns an array of user roles in the format "name => label".
|
||||
*
|
||||
* @date 20/5/19
|
||||
* @since 5.8.1
|
||||
* @date 20/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $roles A specific array of roles.
|
||||
* @return array
|
||||
* @param array $roles A specific array of roles.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_user_role_labels( $roles = array() ) {
|
||||
$all_roles = wp_roles()->get_names();
|
||||
|
||||
|
||||
// Load all roles if none provided.
|
||||
if( empty($roles) ) {
|
||||
if ( empty( $roles ) ) {
|
||||
$roles = array_keys( $all_roles );
|
||||
}
|
||||
|
||||
|
||||
// Loop over roles and populare labels.
|
||||
$lables = array();
|
||||
foreach( $roles as $role ) {
|
||||
if( isset($all_roles[ $role ]) ) {
|
||||
foreach ( $roles as $role ) {
|
||||
if ( isset( $all_roles[ $role ] ) ) {
|
||||
$lables[ $role ] = translate_user_role( $all_roles[ $role ] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Return labels.
|
||||
return $lables;
|
||||
}
|
||||
|
|
@ -96,24 +96,24 @@ function acf_get_user_role_labels( $roles = array() ) {
|
|||
*
|
||||
* Returns true if the current user is allowed to save unfiltered HTML.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return bool
|
||||
* @param void
|
||||
* @return bool
|
||||
*/
|
||||
function acf_allow_unfiltered_html() {
|
||||
|
||||
|
||||
// Check capability.
|
||||
$allow_unfiltered_html = current_user_can('unfiltered_html');
|
||||
|
||||
$allow_unfiltered_html = current_user_can( 'unfiltered_html' );
|
||||
|
||||
/**
|
||||
* Filters whether the current user is allowed to save unfiltered HTML.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param bool allow_unfiltered_html The result.
|
||||
* @param bool allow_unfiltered_html The result.
|
||||
*/
|
||||
return apply_filters( 'acf/allow_unfiltered_html', $allow_unfiltered_html );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// Globals.
|
||||
global $acf_stores, $acf_instances;
|
||||
|
||||
// Initialize plaeholders.
|
||||
$acf_stores = array();
|
||||
$acf_stores = array();
|
||||
$acf_instances = array();
|
||||
|
||||
/**
|
||||
|
|
@ -12,11 +12,11 @@ $acf_instances = array();
|
|||
*
|
||||
* Creates a new instance of the given class and stores it in the instances data store.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $class The class name.
|
||||
* @return object The instance.
|
||||
* @param string $class The class name.
|
||||
* @return object The instance.
|
||||
*/
|
||||
function acf_new_instance( $class = '' ) {
|
||||
global $acf_instances;
|
||||
|
|
@ -28,15 +28,15 @@ function acf_new_instance( $class = '' ) {
|
|||
*
|
||||
* Returns an instance for the given class.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $class The class name.
|
||||
* @return object The instance.
|
||||
* @param string $class The class name.
|
||||
* @return object The instance.
|
||||
*/
|
||||
function acf_get_instance( $class = '' ) {
|
||||
global $acf_instances;
|
||||
if( !isset($acf_instances[ $class ]) ) {
|
||||
if ( ! isset( $acf_instances[ $class ] ) ) {
|
||||
$acf_instances[ $class ] = new $class();
|
||||
}
|
||||
return $acf_instances[ $class ];
|
||||
|
|
@ -47,36 +47,36 @@ function acf_get_instance( $class = '' ) {
|
|||
*
|
||||
* Registers a data store.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The store name.
|
||||
* @param array $data Array of data to start the store with.
|
||||
* @return ACF_Data
|
||||
* @param string $name The store name.
|
||||
* @param array $data Array of data to start the store with.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function acf_register_store( $name = '', $data = false ) {
|
||||
|
||||
|
||||
// Create store.
|
||||
$store = new ACF_Data( $data );
|
||||
|
||||
|
||||
// Register store.
|
||||
global $acf_stores;
|
||||
$acf_stores[ $name ] = $store;
|
||||
|
||||
|
||||
// Return store.
|
||||
return $store;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_store
|
||||
*
|
||||
* Returns a data store.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The store name.
|
||||
* @return ACF_Data
|
||||
* @param string $name The store name.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function acf_get_store( $name = '' ) {
|
||||
global $acf_stores;
|
||||
|
|
@ -88,18 +88,18 @@ function acf_get_store( $name = '' ) {
|
|||
*
|
||||
* Triggered when switching between sites on a multisite installation.
|
||||
*
|
||||
* @date 13/2/19
|
||||
* @since 5.7.11
|
||||
* @date 13/2/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param int $site_id New blog ID.
|
||||
* @param int prev_blog_id Prev blog ID.
|
||||
* @return void
|
||||
* @param int $site_id New blog ID.
|
||||
* @param int prev_blog_id Prev blog ID.
|
||||
* @return void
|
||||
*/
|
||||
function acf_switch_stores( $site_id, $prev_site_id ) {
|
||||
|
||||
|
||||
// Loop over stores and call switch_site().
|
||||
global $acf_stores;
|
||||
foreach( $acf_stores as $store ) {
|
||||
foreach ( $acf_stores as $store ) {
|
||||
$store->switch_site( $site_id, $prev_site_id );
|
||||
}
|
||||
}
|
||||
|
|
@ -110,14 +110,14 @@ add_action( 'switch_blog', 'acf_switch_stores', 10, 2 );
|
|||
*
|
||||
* Returns the plugin path to a specified file.
|
||||
*
|
||||
* @date 28/9/13
|
||||
* @since 5.0.0
|
||||
* @date 28/9/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $filename The specified file.
|
||||
* @return string
|
||||
* @param string $filename The specified file.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_path( $filename = '' ) {
|
||||
return ACF_PATH . ltrim($filename, '/');
|
||||
return ACF_PATH . ltrim( $filename, '/' );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -126,17 +126,17 @@ function acf_get_path( $filename = '' ) {
|
|||
* Returns the plugin url to a specified file.
|
||||
* This function also defines the ACF_URL constant.
|
||||
*
|
||||
* @date 12/12/17
|
||||
* @since 5.6.8
|
||||
* @date 12/12/17
|
||||
* @since 5.6.8
|
||||
*
|
||||
* @param string $filename The specified file.
|
||||
* @return string
|
||||
* @param string $filename The specified file.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_url( $filename = '' ) {
|
||||
if( !defined('ACF_URL') ) {
|
||||
define( 'ACF_URL', acf_get_setting('url') );
|
||||
if ( ! defined( 'ACF_URL' ) ) {
|
||||
define( 'ACF_URL', acf_get_setting( 'url' ) );
|
||||
}
|
||||
return ACF_URL . ltrim($filename, '/');
|
||||
return ACF_URL . ltrim( $filename, '/' );
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -144,15 +144,15 @@ function acf_get_url( $filename = '' ) {
|
|||
*
|
||||
* Includes a file within the ACF plugin.
|
||||
*
|
||||
* @date 10/3/14
|
||||
* @since 5.0.0
|
||||
* @date 10/3/14
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $filename The specified file.
|
||||
* @return void
|
||||
* @param string $filename The specified file.
|
||||
* @return void
|
||||
*/
|
||||
function acf_include( $filename = '' ) {
|
||||
$file_path = acf_get_path($filename);
|
||||
if( file_exists($file_path) ) {
|
||||
include_once($file_path);
|
||||
$file_path = acf_get_path( $filename );
|
||||
if ( file_exists( $file_path ) ) {
|
||||
include_once $file_path;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// Register store.
|
||||
acf_register_store( 'values' )->prop( 'multisite', true );
|
||||
|
|
@ -8,84 +8,84 @@ acf_register_store( 'values' )->prop( 'multisite', true );
|
|||
*
|
||||
* Retrieves the field key for a given field name and post_id.
|
||||
*
|
||||
* @date 26/1/18
|
||||
* @since 5.6.5
|
||||
* @date 26/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string $field_name The name of the field. eg 'sub_heading'.
|
||||
* @param mixed $post_id The post_id of which the value is saved against.
|
||||
* @return string The field key.
|
||||
* @param string $field_name The name of the field. eg 'sub_heading'.
|
||||
* @param mixed $post_id The post_id of which the value is saved against.
|
||||
* @return string The field key.
|
||||
*/
|
||||
function acf_get_reference( $field_name, $post_id ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit load_value logic.
|
||||
$reference = apply_filters( "acf/pre_load_reference", null, $field_name, $post_id );
|
||||
if( $reference !== null ) {
|
||||
return $reference;
|
||||
}
|
||||
|
||||
$reference = apply_filters( 'acf/pre_load_reference', null, $field_name, $post_id );
|
||||
if ( $reference !== null ) {
|
||||
return $reference;
|
||||
}
|
||||
|
||||
// Get hidden meta for this field name.
|
||||
$reference = acf_get_metadata( $post_id, $field_name, true );
|
||||
|
||||
|
||||
/**
|
||||
* Filters the reference value.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param string $reference The reference value.
|
||||
* @param string $field_name The field name.
|
||||
* @param (int|string) $post_id The post ID where meta is stored.
|
||||
* @param string $reference The reference value.
|
||||
* @param string $field_name The field name.
|
||||
* @param (int|string) $post_id The post ID where meta is stored.
|
||||
*/
|
||||
return apply_filters( "acf/load_reference", $reference, $field_name, $post_id );
|
||||
return apply_filters( 'acf/load_reference', $reference, $field_name, $post_id );
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the value for a given field and post_id.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param int|string $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return mixed
|
||||
* @param int|string $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return mixed
|
||||
*/
|
||||
function acf_get_value( $post_id, $field ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit load_value logic.
|
||||
$value = apply_filters( "acf/pre_load_value", null, $post_id, $field );
|
||||
if( $value !== null ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Get field name.
|
||||
$field_name = $field['name'];
|
||||
|
||||
// Check store.
|
||||
$value = apply_filters( 'acf/pre_load_value', null, $post_id, $field );
|
||||
if ( $value !== null ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Get field name.
|
||||
$field_name = $field['name'];
|
||||
|
||||
// Check store.
|
||||
$store = acf_get_store( 'values' );
|
||||
if( $store->has( "$post_id:$field_name" ) ) {
|
||||
if ( $store->has( "$post_id:$field_name" ) ) {
|
||||
return $store->get( "$post_id:$field_name" );
|
||||
}
|
||||
|
||||
|
||||
// Load value from database.
|
||||
$value = acf_get_metadata( $post_id, $field_name );
|
||||
|
||||
|
||||
// Use field's default_value if no meta was found.
|
||||
if( $value === null && isset($field['default_value']) ) {
|
||||
if ( $value === null && isset( $field['default_value'] ) ) {
|
||||
$value = $field['default_value'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Filters the $value after it has been loaded.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param mixed $value The value to preview.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
* @param mixed $value The value to preview.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
*/
|
||||
$value = apply_filters( "acf/load_value", $value, $post_id, $field );
|
||||
|
||||
$value = apply_filters( 'acf/load_value', $value, $post_id, $field );
|
||||
|
||||
// Update store.
|
||||
$store->set( "$post_id:$field_name", $value );
|
||||
|
||||
|
|
@ -94,50 +94,50 @@ function acf_get_value( $post_id, $field ) {
|
|||
}
|
||||
|
||||
// Register variation.
|
||||
acf_add_filter_variations( 'acf/load_value', array('type', 'name', 'key'), 2 );
|
||||
acf_add_filter_variations( 'acf/load_value', array( 'type', 'name', 'key' ), 2 );
|
||||
|
||||
/**
|
||||
* acf_format_value
|
||||
*
|
||||
* Returns a formatted version of the provided value.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param mixed $value The field value.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return mixed.
|
||||
* @param mixed $value The field value.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return mixed.
|
||||
*/
|
||||
function acf_format_value( $value, $post_id, $field ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit load_value logic.
|
||||
$check = apply_filters( "acf/pre_format_value", null, $value, $post_id, $field );
|
||||
if( $check !== null ) {
|
||||
return $check;
|
||||
}
|
||||
|
||||
// Get field name.
|
||||
$field_name = $field['name'];
|
||||
|
||||
// Check store.
|
||||
$check = apply_filters( 'acf/pre_format_value', null, $value, $post_id, $field );
|
||||
if ( $check !== null ) {
|
||||
return $check;
|
||||
}
|
||||
|
||||
// Get field name.
|
||||
$field_name = $field['name'];
|
||||
|
||||
// Check store.
|
||||
$store = acf_get_store( 'values' );
|
||||
if( $store->has( "$post_id:$field_name:formatted" ) ) {
|
||||
if ( $store->has( "$post_id:$field_name:formatted" ) ) {
|
||||
return $store->get( "$post_id:$field_name:formatted" );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Filters the $value for use in a template function.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param mixed $value The value to preview.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
* @param mixed $value The value to preview.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
*/
|
||||
$value = apply_filters( "acf/format_value", $value, $post_id, $field );
|
||||
|
||||
$value = apply_filters( 'acf/format_value', $value, $post_id, $field );
|
||||
|
||||
// Update store.
|
||||
$store->set( "$post_id:$field_name:formatted", $value );
|
||||
|
||||
|
|
@ -146,85 +146,85 @@ function acf_format_value( $value, $post_id, $field ) {
|
|||
}
|
||||
|
||||
// Register variation.
|
||||
acf_add_filter_variations( 'acf/format_value', array('type', 'name', 'key'), 2 );
|
||||
acf_add_filter_variations( 'acf/format_value', array( 'type', 'name', 'key' ), 2 );
|
||||
|
||||
/**
|
||||
* acf_update_value
|
||||
*
|
||||
* Updates the value for a given field and post_id.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param mixed $value The new value.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return bool.
|
||||
* @param mixed $value The new value.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return bool.
|
||||
*/
|
||||
function acf_update_value( $value, $post_id, $field ) {
|
||||
|
||||
|
||||
// Allow filter to short-circuit update_value logic.
|
||||
$check = apply_filters( "acf/pre_update_value", null, $value, $post_id, $field );
|
||||
if( $check !== null ) {
|
||||
$check = apply_filters( 'acf/pre_update_value', null, $value, $post_id, $field );
|
||||
if ( $check !== null ) {
|
||||
return $check;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* Filters the $value before it is updated.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param mixed $value The value to update.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
* @param mixed $original The original value before modification.
|
||||
* @param mixed $value The value to update.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
* @param mixed $original The original value before modification.
|
||||
*/
|
||||
$value = apply_filters( "acf/update_value", $value, $post_id, $field, $value );
|
||||
|
||||
$value = apply_filters( 'acf/update_value', $value, $post_id, $field, $value );
|
||||
|
||||
// Allow null to delete value.
|
||||
if( $value === null ) {
|
||||
if ( $value === null ) {
|
||||
return acf_delete_value( $post_id, $field );
|
||||
}
|
||||
|
||||
|
||||
// Update meta.
|
||||
$return = acf_update_metadata( $post_id, $field['name'], $value );
|
||||
|
||||
|
||||
// Update reference.
|
||||
acf_update_metadata( $post_id, $field['name'], $field['key'], true );
|
||||
|
||||
|
||||
// Delete stored data.
|
||||
acf_flush_value_cache( $post_id, $field['name'] );
|
||||
|
||||
|
||||
// Return update status.
|
||||
return $return;
|
||||
}
|
||||
|
||||
// Register variation.
|
||||
acf_add_filter_variations( 'acf/update_value', array('type', 'name', 'key'), 2 );
|
||||
acf_add_filter_variations( 'acf/update_value', array( 'type', 'name', 'key' ), 2 );
|
||||
|
||||
/**
|
||||
* acf_update_values
|
||||
*
|
||||
* Updates an array of values.
|
||||
*
|
||||
* @date 26/2/19
|
||||
* @since 5.7.13
|
||||
* @date 26/2/19
|
||||
* @since 5.7.13
|
||||
*
|
||||
* @param array values The array of values.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @return void
|
||||
* @param array values The array of values.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @return void
|
||||
*/
|
||||
function acf_update_values( $values, $post_id ) {
|
||||
|
||||
|
||||
// Loop over values.
|
||||
foreach( $values as $key => $value ) {
|
||||
|
||||
foreach ( $values as $key => $value ) {
|
||||
|
||||
// Get field.
|
||||
$field = acf_get_field( $key );
|
||||
|
||||
|
||||
// Update value.
|
||||
if( $field ) {
|
||||
if ( $field ) {
|
||||
acf_update_value( $value, $post_id, $field );
|
||||
}
|
||||
}
|
||||
|
|
@ -235,15 +235,15 @@ function acf_update_values( $values, $post_id ) {
|
|||
*
|
||||
* Deletes all cached data for this value.
|
||||
*
|
||||
* @date 22/1/19
|
||||
* @since 5.7.10
|
||||
* @date 22/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $field_name The field name.
|
||||
* @return void
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param string $field_name The field name.
|
||||
* @return void
|
||||
*/
|
||||
function acf_flush_value_cache( $post_id = 0, $field_name = '' ) {
|
||||
|
||||
|
||||
// Delete stored data.
|
||||
acf_get_store( 'values' )
|
||||
->remove( "$post_id:$field_name" )
|
||||
|
|
@ -255,70 +255,70 @@ function acf_flush_value_cache( $post_id = 0, $field_name = '' ) {
|
|||
*
|
||||
* Deletes the value for a given field and post_id.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return bool.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return bool.
|
||||
*/
|
||||
function acf_delete_value( $post_id, $field ) {
|
||||
|
||||
|
||||
/**
|
||||
* Fires before a value is deleted.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param mixed $name The meta name.
|
||||
* @param array $field The field array.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param mixed $name The meta name.
|
||||
* @param array $field The field array.
|
||||
*/
|
||||
do_action( "acf/delete_value", $post_id, $field['name'], $field );
|
||||
|
||||
do_action( 'acf/delete_value', $post_id, $field['name'], $field );
|
||||
|
||||
// Delete meta.
|
||||
$return = acf_delete_metadata( $post_id, $field['name'] );
|
||||
|
||||
|
||||
// Delete reference.
|
||||
acf_delete_metadata( $post_id, $field['name'], true );
|
||||
|
||||
|
||||
// Delete stored data.
|
||||
acf_flush_value_cache( $post_id, $field['name'] );
|
||||
|
||||
|
||||
// Return delete status.
|
||||
return $return;
|
||||
}
|
||||
|
||||
// Register variation.
|
||||
acf_add_filter_variations( 'acf/delete_value', array('type', 'name', 'key'), 2 );
|
||||
acf_add_filter_variations( 'acf/delete_value', array( 'type', 'name', 'key' ), 2 );
|
||||
|
||||
/**
|
||||
* acf_preview_value
|
||||
*
|
||||
* Return a human friendly 'preview' for a given field value.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param mixed $value The new value.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return bool.
|
||||
* @param mixed $value The new value.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $field The field array.
|
||||
* @return bool.
|
||||
*/
|
||||
function acf_preview_value( $value, $post_id, $field ) {
|
||||
|
||||
|
||||
/**
|
||||
* Filters the $value before used in HTML.
|
||||
*
|
||||
* @date 24/10/16
|
||||
* @since 5.5.0
|
||||
* @date 24/10/16
|
||||
* @since 5.5.0
|
||||
*
|
||||
* @param mixed $value The value to preview.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
* @param mixed $value The value to preview.
|
||||
* @param string $post_id The post ID for this value.
|
||||
* @param array $field The field array.
|
||||
*/
|
||||
return apply_filters( "acf/preview_value", $value, $post_id, $field );
|
||||
return apply_filters( 'acf/preview_value', $value, $post_id, $field );
|
||||
}
|
||||
|
||||
// Register variation.
|
||||
acf_add_filter_variations( 'acf/preview_value', array('type', 'name', 'key'), 2 );
|
||||
acf_add_filter_variations( 'acf/preview_value', array( 'type', 'name', 'key' ), 2 );
|
||||
|
|
|
|||
|
|
@ -3,106 +3,106 @@
|
|||
/**
|
||||
* Returns a WordPress object type.
|
||||
*
|
||||
* @date 1/4/20
|
||||
* @since 5.9.0
|
||||
* @date 1/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $object_type The object type (post, term, user, etc).
|
||||
* @param string $object_subtype Optional object subtype (post type, taxonomy).
|
||||
* @return object
|
||||
* @param string $object_type The object type (post, term, user, etc).
|
||||
* @param string $object_subtype Optional object subtype (post type, taxonomy).
|
||||
* @return object
|
||||
*/
|
||||
function acf_get_object_type( $object_type, $object_subtype = '' ) {
|
||||
$props = array(
|
||||
'type' => $object_type,
|
||||
'subtype' => $object_subtype,
|
||||
'name' => '',
|
||||
'label' => '',
|
||||
'icon' => ''
|
||||
'type' => $object_type,
|
||||
'subtype' => $object_subtype,
|
||||
'name' => '',
|
||||
'label' => '',
|
||||
'icon' => '',
|
||||
);
|
||||
|
||||
|
||||
// Set unique identifier as name.
|
||||
if( $object_subtype ) {
|
||||
if ( $object_subtype ) {
|
||||
$props['name'] = "$object_type/$object_subtype";
|
||||
} else {
|
||||
$props['name'] = $object_type;
|
||||
}
|
||||
|
||||
|
||||
// Set label and icon.
|
||||
switch ( $object_type ) {
|
||||
case 'post':
|
||||
if( $object_subtype ) {
|
||||
if ( $object_subtype ) {
|
||||
$post_type = get_post_type_object( $object_subtype );
|
||||
if( $post_type ) {
|
||||
if ( $post_type ) {
|
||||
$props['label'] = $post_type->labels->name;
|
||||
$props['icon'] = acf_with_default( $post_type->menu_icon, 'dashicons-admin-post' );
|
||||
$props['icon'] = acf_with_default( $post_type->menu_icon, 'dashicons-admin-post' );
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$props['label'] = __('Posts', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-post';
|
||||
$props['label'] = __( 'Posts', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-post';
|
||||
}
|
||||
break;
|
||||
case 'term':
|
||||
if( $object_subtype ) {
|
||||
if ( $object_subtype ) {
|
||||
$taxonomy = get_taxonomy( $object_subtype );
|
||||
if( $taxonomy ) {
|
||||
if ( $taxonomy ) {
|
||||
$props['label'] = $taxonomy->labels->name;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$props['label'] = __('Taxonomies', 'acf');
|
||||
$props['label'] = __( 'Taxonomies', 'acf' );
|
||||
}
|
||||
$props['icon'] = 'dashicons-tag';
|
||||
break;
|
||||
case 'attachment':
|
||||
$props['label'] = __('Attachments', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-media';
|
||||
$props['label'] = __( 'Attachments', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-media';
|
||||
break;
|
||||
case 'comment':
|
||||
$props['label'] = __('Comments', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-comments';
|
||||
$props['label'] = __( 'Comments', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-comments';
|
||||
break;
|
||||
case 'widget':
|
||||
$props['label'] = __('Widgets', 'acf');
|
||||
$props['icon'] = 'dashicons-screenoptions';
|
||||
$props['label'] = __( 'Widgets', 'acf' );
|
||||
$props['icon'] = 'dashicons-screenoptions';
|
||||
break;
|
||||
case 'menu':
|
||||
$props['label'] = __('Menus', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-appearance';
|
||||
$props['label'] = __( 'Menus', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-appearance';
|
||||
break;
|
||||
case 'menu_item':
|
||||
$props['label'] = __('Menu items', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-appearance';
|
||||
$props['label'] = __( 'Menu items', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-appearance';
|
||||
break;
|
||||
case 'user':
|
||||
$props['label'] = __('Users', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-users';
|
||||
$props['label'] = __( 'Users', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-users';
|
||||
break;
|
||||
case 'option':
|
||||
$props['label'] = __('Options', 'acf');
|
||||
$props['icon'] = 'dashicons-admin-generic';
|
||||
$props['label'] = __( 'Options', 'acf' );
|
||||
$props['icon'] = 'dashicons-admin-generic';
|
||||
break;
|
||||
case 'block':
|
||||
$props['label'] = __('Blocks', 'acf');
|
||||
$props['icon'] = acf_version_compare('wp', '>=', '5.5') ? 'dashicons-block-default' : 'dashicons-layout';
|
||||
$props['label'] = __( 'Blocks', 'acf' );
|
||||
$props['icon'] = acf_version_compare( 'wp', '>=', '5.5' ) ? 'dashicons-block-default' : 'dashicons-layout';
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Convert to object.
|
||||
$object = (object) $props;
|
||||
|
||||
|
||||
/**
|
||||
* Filters the object type.
|
||||
*
|
||||
* @date 6/4/20
|
||||
* @since 5.9.0
|
||||
* @date 6/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param object $object The object props.
|
||||
* @param string $object_type The object type (post, term, user, etc).
|
||||
* @param string $object_subtype Optional object subtype (post type, taxonomy).
|
||||
* @param object $object The object props.
|
||||
* @param string $object_type The object type (post, term, user, etc).
|
||||
* @param string $object_subtype Optional object subtype (post type, taxonomy).
|
||||
*/
|
||||
return apply_filters( 'acf/get_object_type', $object, $object_type, $object_subtype );
|
||||
}
|
||||
|
|
@ -110,109 +110,109 @@ function acf_get_object_type( $object_type, $object_subtype = '' ) {
|
|||
/**
|
||||
* Decodes a post_id value such as 1 or "user_1" into an array containing the type and ID.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @return array
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @return array
|
||||
*/
|
||||
function acf_decode_post_id( $post_id = 0 ) {
|
||||
$type = '';
|
||||
$id = 0;
|
||||
|
||||
$id = 0;
|
||||
|
||||
// Interpret numeric value (123).
|
||||
if ( is_numeric($post_id) ) {
|
||||
if ( is_numeric( $post_id ) ) {
|
||||
$type = 'post';
|
||||
$id = $post_id;
|
||||
|
||||
// Interpret string value ("user_123" or "option").
|
||||
} elseif ( is_string($post_id) ) {
|
||||
$i = strrpos($post_id, '_');
|
||||
if( $i > 0 ) {
|
||||
$type = substr($post_id, 0, $i);
|
||||
$id = substr($post_id, $i+1);
|
||||
$id = $post_id;
|
||||
|
||||
// Interpret string value ("user_123" or "option").
|
||||
} elseif ( is_string( $post_id ) ) {
|
||||
$i = strrpos( $post_id, '_' );
|
||||
if ( $i > 0 ) {
|
||||
$type = substr( $post_id, 0, $i );
|
||||
$id = substr( $post_id, $i + 1 );
|
||||
} else {
|
||||
$type = $post_id;
|
||||
$id = '';
|
||||
$id = '';
|
||||
}
|
||||
|
||||
// Handle incorrect param type.
|
||||
|
||||
// Handle incorrect param type.
|
||||
} else {
|
||||
return compact( 'type', 'id' );
|
||||
}
|
||||
|
||||
|
||||
// Validate props based on param format.
|
||||
$format = $type . '_' . (is_numeric($id) ? '%d' : '%s');
|
||||
$format = $type . '_' . ( is_numeric( $id ) ? '%d' : '%s' );
|
||||
switch ( $format ) {
|
||||
case 'post_%d':
|
||||
$type = 'post';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'term_%d':
|
||||
$type = 'term';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'attachment_%d':
|
||||
$type = 'post';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'comment_%d':
|
||||
$type = 'comment';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'widget_%s':
|
||||
case 'widget_%d':
|
||||
$type = 'option';
|
||||
$id = $post_id;
|
||||
$id = $post_id;
|
||||
break;
|
||||
case 'menu_%d':
|
||||
$type = 'term';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'menu_item_%d':
|
||||
$type = 'post';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'user_%d':
|
||||
$type = 'user';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
case 'block_%s':
|
||||
$type = 'block';
|
||||
$id = $post_id;
|
||||
$id = $post_id;
|
||||
break;
|
||||
case 'option_%s':
|
||||
$type = 'option';
|
||||
$id = $post_id;
|
||||
$id = $post_id;
|
||||
break;
|
||||
case 'blog_%d':
|
||||
case 'site_%d':
|
||||
// Allow backwards compatibility for custom taxonomies.
|
||||
$type = taxonomy_exists($type) ? 'term' : 'blog';
|
||||
$id = absint( $id );
|
||||
$type = taxonomy_exists( $type ) ? 'term' : 'blog';
|
||||
$id = absint( $id );
|
||||
break;
|
||||
default:
|
||||
// Check for taxonomy name.
|
||||
if( taxonomy_exists($type) && is_numeric($id) ) {
|
||||
if ( taxonomy_exists( $type ) && is_numeric( $id ) ) {
|
||||
$type = 'term';
|
||||
$id = absint( $id );
|
||||
$id = absint( $id );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Treat unknown post_id format as an option.
|
||||
$type = 'option';
|
||||
$id = $post_id;
|
||||
$id = $post_id;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Filters the decoded post_id information.
|
||||
*
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
* @date 25/1/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param array $props An array containing "type" and "id" information.
|
||||
* @param (int|string) $post_id The post id.
|
||||
* @param array $props An array containing "type" and "id" information.
|
||||
* @param (int|string) $post_id The post id.
|
||||
*/
|
||||
return apply_filters( "acf/decode_post_id", compact( 'type', 'id' ), $post_id );
|
||||
return apply_filters( 'acf/decode_post_id', compact( 'type', 'id' ), $post_id );
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,15 +1,17 @@
|
|||
<?php
|
||||
<?php
|
||||
/**
|
||||
* ACF Admin Notices
|
||||
*
|
||||
* Functions and classes to manage admin notices.
|
||||
*
|
||||
* @date 10/1/19
|
||||
* @since 5.7.10
|
||||
* @date 10/1/19
|
||||
* @since 5.7.10
|
||||
*/
|
||||
|
||||
// Exit if accessed directly.
|
||||
if( !defined('ABSPATH') ) exit;
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
// Register notices store.
|
||||
acf_register_store( 'notices' );
|
||||
|
|
@ -19,71 +21,72 @@ acf_register_store( 'notices' );
|
|||
*
|
||||
* Class used to create an admin notice.
|
||||
*
|
||||
* @date 10/1/19
|
||||
* @since 5.7.10
|
||||
* @date 10/1/19
|
||||
* @since 5.7.10
|
||||
*/
|
||||
if( ! class_exists('ACF_Admin_Notice') ) :
|
||||
if ( ! class_exists( 'ACF_Admin_Notice' ) ) :
|
||||
|
||||
class ACF_Admin_Notice extends ACF_Data {
|
||||
|
||||
/** @var array Storage for data. */
|
||||
var $data = array(
|
||||
|
||||
/** @type string Text displayed in notice. */
|
||||
'text' => '',
|
||||
|
||||
/** @type string The type of notice (warning, error, success, info). */
|
||||
'type' => 'info',
|
||||
|
||||
/** @type bool If the notice can be dismissed. */
|
||||
'dismissible' => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* render
|
||||
*
|
||||
* Renders the notice HTML.
|
||||
*
|
||||
* @date 27/12/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function render() {
|
||||
$notice_text = $this->get('text');
|
||||
$notice_type = $this->get('type');
|
||||
$is_dismissible = $this->get('dismissible');
|
||||
|
||||
printf('<div class="acf-admin-notice notice notice-%s %s">%s</div>',
|
||||
esc_attr( $notice_type ),
|
||||
$is_dismissible ? 'is-dismissible' : '',
|
||||
acf_esc_html( wpautop( acf_punctify( $notice_text ) ) )
|
||||
class ACF_Admin_Notice extends ACF_Data {
|
||||
|
||||
/** @var array Storage for data. */
|
||||
var $data = array(
|
||||
|
||||
/** @type string Text displayed in notice. */
|
||||
'text' => '',
|
||||
|
||||
/** @type string The type of notice (warning, error, success, info). */
|
||||
'type' => 'info',
|
||||
|
||||
/** @type bool If the notice can be dismissed. */
|
||||
'dismissible' => true,
|
||||
);
|
||||
|
||||
/**
|
||||
* render
|
||||
*
|
||||
* Renders the notice HTML.
|
||||
*
|
||||
* @date 27/12/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function render() {
|
||||
$notice_text = $this->get( 'text' );
|
||||
$notice_type = $this->get( 'type' );
|
||||
$is_dismissible = $this->get( 'dismissible' );
|
||||
|
||||
printf(
|
||||
'<div class="acf-admin-notice notice notice-%s %s">%s</div>',
|
||||
esc_attr( $notice_type ),
|
||||
$is_dismissible ? 'is-dismissible' : '',
|
||||
acf_esc_html( wpautop( acf_punctify( $notice_text ) ) )
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
/**
|
||||
* acf_new_admin_notice
|
||||
*
|
||||
* Instantiates and returns a new model.
|
||||
*
|
||||
* @date 23/12/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param array $data Optional data to set.
|
||||
* @return ACF_Admin_Notice
|
||||
*/
|
||||
* acf_new_admin_notice
|
||||
*
|
||||
* Instantiates and returns a new model.
|
||||
*
|
||||
* @date 23/12/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param array $data Optional data to set.
|
||||
* @return ACF_Admin_Notice
|
||||
*/
|
||||
function acf_new_admin_notice( $data = false ) {
|
||||
|
||||
|
||||
// Create notice.
|
||||
$instance = new ACF_Admin_Notice( $data );
|
||||
|
||||
|
||||
// Register notice.
|
||||
acf_get_store( 'notices' )->set( $instance->cid, $instance );
|
||||
|
||||
|
||||
// Return notice.
|
||||
return $instance;
|
||||
}
|
||||
|
|
@ -93,40 +96,45 @@ function acf_new_admin_notice( $data = false ) {
|
|||
*
|
||||
* Renders all admin notices HTML.
|
||||
*
|
||||
* @date 10/1/19
|
||||
* @since 5.7.10
|
||||
* @date 10/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function acf_render_admin_notices() {
|
||||
|
||||
|
||||
// Get notices.
|
||||
$notices = acf_get_store( 'notices' )->get_data();
|
||||
|
||||
|
||||
// Loop over notices and render.
|
||||
if( $notices ) {
|
||||
foreach( $notices as $notice ) {
|
||||
if ( $notices ) {
|
||||
foreach ( $notices as $notice ) {
|
||||
$notice->render();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Render notices during admin action.
|
||||
add_action('admin_notices', 'acf_render_admin_notices', 99);
|
||||
add_action( 'admin_notices', 'acf_render_admin_notices', 99 );
|
||||
|
||||
/**
|
||||
* acf_add_admin_notice
|
||||
*
|
||||
* Creates and returns a new notice.
|
||||
*
|
||||
* @date 17/10/13
|
||||
* @since 5.0.0
|
||||
* @date 17/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $text The admin notice text.
|
||||
* @param string $class The type of notice (warning, error, success, info).
|
||||
* @return ACF_Admin_Notice
|
||||
* @param string $text The admin notice text.
|
||||
* @param string $class The type of notice (warning, error, success, info).
|
||||
* @return ACF_Admin_Notice
|
||||
*/
|
||||
function acf_add_admin_notice( $text = '', $type = 'info' ) {
|
||||
return acf_new_admin_notice( array( 'text' => $text, 'type' => $type ) );
|
||||
}
|
||||
return acf_new_admin_notice(
|
||||
array(
|
||||
'text' => $text,
|
||||
'type' => $type,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,291 +1,285 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if( ! class_exists('acf_admin_tools') ) :
|
||||
if ( ! class_exists( 'acf_admin_tools' ) ) :
|
||||
|
||||
class acf_admin_tools {
|
||||
|
||||
|
||||
/** @var array Contains an array of admin tool instances */
|
||||
var $tools = array();
|
||||
|
||||
|
||||
/** @var string The active tool */
|
||||
var $active = '';
|
||||
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the class functionality
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_action('admin_menu', array($this, 'admin_menu'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* register_tool
|
||||
*
|
||||
* This function will store a tool tool class
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param string $class
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_tool( $class ) {
|
||||
|
||||
$instance = new $class();
|
||||
$this->tools[ $instance->name ] = $instance;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_tool
|
||||
*
|
||||
* This function will return a tool tool class
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param string $name
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_tool( $name ) {
|
||||
|
||||
return isset( $this->tools[$name] ) ? $this->tools[$name] : null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_tools
|
||||
*
|
||||
* This function will return an array of all tools
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return array
|
||||
*/
|
||||
|
||||
function get_tools() {
|
||||
|
||||
return $this->tools;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* admin_menu
|
||||
*
|
||||
* This function will add the ACF menu item to the WP admin
|
||||
*
|
||||
* @type action (admin_menu)
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function admin_menu() {
|
||||
|
||||
// bail early if no show_admin
|
||||
if( !acf_get_setting('show_admin') ) return;
|
||||
|
||||
|
||||
// add page
|
||||
$page = add_submenu_page('edit.php?post_type=acf-field-group', __('Tools','acf'), __('Tools','acf'), acf_get_setting('capability'), 'acf-tools', array($this, 'html'));
|
||||
|
||||
|
||||
// actions
|
||||
add_action('load-' . $page, array($this, 'load'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* load
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function load() {
|
||||
|
||||
// disable filters (default to raw data)
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// include tools
|
||||
$this->include_tools();
|
||||
|
||||
|
||||
// check submit
|
||||
$this->check_submit();
|
||||
|
||||
|
||||
// load acf scripts
|
||||
acf_enqueue_scripts();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* include_tools
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function include_tools() {
|
||||
|
||||
// include
|
||||
acf_include('includes/admin/tools/class-acf-admin-tool.php');
|
||||
acf_include('includes/admin/tools/class-acf-admin-tool-export.php');
|
||||
acf_include('includes/admin/tools/class-acf-admin-tool-import.php');
|
||||
|
||||
|
||||
// action
|
||||
do_action('acf/include_admin_tools');
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* check_submit
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function check_submit() {
|
||||
|
||||
// loop
|
||||
foreach( $this->get_tools() as $tool ) {
|
||||
|
||||
// load
|
||||
$tool->load();
|
||||
|
||||
|
||||
// submit
|
||||
if( acf_verify_nonce($tool->name) ) {
|
||||
$tool->submit();
|
||||
class acf_admin_tools {
|
||||
|
||||
|
||||
/** @var array Contains an array of admin tool instances */
|
||||
var $tools = array();
|
||||
|
||||
|
||||
/** @var string The active tool */
|
||||
var $active = '';
|
||||
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the class functionality
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* register_tool
|
||||
*
|
||||
* This function will store a tool tool class
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param string $class
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_tool( $class ) {
|
||||
|
||||
$instance = new $class();
|
||||
$this->tools[ $instance->name ] = $instance;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_tool
|
||||
*
|
||||
* This function will return a tool tool class
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param string $name
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_tool( $name ) {
|
||||
|
||||
return isset( $this->tools[ $name ] ) ? $this->tools[ $name ] : null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_tools
|
||||
*
|
||||
* This function will return an array of all tools
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return array
|
||||
*/
|
||||
|
||||
function get_tools() {
|
||||
|
||||
return $this->tools;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* admin_menu
|
||||
*
|
||||
* This function will add the ACF menu item to the WP admin
|
||||
*
|
||||
* @type action (admin_menu)
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function admin_menu() {
|
||||
|
||||
// bail early if no show_admin
|
||||
if ( ! acf_get_setting( 'show_admin' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// add page
|
||||
$page = add_submenu_page( 'edit.php?post_type=acf-field-group', __( 'Tools', 'acf' ), __( 'Tools', 'acf' ), acf_get_setting( 'capability' ), 'acf-tools', array( $this, 'html' ) );
|
||||
|
||||
// actions
|
||||
add_action( 'load-' . $page, array( $this, 'load' ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* html
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function html() {
|
||||
|
||||
// vars
|
||||
$screen = get_current_screen();
|
||||
$active = acf_maybe_get_GET('tool');
|
||||
|
||||
|
||||
// view
|
||||
$view = array(
|
||||
'screen_id' => $screen->id,
|
||||
'active' => $active
|
||||
);
|
||||
|
||||
|
||||
// register metaboxes
|
||||
foreach( $this->get_tools() as $tool ) {
|
||||
|
||||
// check active
|
||||
if( $active && $active !== $tool->name ) continue;
|
||||
|
||||
// add metabox
|
||||
add_meta_box( 'acf-admin-tool-' . $tool->name, acf_esc_html( $tool->title ), array($this, 'metabox_html'), $screen->id, 'normal', 'default', array('tool' => $tool->name) );
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* load
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function load() {
|
||||
|
||||
// disable filters (default to raw data)
|
||||
acf_disable_filters();
|
||||
|
||||
// include tools
|
||||
$this->include_tools();
|
||||
|
||||
// check submit
|
||||
$this->check_submit();
|
||||
|
||||
// load acf scripts
|
||||
acf_enqueue_scripts();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// view
|
||||
acf_get_view( 'html-admin-tools', $view );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* meta_box_html
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function metabox_html( $post, $metabox ) {
|
||||
|
||||
// vars
|
||||
$tool = $this->get_tool($metabox['args']['tool']);
|
||||
|
||||
|
||||
?>
|
||||
|
||||
|
||||
/**
|
||||
* include_tools
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function include_tools() {
|
||||
|
||||
// include
|
||||
acf_include( 'includes/admin/tools/class-acf-admin-tool.php' );
|
||||
acf_include( 'includes/admin/tools/class-acf-admin-tool-export.php' );
|
||||
acf_include( 'includes/admin/tools/class-acf-admin-tool-import.php' );
|
||||
|
||||
// action
|
||||
do_action( 'acf/include_admin_tools' );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* check_submit
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function check_submit() {
|
||||
|
||||
// loop
|
||||
foreach ( $this->get_tools() as $tool ) {
|
||||
|
||||
// load
|
||||
$tool->load();
|
||||
|
||||
// submit
|
||||
if ( acf_verify_nonce( $tool->name ) ) {
|
||||
$tool->submit();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* html
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function html() {
|
||||
|
||||
// vars
|
||||
$screen = get_current_screen();
|
||||
$active = acf_maybe_get_GET( 'tool' );
|
||||
|
||||
// view
|
||||
$view = array(
|
||||
'screen_id' => $screen->id,
|
||||
'active' => $active,
|
||||
);
|
||||
|
||||
// register metaboxes
|
||||
foreach ( $this->get_tools() as $tool ) {
|
||||
|
||||
// check active
|
||||
if ( $active && $active !== $tool->name ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// add metabox
|
||||
add_meta_box( 'acf-admin-tool-' . $tool->name, acf_esc_html( $tool->title ), array( $this, 'metabox_html' ), $screen->id, 'normal', 'default', array( 'tool' => $tool->name ) );
|
||||
|
||||
}
|
||||
|
||||
// view
|
||||
acf_get_view( 'html-admin-tools', $view );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* meta_box_html
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function metabox_html( $post, $metabox ) {
|
||||
|
||||
// vars
|
||||
$tool = $this->get_tool( $metabox['args']['tool'] );
|
||||
|
||||
?>
|
||||
<form method="post">
|
||||
<?php $tool->html(); ?>
|
||||
<?php acf_nonce_input( $tool->name ); ?>
|
||||
</form>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
<?php
|
||||
|
||||
// initialize
|
||||
acf()->admin_tools = new acf_admin_tools();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// initialize
|
||||
acf()->admin_tools = new acf_admin_tools();
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
|
|
@ -295,18 +289,18 @@ endif; // class_exists check
|
|||
*
|
||||
* alias of acf()->admin_tools->register_tool()
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_register_admin_tool( $class ) {
|
||||
|
||||
|
||||
return acf()->admin_tools->register_tool( $class );
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -315,18 +309,18 @@ function acf_register_admin_tool( $class ) {
|
|||
*
|
||||
* This function will return the admin URL to the tools page
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_get_admin_tools_url() {
|
||||
|
||||
return admin_url('edit.php?post_type=acf-field-group&page=acf-tools');
|
||||
|
||||
|
||||
return admin_url( 'edit.php?post_type=acf-field-group&page=acf-tools' );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -335,19 +329,19 @@ function acf_get_admin_tools_url() {
|
|||
*
|
||||
* This function will return the admin URL to the tools page
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_get_admin_tool_url( $tool = '' ) {
|
||||
|
||||
return acf_get_admin_tools_url() . '&tool='.$tool;
|
||||
|
||||
|
||||
return acf_get_admin_tools_url() . '&tool=' . $tool;
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,244 +1,246 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Admin_Upgrade') ) :
|
||||
|
||||
class ACF_Admin_Upgrade {
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_action( 'admin_menu', array($this,'admin_menu'), 20 );
|
||||
if( is_multisite() ) {
|
||||
add_action( 'network_admin_menu', array($this,'network_admin_menu'), 20 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_menu
|
||||
*
|
||||
* Setus up logic if DB Upgrade is needed on a single site.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_menu() {
|
||||
|
||||
// check if upgrade is avaialble
|
||||
if( acf_has_upgrade() ) {
|
||||
|
||||
// add notice
|
||||
add_action('admin_notices', array($this, 'admin_notices'));
|
||||
|
||||
// add page
|
||||
$page = add_submenu_page('index.php', __('Upgrade Database','acf'), __('Upgrade Database','acf'), acf_get_setting('capability'), 'acf-upgrade', array($this,'admin_html') );
|
||||
|
||||
// actions
|
||||
add_action('load-' . $page, array($this,'admin_load'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_menu
|
||||
*
|
||||
* Sets up admin logic if DB Upgrade is required on a multi site.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function network_admin_menu() {
|
||||
|
||||
// Vars.
|
||||
$upgrade = false;
|
||||
|
||||
// Loop over sites and check for upgrades.
|
||||
$sites = get_sites( array( 'number' => 0 ) );
|
||||
if( $sites ) {
|
||||
|
||||
// Unhook action to avoid memory issue (as seen in wp-includes/ms-site.php).
|
||||
remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 );
|
||||
foreach( $sites as $site ) {
|
||||
|
||||
// Switch site.
|
||||
switch_to_blog( $site->blog_id );
|
||||
|
||||
// Check for upgrade.
|
||||
$site_upgrade = acf_has_upgrade();
|
||||
|
||||
// Restore site.
|
||||
// Ideally, we would switch back to the original site at after looping, however,
|
||||
// the restore_current_blog() is needed to modify global vars.
|
||||
restore_current_blog();
|
||||
|
||||
// Check if upgrade was found.
|
||||
if( $site_upgrade ) {
|
||||
$upgrade = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
|
||||
}
|
||||
|
||||
// Bail early if no upgrade is needed.
|
||||
if( !$upgrade ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add notice.
|
||||
add_action('network_admin_notices', array($this, 'network_admin_notices'));
|
||||
|
||||
// Add page.
|
||||
$page = add_submenu_page(
|
||||
'index.php',
|
||||
__('Upgrade Database','acf'),
|
||||
__('Upgrade Database','acf'),
|
||||
acf_get_setting('capability'),
|
||||
'acf-upgrade-network',
|
||||
array( $this,'network_admin_html' )
|
||||
);
|
||||
add_action( "load-$page", array( $this, 'network_admin_load' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_load
|
||||
*
|
||||
* Runs during the loading of the admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function admin_load() {
|
||||
|
||||
// remove prompt
|
||||
remove_action('admin_notices', array($this, 'admin_notices'));
|
||||
|
||||
// Enqueue core script.
|
||||
acf_enqueue_script( 'acf' );
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_load
|
||||
*
|
||||
* Runs during the loading of the network admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function network_admin_load() {
|
||||
|
||||
// remove prompt
|
||||
remove_action('network_admin_notices', array($this, 'network_admin_notices'));
|
||||
|
||||
// Enqueue core script.
|
||||
acf_enqueue_script( 'acf' );
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_notices
|
||||
*
|
||||
* Displays the DB Upgrade prompt.
|
||||
*
|
||||
* @date 23/8/18
|
||||
* @since 5.7.3
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_notices() {
|
||||
|
||||
// vars
|
||||
$view = array(
|
||||
'button_text' => __("Upgrade Database", 'acf'),
|
||||
'button_url' => admin_url('index.php?page=acf-upgrade'),
|
||||
'confirm' => true
|
||||
);
|
||||
|
||||
// view
|
||||
acf_get_view('html-notice-upgrade', $view);
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_notices
|
||||
*
|
||||
* Displays the DB Upgrade prompt on a multi site.
|
||||
*
|
||||
* @date 23/8/18
|
||||
* @since 5.7.3
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function network_admin_notices() {
|
||||
|
||||
// vars
|
||||
$view = array(
|
||||
'button_text' => __("Review sites & upgrade", 'acf'),
|
||||
'button_url' => network_admin_url('index.php?page=acf-upgrade-network'),
|
||||
'confirm' => false
|
||||
);
|
||||
|
||||
// view
|
||||
acf_get_view('html-notice-upgrade', $view);
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_html
|
||||
*
|
||||
* Displays the HTML for the admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_html() {
|
||||
acf_get_view('html-admin-page-upgrade');
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_html
|
||||
*
|
||||
* Displays the HTML for the network upgrade admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function network_admin_html() {
|
||||
acf_get_view('html-admin-page-upgrade-network');
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
// instantiate
|
||||
acf_new_instance('ACF_Admin_Upgrade');
|
||||
if ( ! class_exists( 'ACF_Admin_Upgrade' ) ) :
|
||||
|
||||
class ACF_Admin_Upgrade {
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_action( 'admin_menu', array( $this, 'admin_menu' ), 20 );
|
||||
if ( is_multisite() ) {
|
||||
add_action( 'network_admin_menu', array( $this, 'network_admin_menu' ), 20 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_menu
|
||||
*
|
||||
* Setus up logic if DB Upgrade is needed on a single site.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_menu() {
|
||||
|
||||
// check if upgrade is avaialble
|
||||
if ( acf_has_upgrade() ) {
|
||||
|
||||
// add notice
|
||||
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
||||
|
||||
// add page
|
||||
$page = add_submenu_page( 'index.php', __( 'Upgrade Database', 'acf' ), __( 'Upgrade Database', 'acf' ), acf_get_setting( 'capability' ), 'acf-upgrade', array( $this, 'admin_html' ) );
|
||||
|
||||
// actions
|
||||
add_action( 'load-' . $page, array( $this, 'admin_load' ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_menu
|
||||
*
|
||||
* Sets up admin logic if DB Upgrade is required on a multi site.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function network_admin_menu() {
|
||||
|
||||
// Vars.
|
||||
$upgrade = false;
|
||||
|
||||
// Loop over sites and check for upgrades.
|
||||
$sites = get_sites( array( 'number' => 0 ) );
|
||||
if ( $sites ) {
|
||||
|
||||
// Unhook action to avoid memory issue (as seen in wp-includes/ms-site.php).
|
||||
remove_action( 'switch_blog', 'wp_switch_roles_and_user', 1 );
|
||||
foreach ( $sites as $site ) {
|
||||
|
||||
// Switch site.
|
||||
switch_to_blog( $site->blog_id );
|
||||
|
||||
// Check for upgrade.
|
||||
$site_upgrade = acf_has_upgrade();
|
||||
|
||||
// Restore site.
|
||||
// Ideally, we would switch back to the original site at after looping, however,
|
||||
// the restore_current_blog() is needed to modify global vars.
|
||||
restore_current_blog();
|
||||
|
||||
// Check if upgrade was found.
|
||||
if ( $site_upgrade ) {
|
||||
$upgrade = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
add_action( 'switch_blog', 'wp_switch_roles_and_user', 1, 2 );
|
||||
}
|
||||
|
||||
// Bail early if no upgrade is needed.
|
||||
if ( ! $upgrade ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add notice.
|
||||
add_action( 'network_admin_notices', array( $this, 'network_admin_notices' ) );
|
||||
|
||||
// Add page.
|
||||
$page = add_submenu_page(
|
||||
'index.php',
|
||||
__( 'Upgrade Database', 'acf' ),
|
||||
__( 'Upgrade Database', 'acf' ),
|
||||
acf_get_setting( 'capability' ),
|
||||
'acf-upgrade-network',
|
||||
array( $this, 'network_admin_html' )
|
||||
);
|
||||
add_action( "load-$page", array( $this, 'network_admin_load' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_load
|
||||
*
|
||||
* Runs during the loading of the admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function admin_load() {
|
||||
|
||||
// remove prompt
|
||||
remove_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
||||
|
||||
// Enqueue core script.
|
||||
acf_enqueue_script( 'acf' );
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_load
|
||||
*
|
||||
* Runs during the loading of the network admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function network_admin_load() {
|
||||
|
||||
// remove prompt
|
||||
remove_action( 'network_admin_notices', array( $this, 'network_admin_notices' ) );
|
||||
|
||||
// Enqueue core script.
|
||||
acf_enqueue_script( 'acf' );
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_notices
|
||||
*
|
||||
* Displays the DB Upgrade prompt.
|
||||
*
|
||||
* @date 23/8/18
|
||||
* @since 5.7.3
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_notices() {
|
||||
|
||||
// vars
|
||||
$view = array(
|
||||
'button_text' => __( 'Upgrade Database', 'acf' ),
|
||||
'button_url' => admin_url( 'index.php?page=acf-upgrade' ),
|
||||
'confirm' => true,
|
||||
);
|
||||
|
||||
// view
|
||||
acf_get_view( 'html-notice-upgrade', $view );
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_notices
|
||||
*
|
||||
* Displays the DB Upgrade prompt on a multi site.
|
||||
*
|
||||
* @date 23/8/18
|
||||
* @since 5.7.3
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function network_admin_notices() {
|
||||
|
||||
// vars
|
||||
$view = array(
|
||||
'button_text' => __( 'Review sites & upgrade', 'acf' ),
|
||||
'button_url' => network_admin_url( 'index.php?page=acf-upgrade-network' ),
|
||||
'confirm' => false,
|
||||
);
|
||||
|
||||
// view
|
||||
acf_get_view( 'html-notice-upgrade', $view );
|
||||
}
|
||||
|
||||
/**
|
||||
* admin_html
|
||||
*
|
||||
* Displays the HTML for the admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_html() {
|
||||
acf_get_view( 'html-admin-page-upgrade' );
|
||||
}
|
||||
|
||||
/**
|
||||
* network_admin_html
|
||||
*
|
||||
* Displays the HTML for the network upgrade admin page.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function network_admin_html() {
|
||||
acf_get_view( 'html-admin-page-upgrade-network' );
|
||||
}
|
||||
}
|
||||
|
||||
// instantiate
|
||||
acf_new_instance( 'ACF_Admin_Upgrade' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,207 +1,209 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Admin') ) :
|
||||
|
||||
class ACF_Admin {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @date 23/06/12
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
// Add actions.
|
||||
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
|
||||
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
|
||||
add_action( 'admin_body_class', array( $this, 'admin_body_class' ) );
|
||||
add_action( 'current_screen', array( $this, 'current_screen' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the ACF menu item.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_menu() {
|
||||
|
||||
// Bail early if ACF is hidden.
|
||||
if( !acf_get_setting('show_admin') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vars.
|
||||
$slug = 'edit.php?post_type=acf-field-group';
|
||||
$cap = acf_get_setting('capability');
|
||||
|
||||
// Add menu items.
|
||||
add_menu_page( __("Custom Fields",'acf'), __("Custom Fields",'acf'), $cap, $slug, false, 'dashicons-welcome-widgets-menus', 80 );
|
||||
add_submenu_page( $slug, __('Field Groups','acf'), __('Field Groups','acf'), $cap, $slug );
|
||||
add_submenu_page( $slug, __('Add New','acf'), __('Add New','acf'), $cap, 'post-new.php?post_type=acf-field-group' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues global admin styling.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_enqueue_scripts() {
|
||||
wp_enqueue_style( 'acf-global' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends custom admin body classes.
|
||||
*
|
||||
* @date 5/11/19
|
||||
* @since 5.8.7
|
||||
*
|
||||
* @param string $classes Space-separated list of CSS classes.
|
||||
* @return string
|
||||
*/
|
||||
function admin_body_class( $classes ) {
|
||||
global $wp_version;
|
||||
|
||||
// Determine body class version.
|
||||
$wp_minor_version = floatval( $wp_version );
|
||||
if( $wp_minor_version >= 5.3 ) {
|
||||
$classes .= ' acf-admin-5-3';
|
||||
} else {
|
||||
$classes .= ' acf-admin-3-8';
|
||||
}
|
||||
|
||||
// Add browser for specific CSS.
|
||||
$classes .= ' acf-browser-' . acf_get_browser();
|
||||
|
||||
// Return classes.
|
||||
return $classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds custom functionality to "ACF" admin pages.
|
||||
*
|
||||
* @date 7/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function current_screen( $screen ) {
|
||||
|
||||
// Determine if the current page being viewed is "ACF" related.
|
||||
if( isset( $screen->post_type ) && $screen->post_type === 'acf-field-group' ) {
|
||||
add_action( 'in_admin_header', array( $this, 'in_admin_header' ) );
|
||||
add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ) );
|
||||
$this->setup_help_tab();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up the admin help tab.
|
||||
*
|
||||
* @date 20/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
public function setup_help_tab() {
|
||||
$screen = get_current_screen();
|
||||
|
||||
// Overview tab.
|
||||
$screen->add_help_tab(
|
||||
array(
|
||||
'id' => 'overview',
|
||||
'title' => __( 'Overview', 'acf' ),
|
||||
'content' =>
|
||||
'<p><strong>' . __( 'Overview', 'acf' ) . '</strong></p>' .
|
||||
'<p>' . __( 'The Advanced Custom Fields plugin provides a visual form builder to customize WordPress edit screens with extra fields, and an intuitive API to display custom field values in any theme template file.', 'acf' ) . '</p>' .
|
||||
'<p>' . sprintf(
|
||||
__( 'Before creating your first Field Group, we recommend first reading our <a href="%s" target="_blank">Getting started</a> guide to familiarize yourself with the plugin\'s philosophy and best practises.', 'acf' ),
|
||||
'https://www.advancedcustomfields.com/resources/getting-started-with-acf/'
|
||||
) . '</p>' .
|
||||
'<p>' . __( 'Please use the Help & Support tab to get in touch should you find yourself requiring assistance.', 'acf' ) . '</p>' .
|
||||
''
|
||||
)
|
||||
);
|
||||
|
||||
// Help tab.
|
||||
$screen->add_help_tab(
|
||||
array(
|
||||
'id' => 'help',
|
||||
'title' => __( 'Help & Support', 'acf' ),
|
||||
'content' =>
|
||||
'<p><strong>' . __( 'Help & Support', 'acf' ) . '</strong></p>' .
|
||||
'<p>' . __( 'We are fanatical about support, and want you to get the best out of your website with ACF. If you run into any difficulties, there are several places you can find help:', 'acf' ) . '</p>' .
|
||||
'<ul>' .
|
||||
'<li>' . sprintf(
|
||||
__( '<a href="%s" target="_blank">Documentation</a>. Our extensive documentation contains references and guides for most situations you may encounter.', 'acf' ),
|
||||
'https://www.advancedcustomfields.com/resources/'
|
||||
) . '</li>' .
|
||||
'<li>' . sprintf(
|
||||
__( '<a href="%s" target="_blank">Discussions</a>. We have an active and friendly community on our Community Forums who may be able to help you figure out the ‘how-tos’ of the ACF world.', 'acf' ),
|
||||
'https://support.advancedcustomfields.com/'
|
||||
) . '</li>' .
|
||||
'<li>' . sprintf(
|
||||
__( '<a href="%s" target="_blank">Help Desk</a>. The support professionals on our Help Desk will assist with your more in depth, technical challenges.', 'acf' ),
|
||||
'https://www.advancedcustomfields.com/support/'
|
||||
) . '</li>' .
|
||||
'</ul>'
|
||||
)
|
||||
);
|
||||
|
||||
// Sidebar.
|
||||
$screen->set_help_sidebar(
|
||||
'<p><strong>' . __( 'Information', 'acf' ) . '</strong></p>' .
|
||||
'<p><span class="dashicons dashicons-admin-plugins"></span> ' . sprintf( __( 'Version %s', 'acf' ), ACF_VERSION ) . '</p>' .
|
||||
'<p><span class="dashicons dashicons-wordpress"></span> <a href="https://wordpress.org/plugins/advanced-custom-fields/" target="_blank">' . __( 'View details', 'acf' ) . '</a></p>' .
|
||||
'<p><span class="dashicons dashicons-admin-home"></span> <a href="https://www.advancedcustomfields.com/" target="_blank" target="_blank">' . __( 'Visit website', 'acf' ) . '</a></p>' .
|
||||
''
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the admin navigation element.
|
||||
*
|
||||
* @date 27/3/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function in_admin_header() {
|
||||
acf_get_view( 'html-admin-navigation' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifies the admin footer text.
|
||||
*
|
||||
* @date 7/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $text The admin footer text.
|
||||
* @return string
|
||||
*/
|
||||
function admin_footer_text( $text ) {
|
||||
// Use RegExp to append "ACF" after the <a> element allowing translations to read correctly.
|
||||
return preg_replace( '/(<a[\S\s]+?\/a>)/', '$1 ' . __('and', 'acf') . ' <a href="https://www.advancedcustomfields.com" target="_blank">ACF</a>', $text, 1 );
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
// Instantiate.
|
||||
acf_new_instance('ACF_Admin');
|
||||
if ( ! class_exists( 'ACF_Admin' ) ) :
|
||||
|
||||
class ACF_Admin {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @date 23/06/12
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
// Add actions.
|
||||
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
|
||||
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
|
||||
add_action( 'admin_body_class', array( $this, 'admin_body_class' ) );
|
||||
add_action( 'current_screen', array( $this, 'current_screen' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the ACF menu item.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_menu() {
|
||||
|
||||
// Bail early if ACF is hidden.
|
||||
if ( ! acf_get_setting( 'show_admin' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Vars.
|
||||
$slug = 'edit.php?post_type=acf-field-group';
|
||||
$cap = acf_get_setting( 'capability' );
|
||||
|
||||
// Add menu items.
|
||||
add_menu_page( __( 'Custom Fields', 'acf' ), __( 'Custom Fields', 'acf' ), $cap, $slug, false, 'dashicons-welcome-widgets-menus', 80 );
|
||||
add_submenu_page( $slug, __( 'Field Groups', 'acf' ), __( 'Field Groups', 'acf' ), $cap, $slug );
|
||||
add_submenu_page( $slug, __( 'Add New', 'acf' ), __( 'Add New', 'acf' ), $cap, 'post-new.php?post_type=acf-field-group' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueues global admin styling.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function admin_enqueue_scripts() {
|
||||
wp_enqueue_style( 'acf-global' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends custom admin body classes.
|
||||
*
|
||||
* @date 5/11/19
|
||||
* @since 5.8.7
|
||||
*
|
||||
* @param string $classes Space-separated list of CSS classes.
|
||||
* @return string
|
||||
*/
|
||||
function admin_body_class( $classes ) {
|
||||
global $wp_version;
|
||||
|
||||
// Determine body class version.
|
||||
$wp_minor_version = floatval( $wp_version );
|
||||
if ( $wp_minor_version >= 5.3 ) {
|
||||
$classes .= ' acf-admin-5-3';
|
||||
} else {
|
||||
$classes .= ' acf-admin-3-8';
|
||||
}
|
||||
|
||||
// Add browser for specific CSS.
|
||||
$classes .= ' acf-browser-' . acf_get_browser();
|
||||
|
||||
// Return classes.
|
||||
return $classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds custom functionality to "ACF" admin pages.
|
||||
*
|
||||
* @date 7/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function current_screen( $screen ) {
|
||||
|
||||
// Determine if the current page being viewed is "ACF" related.
|
||||
if ( isset( $screen->post_type ) && $screen->post_type === 'acf-field-group' ) {
|
||||
add_action( 'in_admin_header', array( $this, 'in_admin_header' ) );
|
||||
add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ) );
|
||||
$this->setup_help_tab();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up the admin help tab.
|
||||
*
|
||||
* @date 20/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
public function setup_help_tab() {
|
||||
$screen = get_current_screen();
|
||||
|
||||
// Overview tab.
|
||||
$screen->add_help_tab(
|
||||
array(
|
||||
'id' => 'overview',
|
||||
'title' => __( 'Overview', 'acf' ),
|
||||
'content' =>
|
||||
'<p><strong>' . __( 'Overview', 'acf' ) . '</strong></p>' .
|
||||
'<p>' . __( 'The Advanced Custom Fields plugin provides a visual form builder to customize WordPress edit screens with extra fields, and an intuitive API to display custom field values in any theme template file.', 'acf' ) . '</p>' .
|
||||
'<p>' . sprintf(
|
||||
__( 'Before creating your first Field Group, we recommend first reading our <a href="%s" target="_blank">Getting started</a> guide to familiarize yourself with the plugin\'s philosophy and best practises.', 'acf' ),
|
||||
'https://www.advancedcustomfields.com/resources/getting-started-with-acf/'
|
||||
) . '</p>' .
|
||||
'<p>' . __( 'Please use the Help & Support tab to get in touch should you find yourself requiring assistance.', 'acf' ) . '</p>' .
|
||||
'',
|
||||
)
|
||||
);
|
||||
|
||||
// Help tab.
|
||||
$screen->add_help_tab(
|
||||
array(
|
||||
'id' => 'help',
|
||||
'title' => __( 'Help & Support', 'acf' ),
|
||||
'content' =>
|
||||
'<p><strong>' . __( 'Help & Support', 'acf' ) . '</strong></p>' .
|
||||
'<p>' . __( 'We are fanatical about support, and want you to get the best out of your website with ACF. If you run into any difficulties, there are several places you can find help:', 'acf' ) . '</p>' .
|
||||
'<ul>' .
|
||||
'<li>' . sprintf(
|
||||
__( '<a href="%s" target="_blank">Documentation</a>. Our extensive documentation contains references and guides for most situations you may encounter.', 'acf' ),
|
||||
'https://www.advancedcustomfields.com/resources/'
|
||||
) . '</li>' .
|
||||
'<li>' . sprintf(
|
||||
__( '<a href="%s" target="_blank">Discussions</a>. We have an active and friendly community on our Community Forums who may be able to help you figure out the ‘how-tos’ of the ACF world.', 'acf' ),
|
||||
'https://support.advancedcustomfields.com/'
|
||||
) . '</li>' .
|
||||
'<li>' . sprintf(
|
||||
__( '<a href="%s" target="_blank">Help Desk</a>. The support professionals on our Help Desk will assist with your more in depth, technical challenges.', 'acf' ),
|
||||
'https://www.advancedcustomfields.com/support/'
|
||||
) . '</li>' .
|
||||
'</ul>',
|
||||
)
|
||||
);
|
||||
|
||||
// Sidebar.
|
||||
$screen->set_help_sidebar(
|
||||
'<p><strong>' . __( 'Information', 'acf' ) . '</strong></p>' .
|
||||
'<p><span class="dashicons dashicons-admin-plugins"></span> ' . sprintf( __( 'Version %s', 'acf' ), ACF_VERSION ) . '</p>' .
|
||||
'<p><span class="dashicons dashicons-wordpress"></span> <a href="https://wordpress.org/plugins/advanced-custom-fields/" target="_blank">' . __( 'View details', 'acf' ) . '</a></p>' .
|
||||
'<p><span class="dashicons dashicons-admin-home"></span> <a href="https://www.advancedcustomfields.com/" target="_blank" target="_blank">' . __( 'Visit website', 'acf' ) . '</a></p>' .
|
||||
''
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the admin navigation element.
|
||||
*
|
||||
* @date 27/3/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function in_admin_header() {
|
||||
acf_get_view( 'html-admin-navigation' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Modifies the admin footer text.
|
||||
*
|
||||
* @date 7/4/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param string $text The admin footer text.
|
||||
* @return string
|
||||
*/
|
||||
function admin_footer_text( $text ) {
|
||||
// Use RegExp to append "ACF" after the <a> element allowing translations to read correctly.
|
||||
return preg_replace( '/(<a[\S\s]+?\/a>)/', '$1 ' . __( 'and', 'acf' ) . ' <a href="https://www.advancedcustomfields.com" target="_blank">ACF</a>', $text, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
// Instantiate.
|
||||
acf_new_instance( 'ACF_Admin' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,157 +1,161 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if( ! class_exists('ACF_Admin_Tool_Import') ) :
|
||||
if ( ! class_exists( 'ACF_Admin_Tool_Import' ) ) :
|
||||
|
||||
class ACF_Admin_Tool_Import extends ACF_Admin_Tool {
|
||||
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* This function will initialize the admin tool
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'import';
|
||||
$this->title = __("Import Field Groups", 'acf');
|
||||
$this->icon = 'dashicons-upload';
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* html
|
||||
*
|
||||
* This function will output the metabox HTML
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function html() {
|
||||
|
||||
?>
|
||||
<p><?php _e('Select the Advanced Custom Fields JSON file you would like to import. When you click the import button below, ACF will import the field groups.', 'acf'); ?></p>
|
||||
class ACF_Admin_Tool_Import extends ACF_Admin_Tool {
|
||||
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* This function will initialize the admin tool
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'import';
|
||||
$this->title = __( 'Import Field Groups', 'acf' );
|
||||
$this->icon = 'dashicons-upload';
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* html
|
||||
*
|
||||
* This function will output the metabox HTML
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function html() {
|
||||
|
||||
?>
|
||||
<p><?php _e( 'Select the Advanced Custom Fields JSON file you would like to import. When you click the import button below, ACF will import the field groups.', 'acf' ); ?></p>
|
||||
<div class="acf-fields">
|
||||
<?php
|
||||
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Select File', 'acf'),
|
||||
'type' => 'file',
|
||||
'name' => 'acf_import_file',
|
||||
'value' => false,
|
||||
'uploader' => 'basic',
|
||||
));
|
||||
|
||||
<?php
|
||||
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Select File', 'acf' ),
|
||||
'type' => 'file',
|
||||
'name' => 'acf_import_file',
|
||||
'value' => false,
|
||||
'uploader' => 'basic',
|
||||
)
|
||||
);
|
||||
|
||||
?>
|
||||
</div>
|
||||
<p class="acf-submit">
|
||||
<input type="submit" class="button button-primary" value="<?php _e('Import File', 'acf'); ?>" />
|
||||
<input type="submit" class="button button-primary" value="<?php _e( 'Import File', 'acf' ); ?>" />
|
||||
</p>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* submit
|
||||
*
|
||||
* This function will run when the tool's form has been submit
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function submit() {
|
||||
|
||||
// Check file size.
|
||||
if( empty($_FILES['acf_import_file']['size']) ) {
|
||||
return acf_add_admin_notice( __("No file selected", 'acf'), 'warning' );
|
||||
}
|
||||
|
||||
// Get file data.
|
||||
$file = $_FILES['acf_import_file'];
|
||||
|
||||
// Check errors.
|
||||
if( $file['error'] ) {
|
||||
return acf_add_admin_notice( __("Error uploading file. Please try again", 'acf'), 'warning' );
|
||||
}
|
||||
|
||||
// Check file type.
|
||||
if( pathinfo($file['name'], PATHINFO_EXTENSION) !== 'json' ) {
|
||||
return acf_add_admin_notice( __("Incorrect file type", 'acf'), 'warning' );
|
||||
}
|
||||
|
||||
// Read JSON.
|
||||
$json = file_get_contents( $file['tmp_name'] );
|
||||
$json = json_decode($json, true);
|
||||
|
||||
// Check if empty.
|
||||
if( !$json || !is_array($json) ) {
|
||||
return acf_add_admin_notice( __("Import file empty", 'acf'), 'warning' );
|
||||
}
|
||||
|
||||
// Ensure $json is an array of groups.
|
||||
if( isset($json['key']) ) {
|
||||
$json = array( $json );
|
||||
}
|
||||
|
||||
// Remeber imported field group ids.
|
||||
$ids = array();
|
||||
|
||||
// Loop over json
|
||||
foreach( $json as $field_group ) {
|
||||
|
||||
// Search database for existing field group.
|
||||
$post = acf_get_field_group_post( $field_group['key'] );
|
||||
if( $post ) {
|
||||
$field_group['ID'] = $post->ID;
|
||||
}
|
||||
|
||||
// Import field group.
|
||||
$field_group = acf_import_field_group( $field_group );
|
||||
|
||||
// append message
|
||||
$ids[] = $field_group['ID'];
|
||||
}
|
||||
|
||||
// Count number of imported field groups.
|
||||
$total = count($ids);
|
||||
|
||||
// Generate text.
|
||||
$text = sprintf( _n( 'Imported 1 field group', 'Imported %s field groups', $total, 'acf' ), $total );
|
||||
|
||||
// Add links to text.
|
||||
$links = array();
|
||||
foreach( $ids as $id ) {
|
||||
$links[] = '<a href="' . get_edit_post_link( $id ) . '">' . get_the_title( $id ) . '</a>';
|
||||
}
|
||||
$text .= ' ' . implode( ', ', $links );
|
||||
|
||||
// Add notice
|
||||
acf_add_admin_notice( $text, 'success' );
|
||||
}
|
||||
}
|
||||
<?php
|
||||
|
||||
// initialize
|
||||
acf_register_admin_tool( 'ACF_Admin_Tool_Import' );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* submit
|
||||
*
|
||||
* This function will run when the tool's form has been submit
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function submit() {
|
||||
|
||||
// Check file size.
|
||||
if ( empty( $_FILES['acf_import_file']['size'] ) ) {
|
||||
return acf_add_admin_notice( __( 'No file selected', 'acf' ), 'warning' );
|
||||
}
|
||||
|
||||
// Get file data.
|
||||
$file = $_FILES['acf_import_file'];
|
||||
|
||||
// Check errors.
|
||||
if ( $file['error'] ) {
|
||||
return acf_add_admin_notice( __( 'Error uploading file. Please try again', 'acf' ), 'warning' );
|
||||
}
|
||||
|
||||
// Check file type.
|
||||
if ( pathinfo( $file['name'], PATHINFO_EXTENSION ) !== 'json' ) {
|
||||
return acf_add_admin_notice( __( 'Incorrect file type', 'acf' ), 'warning' );
|
||||
}
|
||||
|
||||
// Read JSON.
|
||||
$json = file_get_contents( $file['tmp_name'] );
|
||||
$json = json_decode( $json, true );
|
||||
|
||||
// Check if empty.
|
||||
if ( ! $json || ! is_array( $json ) ) {
|
||||
return acf_add_admin_notice( __( 'Import file empty', 'acf' ), 'warning' );
|
||||
}
|
||||
|
||||
// Ensure $json is an array of groups.
|
||||
if ( isset( $json['key'] ) ) {
|
||||
$json = array( $json );
|
||||
}
|
||||
|
||||
// Remeber imported field group ids.
|
||||
$ids = array();
|
||||
|
||||
// Loop over json
|
||||
foreach ( $json as $field_group ) {
|
||||
|
||||
// Search database for existing field group.
|
||||
$post = acf_get_field_group_post( $field_group['key'] );
|
||||
if ( $post ) {
|
||||
$field_group['ID'] = $post->ID;
|
||||
}
|
||||
|
||||
// Import field group.
|
||||
$field_group = acf_import_field_group( $field_group );
|
||||
|
||||
// append message
|
||||
$ids[] = $field_group['ID'];
|
||||
}
|
||||
|
||||
// Count number of imported field groups.
|
||||
$total = count( $ids );
|
||||
|
||||
// Generate text.
|
||||
$text = sprintf( _n( 'Imported 1 field group', 'Imported %s field groups', $total, 'acf' ), $total );
|
||||
|
||||
// Add links to text.
|
||||
$links = array();
|
||||
foreach ( $ids as $id ) {
|
||||
$links[] = '<a href="' . get_edit_post_link( $id ) . '">' . get_the_title( $id ) . '</a>';
|
||||
}
|
||||
$text .= ' ' . implode( ', ', $links );
|
||||
|
||||
// Add notice
|
||||
acf_add_admin_notice( $text, 'success' );
|
||||
}
|
||||
}
|
||||
|
||||
// initialize
|
||||
acf_register_admin_tool( 'ACF_Admin_Tool_Import' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,195 +1,194 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Admin_Tool') ) :
|
||||
|
||||
class ACF_Admin_Tool {
|
||||
|
||||
|
||||
/** @var string Tool name */
|
||||
var $name = '';
|
||||
|
||||
|
||||
/** @var string Tool title */
|
||||
var $title = '';
|
||||
|
||||
|
||||
/** @var string Dashicon slug */
|
||||
//var $icon = '';
|
||||
|
||||
|
||||
/** @var boolean Redirect form to single */
|
||||
//var $redirect = false;
|
||||
|
||||
|
||||
/**
|
||||
* get_name
|
||||
*
|
||||
* This function will return the Tool's name
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_name() {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_title
|
||||
*
|
||||
* This function will return the Tool's title
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_title() {
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_url
|
||||
*
|
||||
* This function will return the Tool's title
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_url() {
|
||||
return acf_get_admin_tool_url( $this->name );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* is_active
|
||||
*
|
||||
* This function will return true if the tool is active
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return bool
|
||||
*/
|
||||
|
||||
function is_active() {
|
||||
return acf_maybe_get_GET('tool') === $this->name;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the class functionality
|
||||
*
|
||||
* @type function
|
||||
* @date 27/6/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
|
||||
// initialize
|
||||
$this->initialize();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* This function will initialize the admin tool
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
/* do nothing */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* load
|
||||
*
|
||||
* This function is called during the admin page load
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function load() {
|
||||
|
||||
/* do nothing */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* html
|
||||
*
|
||||
* This function will output the metabox HTML
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function html() {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* submit
|
||||
*
|
||||
* This function will run when the tool's form has been submit
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function submit() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'ACF_Admin_Tool' ) ) :
|
||||
|
||||
class ACF_Admin_Tool {
|
||||
|
||||
|
||||
/** @var string Tool name */
|
||||
var $name = '';
|
||||
|
||||
|
||||
/** @var string Tool title */
|
||||
var $title = '';
|
||||
|
||||
|
||||
/** @var string Dashicon slug */
|
||||
// var $icon = '';
|
||||
|
||||
|
||||
/** @var boolean Redirect form to single */
|
||||
// var $redirect = false;
|
||||
|
||||
|
||||
/**
|
||||
* get_name
|
||||
*
|
||||
* This function will return the Tool's name
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_name() {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_title
|
||||
*
|
||||
* This function will return the Tool's title
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_title() {
|
||||
return $this->title;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_url
|
||||
*
|
||||
* This function will return the Tool's title
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function get_url() {
|
||||
return acf_get_admin_tool_url( $this->name );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* is_active
|
||||
*
|
||||
* This function will return true if the tool is active
|
||||
*
|
||||
* @date 19/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return bool
|
||||
*/
|
||||
|
||||
function is_active() {
|
||||
return acf_maybe_get_GET( 'tool' ) === $this->name;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the class functionality
|
||||
*
|
||||
* @type function
|
||||
* @date 27/6/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
|
||||
// initialize
|
||||
$this->initialize();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* This function will initialize the admin tool
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
/* do nothing */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* load
|
||||
*
|
||||
* This function is called during the admin page load
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function load() {
|
||||
|
||||
/* do nothing */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* html
|
||||
*
|
||||
* This function will output the metabox HTML
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function html() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* submit
|
||||
*
|
||||
* This function will run when the tool's form has been submit
|
||||
*
|
||||
* @date 10/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function submit() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,55 +1,64 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// vars
|
||||
$disabled = false;
|
||||
|
||||
|
||||
// empty
|
||||
if( empty($field['conditional_logic']) ) {
|
||||
|
||||
$disabled = true;
|
||||
if ( empty( $field['conditional_logic'] ) ) {
|
||||
|
||||
$disabled = true;
|
||||
$field['conditional_logic'] = array(
|
||||
|
||||
|
||||
// group 0
|
||||
array(
|
||||
|
||||
|
||||
// rule 0
|
||||
array()
|
||||
)
|
||||
array(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
?>
|
||||
<tr class="acf-field acf-field-true-false acf-field-setting-conditional_logic" data-type="true_false" data-name="conditional_logic">
|
||||
<td class="acf-label">
|
||||
<label><?php _e("Conditional Logic",'acf'); ?></label>
|
||||
<label><?php _e( 'Conditional Logic', 'acf' ); ?></label>
|
||||
</td>
|
||||
<td class="acf-input">
|
||||
<?php
|
||||
|
||||
acf_render_field(array(
|
||||
'type' => 'true_false',
|
||||
'name' => 'conditional_logic',
|
||||
'prefix' => $field['prefix'],
|
||||
'value' => $disabled ? 0 : 1,
|
||||
'ui' => 1,
|
||||
'class' => 'conditions-toggle',
|
||||
));
|
||||
|
||||
<?php
|
||||
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'true_false',
|
||||
'name' => 'conditional_logic',
|
||||
'prefix' => $field['prefix'],
|
||||
'value' => $disabled ? 0 : 1,
|
||||
'ui' => 1,
|
||||
'class' => 'conditions-toggle',
|
||||
)
|
||||
);
|
||||
|
||||
?>
|
||||
<div class="rule-groups" <?php if($disabled): ?>style="display:none;"<?php endif; ?>>
|
||||
<div class="rule-groups"
|
||||
<?php
|
||||
if ( $disabled ) :
|
||||
?>
|
||||
style="display:none;"<?php endif; ?>>
|
||||
|
||||
<?php foreach( $field['conditional_logic'] as $group_id => $group ):
|
||||
|
||||
<?php
|
||||
foreach ( $field['conditional_logic'] as $group_id => $group ) :
|
||||
|
||||
// validate
|
||||
if( empty($group) ) continue;
|
||||
|
||||
|
||||
if ( empty( $group ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
// $group_id must be completely different to $rule_id to avoid JS issues
|
||||
$group_id = "group_{$group_id}";
|
||||
$h4 = ($group_id == "group_0") ? __("Show this field if",'acf') : __("or",'acf');
|
||||
|
||||
$h4 = ( $group_id == 'group_0' ) ? __( 'Show this field if', 'acf' ) : __( 'or', 'acf' );
|
||||
|
||||
?>
|
||||
<div class="rule-group" data-id="<?php echo $group_id; ?>">
|
||||
|
||||
|
|
@ -57,85 +66,95 @@ if( empty($field['conditional_logic']) ) {
|
|||
|
||||
<table class="acf-table -clear">
|
||||
<tbody>
|
||||
<?php foreach( $group as $rule_id => $rule ):
|
||||
|
||||
<?php
|
||||
foreach ( $group as $rule_id => $rule ) :
|
||||
|
||||
// valid rule
|
||||
$rule = wp_parse_args( $rule, array(
|
||||
'field' => '',
|
||||
'operator' => '',
|
||||
'value' => '',
|
||||
));
|
||||
|
||||
|
||||
// vars
|
||||
$rule = wp_parse_args(
|
||||
$rule,
|
||||
array(
|
||||
'field' => '',
|
||||
'operator' => '',
|
||||
'value' => '',
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// vars
|
||||
// $group_id must be completely different to $rule_id to avoid JS issues
|
||||
$rule_id = "rule_{$rule_id}";
|
||||
$prefix = "{$field['prefix']}[conditional_logic][{$group_id}][{$rule_id}]";
|
||||
|
||||
$prefix = "{$field['prefix']}[conditional_logic][{$group_id}][{$rule_id}]";
|
||||
|
||||
// data attributes
|
||||
$attributes = array(
|
||||
'data-id' => $rule_id,
|
||||
'data-field' => $rule['field'],
|
||||
'data-operator' => $rule['operator'],
|
||||
'data-value' => $rule['value']
|
||||
'data-id' => $rule_id,
|
||||
'data-field' => $rule['field'],
|
||||
'data-operator' => $rule['operator'],
|
||||
'data-value' => $rule['value'],
|
||||
);
|
||||
|
||||
|
||||
?>
|
||||
<tr class="rule" <?php acf_esc_attr_e($attributes); ?>>
|
||||
<tr class="rule" <?php acf_esc_attr_e( $attributes ); ?>>
|
||||
<td class="param">
|
||||
<?php
|
||||
|
||||
acf_render_field(array(
|
||||
'type' => 'select',
|
||||
'prefix' => $prefix,
|
||||
'name' => 'field',
|
||||
'class' => 'condition-rule-field',
|
||||
'disabled' => $disabled,
|
||||
'value' => $rule['field'],
|
||||
'choices' => array(
|
||||
$rule['field'] => $rule['field']
|
||||
<?php
|
||||
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'select',
|
||||
'prefix' => $prefix,
|
||||
'name' => 'field',
|
||||
'class' => 'condition-rule-field',
|
||||
'disabled' => $disabled,
|
||||
'value' => $rule['field'],
|
||||
'choices' => array(
|
||||
$rule['field'] => $rule['field'],
|
||||
),
|
||||
)
|
||||
));
|
||||
|
||||
);
|
||||
|
||||
?>
|
||||
</td>
|
||||
<td class="operator">
|
||||
<?php
|
||||
|
||||
acf_render_field(array(
|
||||
'type' => 'select',
|
||||
'prefix' => $prefix,
|
||||
'name' => 'operator',
|
||||
'class' => 'condition-rule-operator',
|
||||
'disabled' => $disabled,
|
||||
'value' => $rule['operator'],
|
||||
'choices' => array(
|
||||
$rule['operator'] => $rule['operator']
|
||||
<?php
|
||||
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'select',
|
||||
'prefix' => $prefix,
|
||||
'name' => 'operator',
|
||||
'class' => 'condition-rule-operator',
|
||||
'disabled' => $disabled,
|
||||
'value' => $rule['operator'],
|
||||
'choices' => array(
|
||||
$rule['operator'] => $rule['operator'],
|
||||
),
|
||||
)
|
||||
));
|
||||
|
||||
);
|
||||
|
||||
?>
|
||||
</td>
|
||||
<td class="value">
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
// create field
|
||||
acf_render_field(array(
|
||||
'type' => 'select',
|
||||
'prefix' => $prefix,
|
||||
'name' => 'value',
|
||||
'class' => 'condition-rule-value',
|
||||
'disabled' => $disabled,
|
||||
'value' => $rule['value'],
|
||||
'choices' => array(
|
||||
$rule['value'] => $rule['value']
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'select',
|
||||
'prefix' => $prefix,
|
||||
'name' => 'value',
|
||||
'class' => 'condition-rule-value',
|
||||
'disabled' => $disabled,
|
||||
'value' => $rule['value'],
|
||||
'choices' => array(
|
||||
$rule['value'] => $rule['value'],
|
||||
),
|
||||
)
|
||||
));
|
||||
|
||||
);
|
||||
|
||||
?>
|
||||
</td>
|
||||
<td class="add">
|
||||
<a href="#" class="button add-conditional-rule"><?php _e("and",'acf'); ?></a>
|
||||
<a href="#" class="button add-conditional-rule"><?php _e( 'and', 'acf' ); ?></a>
|
||||
</td>
|
||||
<td class="remove">
|
||||
<a href="#" class="acf-icon -minus remove-conditional-rule"></a>
|
||||
|
|
@ -148,11 +167,11 @@ if( empty($field['conditional_logic']) ) {
|
|||
</div>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<h4><?php _e("or",'acf'); ?></h4>
|
||||
<h4><?php _e( 'or', 'acf' ); ?></h4>
|
||||
|
||||
<a href="#" class="button add-conditional-group"><?php _e("Add rule group",'acf'); ?></a>
|
||||
<a href="#" class="button add-conditional-group"><?php _e( 'Add rule group', 'acf' ); ?></a>
|
||||
|
||||
</div>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -1,55 +1,62 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// Define input name prefix using unique identifier.
|
||||
$input_prefix = 'acf_fields[' . $field['ID'] . ']';
|
||||
$input_id = acf_idify( $input_prefix );
|
||||
$input_id = acf_idify( $input_prefix );
|
||||
|
||||
// Update field props.
|
||||
$field['prefix'] = $input_prefix;
|
||||
|
||||
// Elements.
|
||||
$div_attrs = array(
|
||||
'class' => 'acf-field-object acf-field-object-' . acf_slugify( $field['type'] ),
|
||||
'data-id' => $field['ID'],
|
||||
'data-key' => $field['key'],
|
||||
'data-type' => $field['type'],
|
||||
'class' => 'acf-field-object acf-field-object-' . acf_slugify( $field['type'] ),
|
||||
'data-id' => $field['ID'],
|
||||
'data-key' => $field['key'],
|
||||
'data-type' => $field['type'],
|
||||
);
|
||||
|
||||
// Misc template vars.
|
||||
$field_label = acf_get_field_label( $field, 'admin' );
|
||||
$field_label = acf_get_field_label( $field, 'admin' );
|
||||
$field_type_label = acf_get_field_type_label( $field['type'] );
|
||||
|
||||
?>
|
||||
<div <?php echo acf_esc_attr( $div_attrs ); ?>>
|
||||
|
||||
<div class="meta">
|
||||
<?php
|
||||
<?php
|
||||
$meta_inputs = array(
|
||||
'ID' => $field['ID'],
|
||||
'key' => $field['key'],
|
||||
'parent' => $field['parent'],
|
||||
'menu_order' => $i,
|
||||
'save' => ''
|
||||
'ID' => $field['ID'],
|
||||
'key' => $field['key'],
|
||||
'parent' => $field['parent'],
|
||||
'menu_order' => $i,
|
||||
'save' => '',
|
||||
);
|
||||
foreach( $meta_inputs as $k => $v ):
|
||||
acf_hidden_input(array( 'name' => $input_prefix . '[' . $k . ']', 'value' => $v, 'id' => $input_id . '-' . $k ));
|
||||
endforeach; ?>
|
||||
foreach ( $meta_inputs as $k => $v ) :
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'name' => $input_prefix . '[' . $k . ']',
|
||||
'value' => $v,
|
||||
'id' => $input_id . '-' . $k,
|
||||
)
|
||||
);
|
||||
endforeach;
|
||||
?>
|
||||
</div>
|
||||
|
||||
<div class="handle">
|
||||
<ul class="acf-hl acf-tbody">
|
||||
<li class="li-field-order">
|
||||
<span class="acf-icon acf-sortable-handle" title="<?php _e('Drag to reorder','acf'); ?>"><?php echo ($i + 1); ?></span>
|
||||
<span class="acf-icon acf-sortable-handle" title="<?php _e( 'Drag to reorder', 'acf' ); ?>"><?php echo ( $i + 1 ); ?></span>
|
||||
</li>
|
||||
<li class="li-field-label">
|
||||
<strong>
|
||||
<a class="edit-field" title="<?php _e("Edit field",'acf'); ?>" href="#"><?php echo acf_esc_html( $field_label ); ?></a>
|
||||
<a class="edit-field" title="<?php _e( 'Edit field', 'acf' ); ?>" href="#"><?php echo acf_esc_html( $field_label ); ?></a>
|
||||
</strong>
|
||||
<div class="row-options">
|
||||
<a class="edit-field" title="<?php _e("Edit field",'acf'); ?>" href="#"><?php _e("Edit",'acf'); ?></a>
|
||||
<a class="duplicate-field" title="<?php _e("Duplicate field",'acf'); ?>" href="#"><?php _e("Duplicate",'acf'); ?></a>
|
||||
<a class="move-field" title="<?php _e("Move field to another group",'acf'); ?>" href="#"><?php _e("Move",'acf'); ?></a>
|
||||
<a class="delete-field" title="<?php _e("Delete field",'acf'); ?>" href="#"><?php _e("Delete",'acf'); ?></a>
|
||||
<a class="edit-field" title="<?php _e( 'Edit field', 'acf' ); ?>" href="#"><?php _e( 'Edit', 'acf' ); ?></a>
|
||||
<a class="duplicate-field" title="<?php _e( 'Duplicate field', 'acf' ); ?>" href="#"><?php _e( 'Duplicate', 'acf' ); ?></a>
|
||||
<a class="move-field" title="<?php _e( 'Move field to another group', 'acf' ); ?>" href="#"><?php _e( 'Move', 'acf' ); ?></a>
|
||||
<a class="delete-field" title="<?php _e( 'Delete field', 'acf' ); ?>" href="#"><?php _e( 'Delete', 'acf' ); ?></a>
|
||||
</div>
|
||||
</li>
|
||||
<?php // whitespace before field name looks odd but fixes chrome bug selecting all text in row ?>
|
||||
|
|
@ -62,121 +69,150 @@ $field_type_label = acf_get_field_type_label( $field['type'] );
|
|||
<div class="settings">
|
||||
<table class="acf-table">
|
||||
<tbody class="acf-field-settings">
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
// label
|
||||
acf_render_field_setting($field, array(
|
||||
'label' => __('Field Label','acf'),
|
||||
'instructions' => __('This is the name which will appear on the EDIT page','acf'),
|
||||
'name' => 'label',
|
||||
'type' => 'text',
|
||||
'class' => 'field-label'
|
||||
), true);
|
||||
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Field Label', 'acf' ),
|
||||
'instructions' => __( 'This is the name which will appear on the EDIT page', 'acf' ),
|
||||
'name' => 'label',
|
||||
'type' => 'text',
|
||||
'class' => 'field-label',
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
|
||||
// name
|
||||
acf_render_field_setting($field, array(
|
||||
'label' => __('Field Name','acf'),
|
||||
'instructions' => __('Single word, no spaces. Underscores and dashes allowed','acf'),
|
||||
'name' => 'name',
|
||||
'type' => 'text',
|
||||
'class' => 'field-name'
|
||||
), true);
|
||||
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Field Name', 'acf' ),
|
||||
'instructions' => __( 'Single word, no spaces. Underscores and dashes allowed', 'acf' ),
|
||||
'name' => 'name',
|
||||
'type' => 'text',
|
||||
'class' => 'field-name',
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
|
||||
// type
|
||||
acf_render_field_setting($field, array(
|
||||
'label' => __('Field Type','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'type',
|
||||
'choices' => acf_get_grouped_field_types(),
|
||||
'class' => 'field-type'
|
||||
), true);
|
||||
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Field Type', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'type',
|
||||
'choices' => acf_get_grouped_field_types(),
|
||||
'class' => 'field-type',
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
|
||||
// instructions
|
||||
acf_render_field_setting($field, array(
|
||||
'label' => __('Instructions','acf'),
|
||||
'instructions' => __('Instructions for authors. Shown when submitting data','acf'),
|
||||
'type' => 'textarea',
|
||||
'name' => 'instructions',
|
||||
'rows' => 5
|
||||
), true);
|
||||
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Instructions', 'acf' ),
|
||||
'instructions' => __( 'Instructions for authors. Shown when submitting data', 'acf' ),
|
||||
'type' => 'textarea',
|
||||
'name' => 'instructions',
|
||||
'rows' => 5,
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
|
||||
// required
|
||||
acf_render_field_setting($field, array(
|
||||
'label' => __('Required?','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'true_false',
|
||||
'name' => 'required',
|
||||
'ui' => 1,
|
||||
'class' => 'field-required'
|
||||
), true);
|
||||
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Required?', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'true_false',
|
||||
'name' => 'required',
|
||||
'ui' => 1,
|
||||
'class' => 'field-required',
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
|
||||
// 3rd party settings
|
||||
do_action('acf/render_field_settings', $field);
|
||||
|
||||
|
||||
do_action( 'acf/render_field_settings', $field );
|
||||
|
||||
|
||||
// type specific settings
|
||||
do_action("acf/render_field_settings/type={$field['type']}", $field);
|
||||
|
||||
|
||||
do_action( "acf/render_field_settings/type={$field['type']}", $field );
|
||||
|
||||
|
||||
// conditional logic
|
||||
acf_get_view('field-group-field-conditional-logic', array( 'field' => $field ));
|
||||
|
||||
|
||||
acf_get_view( 'field-group-field-conditional-logic', array( 'field' => $field ) );
|
||||
|
||||
|
||||
// wrapper
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Wrapper Attributes','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'width',
|
||||
'prefix' => $field['prefix'] . '[wrapper]',
|
||||
'value' => $field['wrapper']['width'],
|
||||
'prepend' => __('width', 'acf'),
|
||||
'append' => '%',
|
||||
'wrapper' => array(
|
||||
'data-name' => 'wrapper',
|
||||
'class' => 'acf-field-setting-wrapper'
|
||||
)
|
||||
), 'tr');
|
||||
|
||||
acf_render_field_wrap(array(
|
||||
'label' => '',
|
||||
'instructions' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'class',
|
||||
'prefix' => $field['prefix'] . '[wrapper]',
|
||||
'value' => $field['wrapper']['class'],
|
||||
'prepend' => __('class', 'acf'),
|
||||
'wrapper' => array(
|
||||
'data-append' => 'wrapper'
|
||||
)
|
||||
), 'tr');
|
||||
|
||||
acf_render_field_wrap(array(
|
||||
'label' => '',
|
||||
'instructions' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'id',
|
||||
'prefix' => $field['prefix'] . '[wrapper]',
|
||||
'value' => $field['wrapper']['id'],
|
||||
'prepend' => __('id', 'acf'),
|
||||
'wrapper' => array(
|
||||
'data-append' => 'wrapper'
|
||||
)
|
||||
), 'tr');
|
||||
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Wrapper Attributes', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'width',
|
||||
'prefix' => $field['prefix'] . '[wrapper]',
|
||||
'value' => $field['wrapper']['width'],
|
||||
'prepend' => __( 'width', 'acf' ),
|
||||
'append' => '%',
|
||||
'wrapper' => array(
|
||||
'data-name' => 'wrapper',
|
||||
'class' => 'acf-field-setting-wrapper',
|
||||
),
|
||||
),
|
||||
'tr'
|
||||
);
|
||||
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => '',
|
||||
'instructions' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'class',
|
||||
'prefix' => $field['prefix'] . '[wrapper]',
|
||||
'value' => $field['wrapper']['class'],
|
||||
'prepend' => __( 'class', 'acf' ),
|
||||
'wrapper' => array(
|
||||
'data-append' => 'wrapper',
|
||||
),
|
||||
),
|
||||
'tr'
|
||||
);
|
||||
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => '',
|
||||
'instructions' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'id',
|
||||
'prefix' => $field['prefix'] . '[wrapper]',
|
||||
'value' => $field['wrapper']['id'],
|
||||
'prepend' => __( 'id', 'acf' ),
|
||||
'wrapper' => array(
|
||||
'data-append' => 'wrapper',
|
||||
),
|
||||
),
|
||||
'tr'
|
||||
);
|
||||
|
||||
?>
|
||||
<tr class="acf-field acf-field-save">
|
||||
<td class="acf-label"></td>
|
||||
<td class="acf-input">
|
||||
<ul class="acf-hl">
|
||||
<li>
|
||||
<a class="button edit-field" title="<?php _e("Close Field",'acf'); ?>" href="#"><?php _e("Close Field",'acf'); ?></a>
|
||||
<a class="button edit-field" title="<?php _e( 'Close Field', 'acf' ); ?>" href="#"><?php _e( 'Close Field', 'acf' ); ?></a>
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
|
|
@ -185,4 +221,4 @@ $field_type_label = acf_get_field_type_label( $field['type'] );
|
|||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,52 +1,76 @@
|
|||
<div class="acf-field-list-wrap">
|
||||
|
||||
<ul class="acf-hl acf-thead">
|
||||
<li class="li-field-order"><?php _e('Order','acf'); ?></li>
|
||||
<li class="li-field-label"><?php _e('Label','acf'); ?></li>
|
||||
<li class="li-field-name"><?php _e('Name','acf'); ?></li>
|
||||
<li class="li-field-key"><?php _e('Key','acf'); ?></li>
|
||||
<li class="li-field-type"><?php _e('Type','acf'); ?></li>
|
||||
<li class="li-field-order"><?php _e( 'Order', 'acf' ); ?></li>
|
||||
<li class="li-field-label"><?php _e( 'Label', 'acf' ); ?></li>
|
||||
<li class="li-field-name"><?php _e( 'Name', 'acf' ); ?></li>
|
||||
<li class="li-field-key"><?php _e( 'Key', 'acf' ); ?></li>
|
||||
<li class="li-field-type"><?php _e( 'Type', 'acf' ); ?></li>
|
||||
</ul>
|
||||
|
||||
<div class="acf-field-list<?php if( !$fields ){ echo ' -empty'; } ?>">
|
||||
<div class="acf-field-list
|
||||
<?php
|
||||
if ( ! $fields ) {
|
||||
echo ' -empty'; }
|
||||
?>
|
||||
">
|
||||
|
||||
<div class="no-fields-message">
|
||||
<?php _e("No fields. Click the <strong>+ Add Field</strong> button to create your first field.",'acf'); ?>
|
||||
<?php _e( 'No fields. Click the <strong>+ Add Field</strong> button to create your first field.', 'acf' ); ?>
|
||||
</div>
|
||||
|
||||
<?php if( $fields ):
|
||||
|
||||
foreach( $fields as $i => $field ):
|
||||
|
||||
acf_get_view('field-group-field', array( 'field' => $field, 'i' => $i ));
|
||||
|
||||
<?php
|
||||
if ( $fields ) :
|
||||
|
||||
foreach ( $fields as $i => $field ) :
|
||||
|
||||
acf_get_view(
|
||||
'field-group-field',
|
||||
array(
|
||||
'field' => $field,
|
||||
'i' => $i,
|
||||
)
|
||||
);
|
||||
|
||||
endforeach;
|
||||
|
||||
endif; ?>
|
||||
|
||||
endif;
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
<ul class="acf-hl acf-tfoot">
|
||||
<li class="acf-fr">
|
||||
<a href="#" class="button button-primary button-large add-field"><?php _e('+ Add Field','acf'); ?></a>
|
||||
<a href="#" class="button button-primary button-large add-field"><?php _e( '+ Add Field', 'acf' ); ?></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<?php if( !$parent ):
|
||||
|
||||
<?php
|
||||
if ( ! $parent ) :
|
||||
|
||||
// get clone
|
||||
$clone = acf_get_valid_field(array(
|
||||
'ID' => 'acfcloneindex',
|
||||
'key' => 'acfcloneindex',
|
||||
'label' => __('New Field','acf'),
|
||||
'name' => 'new_field',
|
||||
'type' => 'text'
|
||||
));
|
||||
|
||||
$clone = acf_get_valid_field(
|
||||
array(
|
||||
'ID' => 'acfcloneindex',
|
||||
'key' => 'acfcloneindex',
|
||||
'label' => __( 'New Field', 'acf' ),
|
||||
'name' => 'new_field',
|
||||
'type' => 'text',
|
||||
)
|
||||
);
|
||||
|
||||
?>
|
||||
<script type="text/html" id="tmpl-acf-field">
|
||||
<?php acf_get_view('field-group-field', array( 'field' => $clone, 'i' => 0 )); ?>
|
||||
<?php
|
||||
acf_get_view(
|
||||
'field-group-field',
|
||||
array(
|
||||
'field' => $clone,
|
||||
'i' => 0,
|
||||
)
|
||||
);
|
||||
?>
|
||||
</script>
|
||||
<?php endif;?>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -6,29 +6,36 @@ global $field_group;
|
|||
?>
|
||||
<div class="acf-field">
|
||||
<div class="acf-label">
|
||||
<label><?php _e("Rules",'acf'); ?></label>
|
||||
<p class="description"><?php _e("Create a set of rules to determine which edit screens will use these advanced custom fields",'acf'); ?></p>
|
||||
<label><?php _e( 'Rules', 'acf' ); ?></label>
|
||||
<p class="description"><?php _e( 'Create a set of rules to determine which edit screens will use these advanced custom fields', 'acf' ); ?></p>
|
||||
</div>
|
||||
<div class="acf-input">
|
||||
<div class="rule-groups">
|
||||
|
||||
<?php foreach( $field_group['location'] as $i => $group ):
|
||||
|
||||
<?php
|
||||
foreach ( $field_group['location'] as $i => $group ) :
|
||||
|
||||
// bail ealry if no group
|
||||
if( empty($group) ) return;
|
||||
|
||||
|
||||
if ( empty( $group ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// view
|
||||
acf_get_view('html-location-group', array(
|
||||
'group' => $group,
|
||||
'group_id' => "group_{$i}"
|
||||
));
|
||||
acf_get_view(
|
||||
'html-location-group',
|
||||
array(
|
||||
'group' => $group,
|
||||
'group_id' => "group_{$i}",
|
||||
)
|
||||
);
|
||||
|
||||
endforeach;
|
||||
?>
|
||||
|
||||
endforeach; ?>
|
||||
<h4><?php _e( 'or', 'acf' ); ?></h4>
|
||||
|
||||
<h4><?php _e("or",'acf'); ?></h4>
|
||||
|
||||
<a href="#" class="button add-location-group"><?php _e("Add rule group",'acf'); ?></a>
|
||||
<a href="#" class="button add-location-group"><?php _e( 'Add rule group', 'acf' ); ?></a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -42,4 +49,4 @@ if( typeof acf !== 'undefined' ) {
|
|||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -2,143 +2,159 @@
|
|||
|
||||
// global
|
||||
global $field_group;
|
||||
|
||||
|
||||
|
||||
|
||||
// active
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Active','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'true_false',
|
||||
'name' => 'active',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['active'],
|
||||
'ui' => 1,
|
||||
//'ui_on_text' => __('Active', 'acf'),
|
||||
//'ui_off_text' => __('Inactive', 'acf'),
|
||||
));
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Active', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'true_false',
|
||||
'name' => 'active',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['active'],
|
||||
'ui' => 1,
|
||||
// 'ui_on_text' => __('Active', 'acf'),
|
||||
// 'ui_off_text' => __('Inactive', 'acf'),
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// style
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Style','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'style',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['style'],
|
||||
'choices' => array(
|
||||
'default' => __("Standard (WP metabox)",'acf'),
|
||||
'seamless' => __("Seamless (no metabox)",'acf'),
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Style', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'style',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['style'],
|
||||
'choices' => array(
|
||||
'default' => __( 'Standard (WP metabox)', 'acf' ),
|
||||
'seamless' => __( 'Seamless (no metabox)', 'acf' ),
|
||||
),
|
||||
)
|
||||
));
|
||||
);
|
||||
|
||||
|
||||
// position
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Position','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'position',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['position'],
|
||||
'choices' => array(
|
||||
'acf_after_title' => __("High (after title)",'acf'),
|
||||
'normal' => __("Normal (after content)",'acf'),
|
||||
'side' => __("Side",'acf'),
|
||||
),
|
||||
'default_value' => 'normal'
|
||||
));
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Position', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'position',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['position'],
|
||||
'choices' => array(
|
||||
'acf_after_title' => __( 'High (after title)', 'acf' ),
|
||||
'normal' => __( 'Normal (after content)', 'acf' ),
|
||||
'side' => __( 'Side', 'acf' ),
|
||||
),
|
||||
'default_value' => 'normal',
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// label_placement
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Label placement','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'label_placement',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['label_placement'],
|
||||
'choices' => array(
|
||||
'top' => __("Top aligned",'acf'),
|
||||
'left' => __("Left aligned",'acf'),
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Label placement', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'label_placement',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['label_placement'],
|
||||
'choices' => array(
|
||||
'top' => __( 'Top aligned', 'acf' ),
|
||||
'left' => __( 'Left aligned', 'acf' ),
|
||||
),
|
||||
)
|
||||
));
|
||||
);
|
||||
|
||||
|
||||
// instruction_placement
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Instruction placement','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'instruction_placement',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['instruction_placement'],
|
||||
'choices' => array(
|
||||
'label' => __("Below labels",'acf'),
|
||||
'field' => __("Below fields",'acf'),
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Instruction placement', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'instruction_placement',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['instruction_placement'],
|
||||
'choices' => array(
|
||||
'label' => __( 'Below labels', 'acf' ),
|
||||
'field' => __( 'Below fields', 'acf' ),
|
||||
),
|
||||
)
|
||||
));
|
||||
);
|
||||
|
||||
|
||||
// menu_order
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Order No.','acf'),
|
||||
'instructions' => __('Field groups with a lower order will appear first','acf'),
|
||||
'type' => 'number',
|
||||
'name' => 'menu_order',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['menu_order'],
|
||||
));
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Order No.', 'acf' ),
|
||||
'instructions' => __( 'Field groups with a lower order will appear first', 'acf' ),
|
||||
'type' => 'number',
|
||||
'name' => 'menu_order',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['menu_order'],
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// description
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Description','acf'),
|
||||
'instructions' => __('Shown in field group list','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'description',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['description'],
|
||||
));
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Description', 'acf' ),
|
||||
'instructions' => __( 'Shown in field group list', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'description',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['description'],
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// hide on screen
|
||||
$choices = array(
|
||||
'permalink' => __("Permalink", 'acf'),
|
||||
'the_content' => __("Content Editor",'acf'),
|
||||
'excerpt' => __("Excerpt", 'acf'),
|
||||
'custom_fields' => __("Custom Fields", 'acf'),
|
||||
'discussion' => __("Discussion", 'acf'),
|
||||
'comments' => __("Comments", 'acf'),
|
||||
'revisions' => __("Revisions", 'acf'),
|
||||
'slug' => __("Slug", 'acf'),
|
||||
'author' => __("Author", 'acf'),
|
||||
'format' => __("Format", 'acf'),
|
||||
'page_attributes' => __("Page Attributes", 'acf'),
|
||||
'featured_image' => __("Featured Image", 'acf'),
|
||||
'categories' => __("Categories", 'acf'),
|
||||
'tags' => __("Tags", 'acf'),
|
||||
'send-trackbacks' => __("Send Trackbacks", 'acf'),
|
||||
'permalink' => __( 'Permalink', 'acf' ),
|
||||
'the_content' => __( 'Content Editor', 'acf' ),
|
||||
'excerpt' => __( 'Excerpt', 'acf' ),
|
||||
'custom_fields' => __( 'Custom Fields', 'acf' ),
|
||||
'discussion' => __( 'Discussion', 'acf' ),
|
||||
'comments' => __( 'Comments', 'acf' ),
|
||||
'revisions' => __( 'Revisions', 'acf' ),
|
||||
'slug' => __( 'Slug', 'acf' ),
|
||||
'author' => __( 'Author', 'acf' ),
|
||||
'format' => __( 'Format', 'acf' ),
|
||||
'page_attributes' => __( 'Page Attributes', 'acf' ),
|
||||
'featured_image' => __( 'Featured Image', 'acf' ),
|
||||
'categories' => __( 'Categories', 'acf' ),
|
||||
'tags' => __( 'Tags', 'acf' ),
|
||||
'send-trackbacks' => __( 'Send Trackbacks', 'acf' ),
|
||||
);
|
||||
if( acf_get_setting('remove_wp_meta_box') ) {
|
||||
unset( $choices['custom_fields'] );
|
||||
if ( acf_get_setting( 'remove_wp_meta_box' ) ) {
|
||||
unset( $choices['custom_fields'] );
|
||||
}
|
||||
|
||||
acf_render_field_wrap(array(
|
||||
'label' => __('Hide on screen','acf'),
|
||||
'instructions' => __('<b>Select</b> items to <b>hide</b> them from the edit screen.','acf') . '<br /><br />' . __("If multiple field groups appear on an edit screen, the first field group's options will be used (the one with the lowest order number)",'acf'),
|
||||
'type' => 'checkbox',
|
||||
'name' => 'hide_on_screen',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['hide_on_screen'],
|
||||
'toggle' => true,
|
||||
'choices' => $choices
|
||||
));
|
||||
acf_render_field_wrap(
|
||||
array(
|
||||
'label' => __( 'Hide on screen', 'acf' ),
|
||||
'instructions' => __( '<b>Select</b> items to <b>hide</b> them from the edit screen.', 'acf' ) . '<br /><br />' . __( "If multiple field groups appear on an edit screen, the first field group's options will be used (the one with the lowest order number)", 'acf' ),
|
||||
'type' => 'checkbox',
|
||||
'name' => 'hide_on_screen',
|
||||
'prefix' => 'acf_field_group',
|
||||
'value' => $field_group['hide_on_screen'],
|
||||
'toggle' => true,
|
||||
'choices' => $choices,
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
// 3rd party settings
|
||||
do_action('acf/render_field_group_settings', $field_group);
|
||||
|
||||
do_action( 'acf/render_field_group_settings', $field_group );
|
||||
|
||||
?>
|
||||
<div class="acf-hidden">
|
||||
<input type="hidden" name="acf_field_group[key]" value="<?php echo $field_group['key']; ?>" />
|
||||
|
|
@ -152,4 +168,4 @@ if( typeof acf !== 'undefined' ) {
|
|||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,14 @@
|
|||
<?php
|
||||
<?php
|
||||
/**
|
||||
* The template for displaying admin navigation.
|
||||
* The template for displaying admin navigation.
|
||||
*
|
||||
* @date 27/3/20
|
||||
* @since 5.9.0
|
||||
* @date 27/3/20
|
||||
* @since 5.9.0
|
||||
*/
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit;
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
global $submenu, $parent_file, $submenu_file, $plugin_page, $pagenow;
|
||||
|
||||
|
|
@ -15,37 +17,37 @@ $parent_slug = 'edit.php?post_type=acf-field-group';
|
|||
|
||||
// Generate array of navigation items.
|
||||
$tabs = array();
|
||||
if( isset($submenu[ $parent_slug ]) ) {
|
||||
foreach( $submenu[ $parent_slug ] as $i => $sub_item ) {
|
||||
|
||||
if ( isset( $submenu[ $parent_slug ] ) ) {
|
||||
foreach ( $submenu[ $parent_slug ] as $i => $sub_item ) {
|
||||
|
||||
// Check user can access page.
|
||||
if ( !current_user_can( $sub_item[1] ) ) {
|
||||
if ( ! current_user_can( $sub_item[1] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Ignore "Add New".
|
||||
if( $i === 1 ) {
|
||||
if ( $i === 1 ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Define tab.
|
||||
$tab = array(
|
||||
'text' => $sub_item[0],
|
||||
'url' => $sub_item[2]
|
||||
'text' => $sub_item[0],
|
||||
'url' => $sub_item[2],
|
||||
);
|
||||
|
||||
|
||||
// Convert submenu slug "test" to "$parent_slug&page=test".
|
||||
if( !strpos($sub_item[2], '.php') ) {
|
||||
if ( ! strpos( $sub_item[2], '.php' ) ) {
|
||||
$tab['url'] = add_query_arg( array( 'page' => $sub_item[2] ), $parent_slug );
|
||||
}
|
||||
|
||||
|
||||
// Detect active state.
|
||||
if( $submenu_file === $sub_item[2] || $plugin_page === $sub_item[2] ) {
|
||||
if ( $submenu_file === $sub_item[2] || $plugin_page === $sub_item[2] ) {
|
||||
$tab['is_active'] = true;
|
||||
}
|
||||
|
||||
|
||||
// Special case for "Add New" page.
|
||||
if( $i === 0 && $submenu_file === 'post-new.php?post_type=acf-field-group' ) {
|
||||
if ( $i === 0 && $submenu_file === 'post-new.php?post_type=acf-field-group' ) {
|
||||
$tab['is_active'] = true;
|
||||
}
|
||||
$tabs[] = $tab;
|
||||
|
|
@ -55,35 +57,37 @@ if( isset($submenu[ $parent_slug ]) ) {
|
|||
/**
|
||||
* Filters the admin navigation tabs.
|
||||
*
|
||||
* @date 27/3/20
|
||||
* @since 5.9.0
|
||||
* @date 27/3/20
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @param array $tabs The array of navigation tabs.
|
||||
* @param array $tabs The array of navigation tabs.
|
||||
*/
|
||||
$tabs = apply_filters( 'acf/admin/toolbar', $tabs );
|
||||
|
||||
// Bail early if set to false.
|
||||
if( $tabs === false ) {
|
||||
if ( $tabs === false ) {
|
||||
return;
|
||||
}
|
||||
|
||||
?>
|
||||
<div class="acf-admin-toolbar">
|
||||
<h2><i class="acf-tab-icon dashicons dashicons-welcome-widgets-menus"></i> <?php echo acf_get_setting('name'); ?></h2>
|
||||
<?php foreach( $tabs as $tab ) {
|
||||
<h2><i class="acf-tab-icon dashicons dashicons-welcome-widgets-menus"></i> <?php echo acf_get_setting( 'name' ); ?></h2>
|
||||
<?php
|
||||
foreach ( $tabs as $tab ) {
|
||||
printf(
|
||||
'<a class="acf-tab%s" href="%s">%s</a>',
|
||||
!empty( $tab['is_active'] ) ? ' is-active' : '',
|
||||
! empty( $tab['is_active'] ) ? ' is-active' : '',
|
||||
esc_url( $tab['url'] ),
|
||||
acf_esc_html( $tab['text'] )
|
||||
);
|
||||
} ?>
|
||||
}
|
||||
?>
|
||||
|
||||
<?php if ( ! defined( 'ACF_PRO' ) || ! ACF_PRO ) : ?>
|
||||
<a target="_blank" href="https://www.advancedcustomfields.com/pro/?utm_source=ACF%2BFree&utm_medium=insideplugin&utm_campaign=ACF%2Bupgrade" class="btn-upgrade">
|
||||
<img src="<?php echo acf_get_url('assets/images/icon-upgrade-pro.svg' ); ?>" />
|
||||
<p><?php _e('Upgrade to Pro', 'acf'); ?></p>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
<?php if ( ! defined( 'ACF_PRO' ) || ! ACF_PRO ) : ?>
|
||||
<a target="_blank" href="https://www.advancedcustomfields.com/pro/?utm_source=ACF%2BFree&utm_medium=insideplugin&utm_campaign=ACF%2Bupgrade" class="btn-upgrade">
|
||||
<img src="<?php echo acf_get_url( 'assets/images/icon-upgrade-pro.svg' ); ?>" />
|
||||
<p><?php _e( 'Upgrade to Pro', 'acf' ); ?></p>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Network Admin Database Upgrade
|
||||
*
|
||||
* Shows the databse upgrade process.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
* @param void
|
||||
*/
|
||||
* Network Admin Database Upgrade
|
||||
*
|
||||
* Shows the databse upgrade process.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
* @param void
|
||||
*/
|
||||
|
||||
?>
|
||||
<style type="text/css">
|
||||
|
|
@ -21,10 +21,10 @@
|
|||
</style>
|
||||
<div id="acf-upgrade-wrap" class="wrap">
|
||||
|
||||
<h1><?php _e("Upgrade Database", 'acf'); ?></h1>
|
||||
<h1><?php _e( 'Upgrade Database', 'acf' ); ?></h1>
|
||||
|
||||
<p><?php echo sprintf( __("The following sites require a DB upgrade. Check the ones you want to update and then click %s.", 'acf'), '"' . __('Upgrade Sites', 'acf') . '"'); ?></p>
|
||||
<p><input type="submit" name="upgrade" value="<?php _e('Upgrade Sites', 'acf'); ?>" class="button" id="upgrade-sites"></p>
|
||||
<p><?php echo sprintf( __( 'The following sites require a DB upgrade. Check the ones you want to update and then click %s.', 'acf' ), '"' . __( 'Upgrade Sites', 'acf' ) . '"' ); ?></p>
|
||||
<p><input type="submit" name="upgrade" value="<?php _e( 'Upgrade Sites', 'acf' ); ?>" class="button" id="upgrade-sites"></p>
|
||||
|
||||
<table class="wp-list-table widefat">
|
||||
<thead>
|
||||
|
|
@ -33,9 +33,9 @@
|
|||
<input type="checkbox" id="sites-select-all">
|
||||
</td>
|
||||
<th class="manage-column" scope="col" style="width:33%;">
|
||||
<label for="sites-select-all"><?php _e("Site", 'acf'); ?></label>
|
||||
<label for="sites-select-all"><?php _e( 'Site', 'acf' ); ?></label>
|
||||
</th>
|
||||
<th><?php _e("Description", 'acf'); ?></th>
|
||||
<th><?php _e( 'Description', 'acf' ); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
|
|
@ -44,53 +44,57 @@
|
|||
<input type="checkbox" id="sites-select-all-2">
|
||||
</td>
|
||||
<th class="manage-column" scope="col">
|
||||
<label for="sites-select-all-2"><?php _e("Site", 'acf'); ?></label>
|
||||
<label for="sites-select-all-2"><?php _e( 'Site', 'acf' ); ?></label>
|
||||
</th>
|
||||
<th><?php _e("Description", 'acf'); ?></th>
|
||||
<th><?php _e( 'Description', 'acf' ); ?></th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody id="the-list">
|
||||
<?php
|
||||
|
||||
|
||||
$sites = acf_get_sites();
|
||||
if( $sites ):
|
||||
foreach( $sites as $i => $site ):
|
||||
|
||||
// switch blog
|
||||
switch_to_blog( $site['blog_id'] );
|
||||
|
||||
?>
|
||||
<tr<?php if( $i % 2 == 0 ): ?> class="alternate"<?php endif; ?>>
|
||||
if ( $sites ) :
|
||||
foreach ( $sites as $i => $site ) :
|
||||
|
||||
// switch blog
|
||||
switch_to_blog( $site['blog_id'] );
|
||||
|
||||
?>
|
||||
<tr
|
||||
<?php
|
||||
if ( $i % 2 == 0 ) :
|
||||
?>
|
||||
class="alternate"<?php endif; ?>>
|
||||
<th class="check-column" scope="row">
|
||||
<?php if( acf_has_upgrade() ): ?>
|
||||
<?php if ( acf_has_upgrade() ) : ?>
|
||||
<input type="checkbox" value="<?php echo $site['blog_id']; ?>" name="checked[]">
|
||||
<?php endif; ?>
|
||||
</th>
|
||||
<td>
|
||||
<strong><?php echo get_bloginfo('name'); ?></strong><br /><?php echo home_url(); ?>
|
||||
<strong><?php echo get_bloginfo( 'name' ); ?></strong><br /><?php echo home_url(); ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if( acf_has_upgrade() ): ?>
|
||||
<span class="response"><?php printf(__('Site requires database upgrade from %s to %s', 'acf'), acf_get_db_version(), ACF_VERSION); ?></span>
|
||||
<?php else: ?>
|
||||
<?php _e("Site is up to date", 'acf'); ?>
|
||||
<?php if ( acf_has_upgrade() ) : ?>
|
||||
<span class="response"><?php printf( __( 'Site requires database upgrade from %1$s to %2$s', 'acf' ), acf_get_db_version(), ACF_VERSION ); ?></span>
|
||||
<?php else : ?>
|
||||
<?php _e( 'Site is up to date', 'acf' ); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
|
||||
// restore
|
||||
restore_current_blog();
|
||||
|
||||
<?php
|
||||
|
||||
// restore
|
||||
restore_current_blog();
|
||||
|
||||
endforeach;
|
||||
endif;
|
||||
|
||||
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p><input type="submit" name="upgrade" value="<?php _e('Upgrade Sites', 'acf'); ?>" class="button" id="upgrade-sites-2"></p>
|
||||
<p class="show-on-complete"><?php echo sprintf( __('Database Upgrade complete. <a href="%s">Return to network dashboard</a>', 'acf'), network_admin_url() ); ?></p>
|
||||
<p><input type="submit" name="upgrade" value="<?php _e( 'Upgrade Sites', 'acf' ); ?>" class="button" id="upgrade-sites-2"></p>
|
||||
<p class="show-on-complete"><?php echo sprintf( __( 'Database Upgrade complete. <a href="%s">Return to network dashboard</a>', 'acf' ), network_admin_url() ); ?></p>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function($) {
|
||||
|
|
@ -110,11 +114,11 @@
|
|||
|
||||
// bail early if no selection
|
||||
if( !this.$inputs().length ) {
|
||||
return alert('<?php _e('Please select at least one site to upgrade.', 'acf'); ?>');
|
||||
return alert('<?php _e( 'Please select at least one site to upgrade.', 'acf' ); ?>');
|
||||
}
|
||||
|
||||
// confirm action
|
||||
if( !confirm("<?php _e('It is strongly recommended that you backup your database before proceeding. Are you sure you wish to run the updater now?', 'acf'); ?>") ) {
|
||||
if( !confirm("<?php _e( 'It is strongly recommended that you backup your database before proceeding. Are you sure you wish to run the updater now?', 'acf' ); ?>") ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -141,11 +145,11 @@
|
|||
var success = false;
|
||||
|
||||
// show loading
|
||||
$row.find('.response').html('<i class="acf-loading"></i></span> <?php printf(__('Upgrading data to version %s', 'acf'), ACF_VERSION); ?>');
|
||||
$row.find('.response').html('<i class="acf-loading"></i></span> <?php printf( __( 'Upgrading data to version %s', 'acf' ), ACF_VERSION ); ?>');
|
||||
|
||||
// send ajax request to upgrade DB
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
data: acf.prepareForAjax({
|
||||
|
|
@ -155,10 +159,10 @@
|
|||
success: function( json ){
|
||||
success = true;
|
||||
$input.remove();
|
||||
text = '<?php _e('Upgrade complete.', 'acf'); ?>';
|
||||
text = '<?php _e( 'Upgrade complete.', 'acf' ); ?>';
|
||||
},
|
||||
error: function( jqXHR, textStatus, errorThrown ){
|
||||
text = '<?php _e('Upgrade failed.', 'acf'); ?>';
|
||||
text = '<?php _e( 'Upgrade failed.', 'acf' ); ?>';
|
||||
if( error = acf.getXhrError(jqXHR) ) {
|
||||
text += ' <code>' + error + '</code>';
|
||||
}
|
||||
|
|
@ -189,4 +193,4 @@
|
|||
|
||||
})(jQuery);
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Admin Database Upgrade
|
||||
*
|
||||
* Shows the databse upgrade process.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
* @param void
|
||||
*/
|
||||
* Admin Database Upgrade
|
||||
*
|
||||
* Shows the databse upgrade process.
|
||||
*
|
||||
* @date 24/8/18
|
||||
* @since 5.7.4
|
||||
* @param void
|
||||
*/
|
||||
|
||||
?>
|
||||
<style type="text/css">
|
||||
|
|
@ -23,14 +23,14 @@
|
|||
</style>
|
||||
<div id="acf-upgrade-wrap" class="wrap">
|
||||
|
||||
<h1><?php _e("Upgrade Database", 'acf'); ?></h1>
|
||||
<h1><?php _e( 'Upgrade Database', 'acf' ); ?></h1>
|
||||
|
||||
<?php if( acf_has_upgrade() ): ?>
|
||||
<?php if ( acf_has_upgrade() ) : ?>
|
||||
|
||||
<p><?php _e('Reading upgrade tasks...', 'acf'); ?></p>
|
||||
<p class="step-1"><i class="acf-loading"></i> <?php printf(__('Upgrading data to version %s', 'acf'), ACF_VERSION); ?></p>
|
||||
<p><?php _e( 'Reading upgrade tasks...', 'acf' ); ?></p>
|
||||
<p class="step-1"><i class="acf-loading"></i> <?php printf( __( 'Upgrading data to version %s', 'acf' ), ACF_VERSION ); ?></p>
|
||||
<p class="step-2"></p>
|
||||
<p class="step-3"><?php echo sprintf( __('Database upgrade complete. <a href="%s">See what\'s new</a>', 'acf' ), admin_url('edit.php?post_type=acf-field-group') ); ?></p>
|
||||
<p class="step-3"><?php echo sprintf( __( 'Database upgrade complete. <a href="%s">See what\'s new</a>', 'acf' ), admin_url( 'edit.php?post_type=acf-field-group' ) ); ?></p>
|
||||
|
||||
<script type="text/javascript">
|
||||
(function($) {
|
||||
|
|
@ -51,8 +51,8 @@
|
|||
var success = false;
|
||||
|
||||
// send ajax request to upgrade DB
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
data: acf.prepareForAjax({
|
||||
|
|
@ -62,7 +62,7 @@
|
|||
success = true;
|
||||
},
|
||||
error: function( jqXHR, textStatus, errorThrown ){
|
||||
response = '<?php _e('Upgrade failed.', 'acf'); ?>';
|
||||
response = '<?php _e( 'Upgrade failed.', 'acf' ); ?>';
|
||||
if( error = acf.getXhrError(jqXHR) ) {
|
||||
response += ' <code>' + error + '</code>';
|
||||
}
|
||||
|
|
@ -89,9 +89,9 @@
|
|||
})(jQuery);
|
||||
</script>
|
||||
|
||||
<?php else: ?>
|
||||
<?php else : ?>
|
||||
|
||||
<p><?php _e('No updates available.', 'acf'); ?></p>
|
||||
<p><?php _e( 'No updates available.', 'acf' ); ?></p>
|
||||
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,27 +1,30 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* html-admin-tools
|
||||
*
|
||||
* View to output admin tools for both archive and single
|
||||
*
|
||||
* @date 20/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param string $screen_id The screen ID used to display metaboxes
|
||||
* @param string $active The active Tool
|
||||
* @return n/a
|
||||
*/
|
||||
* html-admin-tools
|
||||
*
|
||||
* View to output admin tools for both archive and single
|
||||
*
|
||||
* @date 20/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param string $screen_id The screen ID used to display metaboxes
|
||||
* @param string $active The active Tool
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
$class = $active ? 'single' : 'grid';
|
||||
|
||||
?>
|
||||
<div class="wrap" id="acf-admin-tools">
|
||||
|
||||
<h1><?php _e('Tools', 'acf'); ?> <?php if( $active ): ?><a class="page-title-action" href="<?php echo acf_get_admin_tools_url(); ?>"><?php _e('Back to all tools', 'acf'); ?></a><?php endif; ?></h1>
|
||||
<h1><?php _e( 'Tools', 'acf' ); ?> <?php
|
||||
if ( $active ) :
|
||||
?>
|
||||
<a class="page-title-action" href="<?php echo acf_get_admin_tools_url(); ?>"><?php _e( 'Back to all tools', 'acf' ); ?></a><?php endif; ?></h1>
|
||||
|
||||
<div class="acf-meta-box-wrap -<?php echo $class; ?>">
|
||||
<?php do_meta_boxes( $screen_id, 'normal', '' ); ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,25 +1,30 @@
|
|||
<div class="rule-group" data-id="<?php echo $group_id; ?>">
|
||||
|
||||
<h4><?php echo ($group_id == 'group_0') ? __("Show this field group if",'acf') : __("or",'acf'); ?></h4>
|
||||
<h4><?php echo ( $group_id == 'group_0' ) ? __( 'Show this field group if', 'acf' ) : __( 'or', 'acf' ); ?></h4>
|
||||
|
||||
<table class="acf-table -clear">
|
||||
<tbody>
|
||||
<?php foreach( $group as $i => $rule ):
|
||||
|
||||
<?php
|
||||
foreach ( $group as $i => $rule ) :
|
||||
|
||||
// validate rule
|
||||
$rule = acf_validate_location_rule($rule);
|
||||
|
||||
$rule = acf_validate_location_rule( $rule );
|
||||
|
||||
// append id and group
|
||||
$rule['id'] = "rule_{$i}";
|
||||
$rule['id'] = "rule_{$i}";
|
||||
$rule['group'] = $group_id;
|
||||
|
||||
|
||||
// view
|
||||
acf_get_view('html-location-rule', array(
|
||||
'rule' => $rule
|
||||
));
|
||||
|
||||
endforeach; ?>
|
||||
acf_get_view(
|
||||
'html-location-rule',
|
||||
array(
|
||||
'rule' => $rule,
|
||||
)
|
||||
);
|
||||
|
||||
endforeach;
|
||||
?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,91 +1,97 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// vars
|
||||
$prefix = 'acf_field_group[location]['.$rule['group'].']['.$rule['id'].']';
|
||||
$prefix = 'acf_field_group[location][' . $rule['group'] . '][' . $rule['id'] . ']';
|
||||
|
||||
?>
|
||||
<tr data-id="<?php echo $rule['id']; ?>">
|
||||
<td class="param">
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
// vars
|
||||
$choices = acf_get_location_rule_types();
|
||||
|
||||
|
||||
|
||||
|
||||
// array
|
||||
if( is_array($choices) ) {
|
||||
|
||||
acf_render_field(array(
|
||||
'type' => 'select',
|
||||
'name' => 'param',
|
||||
'prefix' => $prefix,
|
||||
'value' => $rule['param'],
|
||||
'choices' => $choices,
|
||||
'class' => 'refresh-location-rule'
|
||||
));
|
||||
|
||||
if ( is_array( $choices ) ) {
|
||||
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'select',
|
||||
'name' => 'param',
|
||||
'prefix' => $prefix,
|
||||
'value' => $rule['param'],
|
||||
'choices' => $choices,
|
||||
'class' => 'refresh-location-rule',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
</td>
|
||||
<td class="operator">
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
// vars
|
||||
$choices = acf_get_location_rule_operators( $rule );
|
||||
|
||||
|
||||
|
||||
|
||||
// array
|
||||
if( is_array($choices) ) {
|
||||
|
||||
acf_render_field(array(
|
||||
'type' => 'select',
|
||||
'name' => 'operator',
|
||||
'prefix' => $prefix,
|
||||
'value' => $rule['operator'],
|
||||
'choices' => $choices
|
||||
));
|
||||
|
||||
// custom
|
||||
if ( is_array( $choices ) ) {
|
||||
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'select',
|
||||
'name' => 'operator',
|
||||
'prefix' => $prefix,
|
||||
'value' => $rule['operator'],
|
||||
'choices' => $choices,
|
||||
)
|
||||
);
|
||||
|
||||
// custom
|
||||
} else {
|
||||
|
||||
|
||||
echo $choices;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
</td>
|
||||
<td class="value">
|
||||
<?php
|
||||
|
||||
|
||||
// vars
|
||||
$choices = acf_get_location_rule_values( $rule );
|
||||
|
||||
|
||||
|
||||
|
||||
// array
|
||||
if( is_array($choices) ) {
|
||||
|
||||
acf_render_field(array(
|
||||
'type' => 'select',
|
||||
'name' => 'value',
|
||||
'prefix' => $prefix,
|
||||
'value' => $rule['value'],
|
||||
'choices' => $choices
|
||||
));
|
||||
|
||||
// custom
|
||||
if ( is_array( $choices ) ) {
|
||||
|
||||
acf_render_field(
|
||||
array(
|
||||
'type' => 'select',
|
||||
'name' => 'value',
|
||||
'prefix' => $prefix,
|
||||
'value' => $rule['value'],
|
||||
'choices' => $choices,
|
||||
)
|
||||
);
|
||||
|
||||
// custom
|
||||
} else {
|
||||
|
||||
|
||||
echo $choices;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
</td>
|
||||
<td class="add">
|
||||
<a href="#" class="button add-location-rule"><?php _e("and",'acf'); ?></a>
|
||||
<a href="#" class="button add-location-rule"><?php _e( 'and', 'acf' ); ?></a>
|
||||
</td>
|
||||
<td class="remove">
|
||||
<a href="#" class="acf-icon -minus remove-location-rule"></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -1,15 +1,22 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// calculate add-ons (non pro only)
|
||||
$plugins = array();
|
||||
|
||||
if( !acf_get_setting('pro') ) {
|
||||
|
||||
if( is_plugin_active('acf-repeater/acf-repeater.php') ) $plugins[] = __("Repeater",'acf');
|
||||
if( is_plugin_active('acf-flexible-content/acf-flexible-content.php') ) $plugins[] = __("Flexible Content",'acf');
|
||||
if( is_plugin_active('acf-gallery/acf-gallery.php') ) $plugins[] = __("Gallery",'acf');
|
||||
if( is_plugin_active('acf-options-page/acf-options-page.php') ) $plugins[] = __("Options Page",'acf');
|
||||
|
||||
if ( ! acf_get_setting( 'pro' ) ) {
|
||||
|
||||
if ( is_plugin_active( 'acf-repeater/acf-repeater.php' ) ) {
|
||||
$plugins[] = __( 'Repeater', 'acf' );
|
||||
}
|
||||
if ( is_plugin_active( 'acf-flexible-content/acf-flexible-content.php' ) ) {
|
||||
$plugins[] = __( 'Flexible Content', 'acf' );
|
||||
}
|
||||
if ( is_plugin_active( 'acf-gallery/acf-gallery.php' ) ) {
|
||||
$plugins[] = __( 'Gallery', 'acf' );
|
||||
}
|
||||
if ( is_plugin_active( 'acf-options-page/acf-options-page.php' ) ) {
|
||||
$plugins[] = __( 'Options Page', 'acf' );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -17,11 +24,11 @@ if( !acf_get_setting('pro') ) {
|
|||
|
||||
<div class="col-content">
|
||||
|
||||
<img src="<?php echo acf_get_url('assets/images/acf-logo.png'); ?>" />
|
||||
<h2><?php _e("Database Upgrade Required",'acf'); ?></h2>
|
||||
<p><?php printf(__("Thank you for updating to %s v%s!", 'acf'), acf_get_setting('name'), acf_get_setting('version') ); ?><br /><?php _e("This version contains improvements to your database and requires an upgrade.", 'acf'); ?></p>
|
||||
<?php if( !empty($plugins) ): ?>
|
||||
<p><?php printf(__("Please also check all premium add-ons (%s) are updated to the latest version.", 'acf'), implode(', ', $plugins) ); ?></p>
|
||||
<img src="<?php echo acf_get_url( 'assets/images/acf-logo.png' ); ?>" />
|
||||
<h2><?php _e( 'Database Upgrade Required', 'acf' ); ?></h2>
|
||||
<p><?php printf( __( 'Thank you for updating to %1$s v%2$s!', 'acf' ), acf_get_setting( 'name' ), acf_get_setting( 'version' ) ); ?><br /><?php _e( 'This version contains improvements to your database and requires an upgrade.', 'acf' ); ?></p>
|
||||
<?php if ( ! empty( $plugins ) ) : ?>
|
||||
<p><?php printf( __( 'Please also check all premium add-ons (%s) are updated to the latest version.', 'acf' ), implode( ', ', $plugins ) ); ?></p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
|
|
@ -30,7 +37,7 @@ if( !acf_get_setting('pro') ) {
|
|||
</div>
|
||||
|
||||
</div>
|
||||
<?php if( $confirm ): ?>
|
||||
<?php if ( $confirm ) : ?>
|
||||
<script type="text/javascript">
|
||||
(function($) {
|
||||
|
||||
|
|
@ -40,4 +47,4 @@ if( !acf_get_setting('pro') ) {
|
|||
|
||||
})(jQuery);
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
|
|
|
|||
|
|
@ -1,98 +1,103 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Ajax_Check_Screen') ) :
|
||||
|
||||
class ACF_Ajax_Check_Screen extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/check_screen';
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = false;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// vars
|
||||
$args = wp_parse_args($this->request, array(
|
||||
'screen' => '',
|
||||
'post_id' => 0,
|
||||
'ajax' => true,
|
||||
'exists' => array()
|
||||
));
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'results' => array(),
|
||||
'style' => ''
|
||||
);
|
||||
|
||||
// get field groups
|
||||
$field_groups = acf_get_field_groups( $args );
|
||||
|
||||
// loop through field groups
|
||||
if( $field_groups ) {
|
||||
foreach( $field_groups as $i => $field_group ) {
|
||||
|
||||
// vars
|
||||
$item = array(
|
||||
'id' => 'acf-' . $field_group['key'],
|
||||
'key' => $field_group['key'],
|
||||
'title' => $field_group['title'],
|
||||
'position' => $field_group['position'],
|
||||
'style' => $field_group['style'],
|
||||
'label' => $field_group['label_placement'],
|
||||
'edit' => acf_get_field_group_edit_link( $field_group['ID'] ),
|
||||
'html' => ''
|
||||
);
|
||||
|
||||
// append html if doesnt already exist on page
|
||||
if( !in_array($field_group['key'], $args['exists']) ) {
|
||||
|
||||
// load fields
|
||||
$fields = acf_get_fields( $field_group );
|
||||
|
||||
// get field HTML
|
||||
ob_start();
|
||||
|
||||
// render
|
||||
acf_render_fields( $fields, $args['post_id'], 'div', $field_group['instruction_placement'] );
|
||||
|
||||
$item['html'] = ob_get_clean();
|
||||
}
|
||||
|
||||
// append
|
||||
$response['results'][] = $item;
|
||||
}
|
||||
|
||||
// Get style from first field group.
|
||||
$response['style'] = acf_get_field_group_style( $field_groups[0] );
|
||||
}
|
||||
|
||||
// Custom metabox order.
|
||||
if( $this->get('screen') == 'post' ) {
|
||||
$response['sorted'] = get_user_option('meta-box-order_' . $this->get('post_type'));
|
||||
}
|
||||
|
||||
// return
|
||||
return $response;
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
acf_new_instance('ACF_Ajax_Check_Screen');
|
||||
if ( ! class_exists( 'ACF_Ajax_Check_Screen' ) ) :
|
||||
|
||||
class ACF_Ajax_Check_Screen extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/check_screen';
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = false;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// vars
|
||||
$args = wp_parse_args(
|
||||
$this->request,
|
||||
array(
|
||||
'screen' => '',
|
||||
'post_id' => 0,
|
||||
'ajax' => true,
|
||||
'exists' => array(),
|
||||
)
|
||||
);
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'results' => array(),
|
||||
'style' => '',
|
||||
);
|
||||
|
||||
// get field groups
|
||||
$field_groups = acf_get_field_groups( $args );
|
||||
|
||||
// loop through field groups
|
||||
if ( $field_groups ) {
|
||||
foreach ( $field_groups as $i => $field_group ) {
|
||||
|
||||
// vars
|
||||
$item = array(
|
||||
'id' => 'acf-' . $field_group['key'],
|
||||
'key' => $field_group['key'],
|
||||
'title' => $field_group['title'],
|
||||
'position' => $field_group['position'],
|
||||
'style' => $field_group['style'],
|
||||
'label' => $field_group['label_placement'],
|
||||
'edit' => acf_get_field_group_edit_link( $field_group['ID'] ),
|
||||
'html' => '',
|
||||
);
|
||||
|
||||
// append html if doesnt already exist on page
|
||||
if ( ! in_array( $field_group['key'], $args['exists'] ) ) {
|
||||
|
||||
// load fields
|
||||
$fields = acf_get_fields( $field_group );
|
||||
|
||||
// get field HTML
|
||||
ob_start();
|
||||
|
||||
// render
|
||||
acf_render_fields( $fields, $args['post_id'], 'div', $field_group['instruction_placement'] );
|
||||
|
||||
$item['html'] = ob_get_clean();
|
||||
}
|
||||
|
||||
// append
|
||||
$response['results'][] = $item;
|
||||
}
|
||||
|
||||
// Get style from first field group.
|
||||
$response['style'] = acf_get_field_group_style( $field_groups[0] );
|
||||
}
|
||||
|
||||
// Custom metabox order.
|
||||
if ( $this->get( 'screen' ) == 'post' ) {
|
||||
$response['sorted'] = get_user_option( 'meta-box-order_' . $this->get( 'post_type' ) );
|
||||
}
|
||||
|
||||
// return
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
|
||||
acf_new_instance( 'ACF_Ajax_Check_Screen' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,69 +1,71 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if( ! class_exists('ACF_Ajax_Local_JSON_Diff') ) :
|
||||
if ( ! class_exists( 'ACF_Ajax_Local_JSON_Diff' ) ) :
|
||||
|
||||
class ACF_Ajax_Local_JSON_Diff extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/local_json_diff';
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = false;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
$json = array();
|
||||
|
||||
// Extract props.
|
||||
$id = isset( $request['id'] ) ? intval( $request['id'] ) : 0;
|
||||
|
||||
// Bail ealry if missing props.
|
||||
if( !$id ) {
|
||||
return new WP_Error( 'acf_invalid_param', __( 'Invalid field group parameter(s).', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
|
||||
// Disable filters and load field group directly from database.
|
||||
acf_disable_filters();
|
||||
$field_group = acf_get_field_group( $id );
|
||||
if( !$field_group ) {
|
||||
return new WP_Error( 'acf_invalid_id', __( 'Invalid field group ID.', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
$field_group['fields'] = acf_get_fields( $field_group );
|
||||
$field_group['modified'] = get_post_modified_time( 'U', true, $field_group['ID'] );
|
||||
$field_group = acf_prepare_field_group_for_export( $field_group );
|
||||
|
||||
// Load local field group file.
|
||||
$files = acf_get_local_json_files();
|
||||
$key = $field_group['key'];
|
||||
if( !isset( $files[ $key ] ) ) {
|
||||
return new WP_Error( 'acf_cannot_compare', __( 'Sorry, this field group is unavailable for diff comparison.', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
$local_field_group = json_decode( file_get_contents( $files[ $key ] ), true );
|
||||
|
||||
// Render diff HTML.
|
||||
$date_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
|
||||
$date_template = __( 'Last updated: %s', 'acf' );
|
||||
$json['html'] = '
|
||||
class ACF_Ajax_Local_JSON_Diff extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/local_json_diff';
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = false;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
$json = array();
|
||||
|
||||
// Extract props.
|
||||
$id = isset( $request['id'] ) ? intval( $request['id'] ) : 0;
|
||||
|
||||
// Bail ealry if missing props.
|
||||
if ( ! $id ) {
|
||||
return new WP_Error( 'acf_invalid_param', __( 'Invalid field group parameter(s).', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
|
||||
// Disable filters and load field group directly from database.
|
||||
acf_disable_filters();
|
||||
$field_group = acf_get_field_group( $id );
|
||||
if ( ! $field_group ) {
|
||||
return new WP_Error( 'acf_invalid_id', __( 'Invalid field group ID.', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
$field_group['fields'] = acf_get_fields( $field_group );
|
||||
$field_group['modified'] = get_post_modified_time( 'U', true, $field_group['ID'] );
|
||||
$field_group = acf_prepare_field_group_for_export( $field_group );
|
||||
|
||||
// Load local field group file.
|
||||
$files = acf_get_local_json_files();
|
||||
$key = $field_group['key'];
|
||||
if ( ! isset( $files[ $key ] ) ) {
|
||||
return new WP_Error( 'acf_cannot_compare', __( 'Sorry, this field group is unavailable for diff comparison.', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
$local_field_group = json_decode( file_get_contents( $files[ $key ] ), true );
|
||||
|
||||
// Render diff HTML.
|
||||
$date_format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
|
||||
$date_template = __( 'Last updated: %s', 'acf' );
|
||||
$json['html'] = '
|
||||
<div class="acf-diff">
|
||||
<div class="acf-diff-title">
|
||||
<div class="acf-diff-title-left">
|
||||
<strong>' . __( 'Original field group', 'acf' ) . '</strong>
|
||||
<strong>' . __( 'Original field group', 'acf' ) . '</strong>
|
||||
<span>' . sprintf( $date_template, wp_date( $date_format, $field_group['modified'] ) ) . '</span>
|
||||
</div>
|
||||
<div class="acf-diff-title-right">
|
||||
<strong>' . __( 'JSON field group (newer)', 'acf' ) . '</strong>
|
||||
<strong>' . __( 'JSON field group (newer)', 'acf' ) . '</strong>
|
||||
<span>' . sprintf( $date_template, wp_date( $date_format, $local_field_group['modified'] ) ) . '</span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -71,10 +73,10 @@ class ACF_Ajax_Local_JSON_Diff extends ACF_Ajax {
|
|||
' . wp_text_diff( acf_json_encode( $field_group ), acf_json_encode( $local_field_group ) ) . '
|
||||
</div>
|
||||
</div>';
|
||||
return $json;
|
||||
return $json;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
acf_new_instance('ACF_Ajax_Local_JSON_Diff');
|
||||
acf_new_instance( 'ACF_Ajax_Local_JSON_Diff' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
|
|
@ -1,273 +1,275 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Ajax_Query_Users') ) :
|
||||
|
||||
class ACF_Ajax_Query_Users extends ACF_Ajax_Query {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/query_users';
|
||||
|
||||
/**
|
||||
* init_request
|
||||
*
|
||||
* Called at the beginning of a request to setup properties.
|
||||
*
|
||||
* @date 23/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return void
|
||||
*/
|
||||
function init_request( $request ) {
|
||||
parent::init_request( $request );
|
||||
|
||||
// Customize query.
|
||||
add_filter( 'user_search_columns', array( $this, 'filter_search_columns' ), 10, 3 );
|
||||
|
||||
/**
|
||||
* Fires when a request is made.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $request The query request.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
do_action( "acf/ajax/query_users/init", $request, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* get_args
|
||||
*
|
||||
* Returns an array of args for this query.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return array
|
||||
*/
|
||||
function get_args( $request ) {
|
||||
$args = parent::get_args( $request );
|
||||
$args['number'] = $this->per_page;
|
||||
$args['paged'] = $this->page;
|
||||
if( $this->is_search ) {
|
||||
$args['search'] = "*{$this->search}*";
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the query args.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $args The query args.
|
||||
* @param array $request The query request.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( "acf/ajax/query_users/args", $args, $request, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares args for the get_results() method.
|
||||
*
|
||||
* @date 23/3/20
|
||||
* @since 5.8.9
|
||||
*
|
||||
* @param array args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function prepare_args( $args ) {
|
||||
|
||||
// Parse pagination args that may have been modified.
|
||||
if( isset($args['users_per_page']) ) {
|
||||
$this->per_page = intval($args['users_per_page']);
|
||||
unset( $args['users_per_page'] );
|
||||
|
||||
} elseif( isset($args['number']) ) {
|
||||
$this->per_page = intval($args['number']);
|
||||
}
|
||||
|
||||
if( isset($args['paged']) ) {
|
||||
$this->page = intval($args['paged']);
|
||||
unset( $args['paged'] );
|
||||
}
|
||||
|
||||
// Set pagination args for fine control.
|
||||
$args['number'] = $this->per_page;
|
||||
$args['offset'] = $this->per_page * ($this->page - 1);
|
||||
$args['count_total'] = true;
|
||||
return $args;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_results
|
||||
*
|
||||
* Returns an array of results for the given args.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function get_results( $args ) {
|
||||
$results = array();
|
||||
|
||||
// Prepare args for quey.
|
||||
$args = $this->prepare_args( $args );
|
||||
|
||||
// Get result groups.
|
||||
if( !empty( $args['role__in']) ) {
|
||||
$roles = acf_get_user_role_labels( $args['role__in'] );
|
||||
} else {
|
||||
$roles = acf_get_user_role_labels();
|
||||
}
|
||||
|
||||
// Return a flat array of results when searching or when queriying one group only.
|
||||
if( $this->is_search || count($roles) === 1 ) {
|
||||
|
||||
// Query users and append to results.
|
||||
$wp_user_query = new WP_User_Query( $args );
|
||||
$users = (array) $wp_user_query->get_results();
|
||||
$total_users = $wp_user_query->get_total();
|
||||
foreach( $users as $user ) {
|
||||
$results[] = $this->get_result( $user );
|
||||
}
|
||||
|
||||
// Determine if more results exist.
|
||||
// As this query does not return grouped results, the calculation can be exact (">").
|
||||
$this->more = ( $total_users > count($users) + $args['offset'] );
|
||||
|
||||
// Otherwise, group results via role.
|
||||
} else {
|
||||
|
||||
// Unset args that will interfer with query results.
|
||||
unset( $args['role__in'], $args['role__not_in'] );
|
||||
|
||||
// Loop over each role.
|
||||
foreach( $roles as $role => $role_label ) {
|
||||
|
||||
// Query users (for this role only).
|
||||
$args['role'] = $role;
|
||||
$wp_user_query = new WP_User_Query( $args );
|
||||
$users = (array) $wp_user_query->get_results();
|
||||
$total_users = $wp_user_query->get_total();
|
||||
|
||||
//acf_log( $args );
|
||||
//acf_log( '- ', count($users) );
|
||||
//acf_log( '- ', $total_users );
|
||||
|
||||
// If users were found for this query...
|
||||
if( $users ) {
|
||||
|
||||
// Append optgroup of results.
|
||||
$role_results = array();
|
||||
foreach( $users as $user ) {
|
||||
$role_results[] = $this->get_result( $user );
|
||||
}
|
||||
$results[] = array(
|
||||
'text' => $role_label,
|
||||
'children' => $role_results
|
||||
);
|
||||
|
||||
// End loop when enough results have been found.
|
||||
if( count($users) === $args['number'] ) {
|
||||
|
||||
// Determine if more results exist.
|
||||
// As this query does return grouped results, the calculation is best left fuzzy to avoid querying the next group (">=").
|
||||
$this->more = ( $total_users >= count($users) + $args['offset'] );
|
||||
break;
|
||||
|
||||
// Otherwise, modify the args so that the next query can continue on correctly.
|
||||
} else {
|
||||
$args['offset'] = 0;
|
||||
$args['number'] -= count($users);
|
||||
}
|
||||
|
||||
// If no users were found (for the current pagination args), but there were users found for previous pages...
|
||||
// Modify the args so that the next query is offset slightly less (the number of total users) and can continue on correctly.
|
||||
} elseif( $total_users ) {
|
||||
$args['offset'] -= $total_users;
|
||||
continue;
|
||||
|
||||
// Ignore roles that will never return a result.
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the query results.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $results The query results.
|
||||
* @param array $args The query args.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( "acf/ajax/query_users/results", $results, $args, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* get_result
|
||||
*
|
||||
* Returns a single result for the given item object.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param mixed $item A single item from the queried results.
|
||||
* @return string
|
||||
*/
|
||||
function get_result( $user ) {
|
||||
$item = acf_get_user_result( $user );
|
||||
|
||||
/**
|
||||
* Filters the result item.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $item The choice id and text.
|
||||
* @param ACF_User $user The user object.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( "acf/ajax/query_users/result", $item, $user, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the WP_User_Query search columns.
|
||||
*
|
||||
* @date 9/3/20
|
||||
* @since 5.8.8
|
||||
*
|
||||
* @param array $columns An array of column names to be searched.
|
||||
* @param string $search The search term.
|
||||
* @param WP_User_Query $WP_User_Query The WP_User_Query instance.
|
||||
* @return array
|
||||
*/
|
||||
function filter_search_columns( $columns, $search, $WP_User_Query ) {
|
||||
|
||||
/**
|
||||
* Filters the column names to be searched.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $columns An array of column names to be searched.
|
||||
* @param string $search The search term.
|
||||
* @param WP_User_Query $WP_User_Query The WP_User_Query instance.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( "acf/ajax/query_users/search_columns", $columns, $search, $WP_User_Query, $this );
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
acf_new_instance('ACF_Ajax_Query_Users');
|
||||
if ( ! class_exists( 'ACF_Ajax_Query_Users' ) ) :
|
||||
|
||||
class ACF_Ajax_Query_Users extends ACF_Ajax_Query {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/query_users';
|
||||
|
||||
/**
|
||||
* init_request
|
||||
*
|
||||
* Called at the beginning of a request to setup properties.
|
||||
*
|
||||
* @date 23/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return void
|
||||
*/
|
||||
function init_request( $request ) {
|
||||
parent::init_request( $request );
|
||||
|
||||
// Customize query.
|
||||
add_filter( 'user_search_columns', array( $this, 'filter_search_columns' ), 10, 3 );
|
||||
|
||||
/**
|
||||
* Fires when a request is made.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $request The query request.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
do_action( 'acf/ajax/query_users/init', $request, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* get_args
|
||||
*
|
||||
* Returns an array of args for this query.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return array
|
||||
*/
|
||||
function get_args( $request ) {
|
||||
$args = parent::get_args( $request );
|
||||
$args['number'] = $this->per_page;
|
||||
$args['paged'] = $this->page;
|
||||
if ( $this->is_search ) {
|
||||
$args['search'] = "*{$this->search}*";
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the query args.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $args The query args.
|
||||
* @param array $request The query request.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( 'acf/ajax/query_users/args', $args, $request, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares args for the get_results() method.
|
||||
*
|
||||
* @date 23/3/20
|
||||
* @since 5.8.9
|
||||
*
|
||||
* @param array args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function prepare_args( $args ) {
|
||||
|
||||
// Parse pagination args that may have been modified.
|
||||
if ( isset( $args['users_per_page'] ) ) {
|
||||
$this->per_page = intval( $args['users_per_page'] );
|
||||
unset( $args['users_per_page'] );
|
||||
|
||||
} elseif ( isset( $args['number'] ) ) {
|
||||
$this->per_page = intval( $args['number'] );
|
||||
}
|
||||
|
||||
if ( isset( $args['paged'] ) ) {
|
||||
$this->page = intval( $args['paged'] );
|
||||
unset( $args['paged'] );
|
||||
}
|
||||
|
||||
// Set pagination args for fine control.
|
||||
$args['number'] = $this->per_page;
|
||||
$args['offset'] = $this->per_page * ( $this->page - 1 );
|
||||
$args['count_total'] = true;
|
||||
return $args;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_results
|
||||
*
|
||||
* Returns an array of results for the given args.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function get_results( $args ) {
|
||||
$results = array();
|
||||
|
||||
// Prepare args for quey.
|
||||
$args = $this->prepare_args( $args );
|
||||
|
||||
// Get result groups.
|
||||
if ( ! empty( $args['role__in'] ) ) {
|
||||
$roles = acf_get_user_role_labels( $args['role__in'] );
|
||||
} else {
|
||||
$roles = acf_get_user_role_labels();
|
||||
}
|
||||
|
||||
// Return a flat array of results when searching or when queriying one group only.
|
||||
if ( $this->is_search || count( $roles ) === 1 ) {
|
||||
|
||||
// Query users and append to results.
|
||||
$wp_user_query = new WP_User_Query( $args );
|
||||
$users = (array) $wp_user_query->get_results();
|
||||
$total_users = $wp_user_query->get_total();
|
||||
foreach ( $users as $user ) {
|
||||
$results[] = $this->get_result( $user );
|
||||
}
|
||||
|
||||
// Determine if more results exist.
|
||||
// As this query does not return grouped results, the calculation can be exact (">").
|
||||
$this->more = ( $total_users > count( $users ) + $args['offset'] );
|
||||
|
||||
// Otherwise, group results via role.
|
||||
} else {
|
||||
|
||||
// Unset args that will interfer with query results.
|
||||
unset( $args['role__in'], $args['role__not_in'] );
|
||||
|
||||
// Loop over each role.
|
||||
foreach ( $roles as $role => $role_label ) {
|
||||
|
||||
// Query users (for this role only).
|
||||
$args['role'] = $role;
|
||||
$wp_user_query = new WP_User_Query( $args );
|
||||
$users = (array) $wp_user_query->get_results();
|
||||
$total_users = $wp_user_query->get_total();
|
||||
|
||||
// acf_log( $args );
|
||||
// acf_log( '- ', count($users) );
|
||||
// acf_log( '- ', $total_users );
|
||||
|
||||
// If users were found for this query...
|
||||
if ( $users ) {
|
||||
|
||||
// Append optgroup of results.
|
||||
$role_results = array();
|
||||
foreach ( $users as $user ) {
|
||||
$role_results[] = $this->get_result( $user );
|
||||
}
|
||||
$results[] = array(
|
||||
'text' => $role_label,
|
||||
'children' => $role_results,
|
||||
);
|
||||
|
||||
// End loop when enough results have been found.
|
||||
if ( count( $users ) === $args['number'] ) {
|
||||
|
||||
// Determine if more results exist.
|
||||
// As this query does return grouped results, the calculation is best left fuzzy to avoid querying the next group (">=").
|
||||
$this->more = ( $total_users >= count( $users ) + $args['offset'] );
|
||||
break;
|
||||
|
||||
// Otherwise, modify the args so that the next query can continue on correctly.
|
||||
} else {
|
||||
$args['offset'] = 0;
|
||||
$args['number'] -= count( $users );
|
||||
}
|
||||
|
||||
// If no users were found (for the current pagination args), but there were users found for previous pages...
|
||||
// Modify the args so that the next query is offset slightly less (the number of total users) and can continue on correctly.
|
||||
} elseif ( $total_users ) {
|
||||
$args['offset'] -= $total_users;
|
||||
continue;
|
||||
|
||||
// Ignore roles that will never return a result.
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the query results.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $results The query results.
|
||||
* @param array $args The query args.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( 'acf/ajax/query_users/results', $results, $args, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* get_result
|
||||
*
|
||||
* Returns a single result for the given item object.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param mixed $item A single item from the queried results.
|
||||
* @return string
|
||||
*/
|
||||
function get_result( $user ) {
|
||||
$item = acf_get_user_result( $user );
|
||||
|
||||
/**
|
||||
* Filters the result item.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $item The choice id and text.
|
||||
* @param ACF_User $user The user object.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( 'acf/ajax/query_users/result', $item, $user, $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the WP_User_Query search columns.
|
||||
*
|
||||
* @date 9/3/20
|
||||
* @since 5.8.8
|
||||
*
|
||||
* @param array $columns An array of column names to be searched.
|
||||
* @param string $search The search term.
|
||||
* @param WP_User_Query $WP_User_Query The WP_User_Query instance.
|
||||
* @return array
|
||||
*/
|
||||
function filter_search_columns( $columns, $search, $WP_User_Query ) {
|
||||
|
||||
/**
|
||||
* Filters the column names to be searched.
|
||||
*
|
||||
* @date 21/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $columns An array of column names to be searched.
|
||||
* @param string $search The search term.
|
||||
* @param WP_User_Query $WP_User_Query The WP_User_Query instance.
|
||||
* @param ACF_Ajax_Query $query The query object.
|
||||
*/
|
||||
return apply_filters( 'acf/ajax/query_users/search_columns', $columns, $search, $WP_User_Query, $this );
|
||||
}
|
||||
}
|
||||
|
||||
acf_new_instance( 'ACF_Ajax_Query_Users' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
|
|
@ -1,150 +1,152 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Ajax_Query') ) :
|
||||
|
||||
class ACF_Ajax_Query extends ACF_Ajax {
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = true;
|
||||
|
||||
/** @var int The page of results to return. */
|
||||
var $page = 1;
|
||||
|
||||
/** @var int The number of results per page. */
|
||||
var $per_page = 20;
|
||||
|
||||
/** @var bool Signifies whether or not this AJAX query has more pages to load. */
|
||||
var $more = false;
|
||||
|
||||
/** @var string The searched term. */
|
||||
var $search = '';
|
||||
|
||||
/** @var bool Signifies whether the current query is a search. */
|
||||
var $is_search = false;
|
||||
|
||||
/** @var (int|string) The post_id being edited. */
|
||||
var $post_id = 0;
|
||||
|
||||
/** @var array The ACF field related to this query. */
|
||||
var $field = false;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return (array|WP_Error) The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// Init request.
|
||||
$this->init_request( $request );
|
||||
|
||||
// Get query args.
|
||||
$args = $this->get_args( $request );
|
||||
|
||||
// Get query results.
|
||||
$results = $this->get_results( $args );
|
||||
if( is_wp_error($results) ) {
|
||||
return $results;
|
||||
}
|
||||
|
||||
// Return response.
|
||||
return array(
|
||||
'results' => $results,
|
||||
'more' => $this->more
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* init_request
|
||||
*
|
||||
* Called at the beginning of a request to setup properties.
|
||||
*
|
||||
* @date 23/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return void
|
||||
*/
|
||||
function init_request( $request ) {
|
||||
|
||||
// Get field for this query.
|
||||
if( isset($request['field_key']) ) {
|
||||
$this->field = acf_get_field( $request['field_key'] );
|
||||
}
|
||||
|
||||
// Update query properties.
|
||||
if( isset($request['page']) ) {
|
||||
$this->page = intval($request['page']);
|
||||
}
|
||||
if( isset($request['per_page']) ) {
|
||||
$this->per_page = intval($request['per_page']);
|
||||
}
|
||||
if( isset($request['search']) && acf_not_empty($request['search']) ) {
|
||||
$this->search = sanitize_text_field($request['search']);
|
||||
$this->is_search = true;
|
||||
}
|
||||
if( isset($request['post_id']) ) {
|
||||
$this->post_id = $request['post_id'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get_args
|
||||
*
|
||||
* Returns an array of args for this query.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return array
|
||||
*/
|
||||
function get_args( $request ) {
|
||||
|
||||
// Allow for custom "query" arg.
|
||||
if( isset($request['query']) ) {
|
||||
return (array) $request['query'];
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* get_items
|
||||
*
|
||||
* Returns an array of results for the given args.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function get_results( $args ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* get_item
|
||||
*
|
||||
* Returns a single result for the given item object.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param mixed $item A single item from the queried results.
|
||||
* @return array An array containing "id" and "text".
|
||||
*/
|
||||
function get_result( $item ) {
|
||||
return false;
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'ACF_Ajax_Query' ) ) :
|
||||
|
||||
class ACF_Ajax_Query extends ACF_Ajax {
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = true;
|
||||
|
||||
/** @var int The page of results to return. */
|
||||
var $page = 1;
|
||||
|
||||
/** @var int The number of results per page. */
|
||||
var $per_page = 20;
|
||||
|
||||
/** @var bool Signifies whether or not this AJAX query has more pages to load. */
|
||||
var $more = false;
|
||||
|
||||
/** @var string The searched term. */
|
||||
var $search = '';
|
||||
|
||||
/** @var bool Signifies whether the current query is a search. */
|
||||
var $is_search = false;
|
||||
|
||||
/** @var (int|string) The post_id being edited. */
|
||||
var $post_id = 0;
|
||||
|
||||
/** @var array The ACF field related to this query. */
|
||||
var $field = false;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return (array|WP_Error) The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// Init request.
|
||||
$this->init_request( $request );
|
||||
|
||||
// Get query args.
|
||||
$args = $this->get_args( $request );
|
||||
|
||||
// Get query results.
|
||||
$results = $this->get_results( $args );
|
||||
if ( is_wp_error( $results ) ) {
|
||||
return $results;
|
||||
}
|
||||
|
||||
// Return response.
|
||||
return array(
|
||||
'results' => $results,
|
||||
'more' => $this->more,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* init_request
|
||||
*
|
||||
* Called at the beginning of a request to setup properties.
|
||||
*
|
||||
* @date 23/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return void
|
||||
*/
|
||||
function init_request( $request ) {
|
||||
|
||||
// Get field for this query.
|
||||
if ( isset( $request['field_key'] ) ) {
|
||||
$this->field = acf_get_field( $request['field_key'] );
|
||||
}
|
||||
|
||||
// Update query properties.
|
||||
if ( isset( $request['page'] ) ) {
|
||||
$this->page = intval( $request['page'] );
|
||||
}
|
||||
if ( isset( $request['per_page'] ) ) {
|
||||
$this->per_page = intval( $request['per_page'] );
|
||||
}
|
||||
if ( isset( $request['search'] ) && acf_not_empty( $request['search'] ) ) {
|
||||
$this->search = sanitize_text_field( $request['search'] );
|
||||
$this->is_search = true;
|
||||
}
|
||||
if ( isset( $request['post_id'] ) ) {
|
||||
$this->post_id = $request['post_id'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get_args
|
||||
*
|
||||
* Returns an array of args for this query.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return array
|
||||
*/
|
||||
function get_args( $request ) {
|
||||
|
||||
// Allow for custom "query" arg.
|
||||
if ( isset( $request['query'] ) ) {
|
||||
return (array) $request['query'];
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* get_items
|
||||
*
|
||||
* Returns an array of results for the given args.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array args The query args.
|
||||
* @return array
|
||||
*/
|
||||
function get_results( $args ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* get_item
|
||||
*
|
||||
* Returns a single result for the given item object.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param mixed $item A single item from the queried results.
|
||||
* @return array An array containing "id" and "text".
|
||||
*/
|
||||
function get_result( $item ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
|
|
@ -1,54 +1,56 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Ajax_Upgrade') ) :
|
||||
|
||||
class ACF_Ajax_Upgrade extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name */
|
||||
var $action = 'acf/ajax/upgrade';
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// Switch blog.
|
||||
if( isset($request['blog_id']) ) {
|
||||
switch_to_blog( $request['blog_id'] );
|
||||
}
|
||||
|
||||
// Bail early if no upgrade avaiable.
|
||||
if( !acf_has_upgrade() ) {
|
||||
return new WP_Error( 'upgrade_error', __('No updates available.', 'acf') );
|
||||
}
|
||||
|
||||
// Listen for output.
|
||||
ob_start();
|
||||
|
||||
// Run upgrades.
|
||||
acf_upgrade_all();
|
||||
|
||||
// Store output.
|
||||
$error = ob_get_clean();
|
||||
|
||||
// Return error or success.
|
||||
if( $error ) {
|
||||
return new WP_Error( 'upgrade_error', $error );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
acf_new_instance('ACF_Ajax_Upgrade');
|
||||
if ( ! class_exists( 'ACF_Ajax_Upgrade' ) ) :
|
||||
|
||||
class ACF_Ajax_Upgrade extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name */
|
||||
var $action = 'acf/ajax/upgrade';
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// Switch blog.
|
||||
if ( isset( $request['blog_id'] ) ) {
|
||||
switch_to_blog( $request['blog_id'] );
|
||||
}
|
||||
|
||||
// Bail early if no upgrade avaiable.
|
||||
if ( ! acf_has_upgrade() ) {
|
||||
return new WP_Error( 'upgrade_error', __( 'No updates available.', 'acf' ) );
|
||||
}
|
||||
|
||||
// Listen for output.
|
||||
ob_start();
|
||||
|
||||
// Run upgrades.
|
||||
acf_upgrade_all();
|
||||
|
||||
// Store output.
|
||||
$error = ob_get_clean();
|
||||
|
||||
// Return error or success.
|
||||
if ( $error ) {
|
||||
return new WP_Error( 'upgrade_error', $error );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
acf_new_instance( 'ACF_Ajax_Upgrade' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
|
|
@ -1,41 +1,43 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Ajax_User_Setting') ) :
|
||||
|
||||
class ACF_Ajax_User_Setting extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/user_setting';
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = true;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// update
|
||||
if( $this->has('value') ) {
|
||||
return acf_update_user_setting( $this->get('name'), $this->get('value') );
|
||||
|
||||
// get
|
||||
} else {
|
||||
return acf_get_user_setting( $this->get('name') );
|
||||
}
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
acf_new_instance('ACF_Ajax_User_Setting');
|
||||
if ( ! class_exists( 'ACF_Ajax_User_Setting' ) ) :
|
||||
|
||||
class ACF_Ajax_User_Setting extends ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = 'acf/ajax/user_setting';
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = true;
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
|
||||
// update
|
||||
if ( $this->has( 'value' ) ) {
|
||||
return acf_update_user_setting( $this->get( 'name' ), $this->get( 'value' ) );
|
||||
|
||||
// get
|
||||
} else {
|
||||
return acf_get_user_setting( $this->get( 'name' ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
acf_new_instance( 'ACF_Ajax_User_Setting' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
|
|
@ -1,227 +1,232 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Ajax') ) :
|
||||
|
||||
class ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = '';
|
||||
|
||||
/** @var array The $_REQUEST data. */
|
||||
var $request;
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = false;
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
$this->initialize();
|
||||
$this->add_actions();
|
||||
}
|
||||
|
||||
/**
|
||||
* has
|
||||
*
|
||||
* Returns true if the request has data for the given key.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param string $key The data key.
|
||||
* @return boolean
|
||||
*/
|
||||
function has( $key = '' ) {
|
||||
return isset($this->request[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* get
|
||||
*
|
||||
* Returns request data for the given key.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param string $key The data key.
|
||||
* @return mixed
|
||||
*/
|
||||
function get( $key = '' ) {
|
||||
return isset($this->request[$key]) ? $this->request[$key] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets request data for the given key.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param string $key The data key.
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Ajax
|
||||
*/
|
||||
function set( $key = '', $value = null ) {
|
||||
$this->request[$key] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* Allows easy access to modifying properties without changing constructor.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function initialize() {
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
/**
|
||||
* add_actions
|
||||
*
|
||||
* Adds the ajax actions for this response.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function add_actions() {
|
||||
|
||||
// add action for logged-in users
|
||||
add_action( "wp_ajax_{$this->action}", array($this, 'request') );
|
||||
|
||||
// add action for non logged-in users
|
||||
if( $this->public ) {
|
||||
add_action( "wp_ajax_nopriv_{$this->action}", array($this, 'request') );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* request
|
||||
*
|
||||
* Callback for ajax action. Sets up properties and calls the get_response() function.
|
||||
*
|
||||
* @date 1/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function request() {
|
||||
|
||||
// Store data for has() and get() functions.
|
||||
$this->request = wp_unslash($_REQUEST);
|
||||
|
||||
// Verify request and handle error.
|
||||
$error = $this->verify_request( $this->request );
|
||||
if( is_wp_error( $error ) ) {
|
||||
$this->send( $error );
|
||||
}
|
||||
|
||||
// Send response.
|
||||
$this->send( $this->get_response( $this->request ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the request.
|
||||
*
|
||||
* @date 9/3/20
|
||||
* @since 5.8.8
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return (bool|WP_Error) True on success, WP_Error on fail.
|
||||
*/
|
||||
function verify_request( $request ) {
|
||||
|
||||
// Verify nonce.
|
||||
if( !acf_verify_ajax() ) {
|
||||
return new WP_Error( 'acf_invalid_nonce', __( 'Invalid nonce.', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* send
|
||||
*
|
||||
* Sends back JSON based on the $response as either success or failure.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param mixed $response The response to send back.
|
||||
* @return void
|
||||
*/
|
||||
function send( $response ) {
|
||||
|
||||
// Return error.
|
||||
if( is_wp_error($response) ) {
|
||||
$this->send_error( $response );
|
||||
|
||||
// Return success.
|
||||
} else {
|
||||
wp_send_json( $response );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a JSON response for the given WP_Error object.
|
||||
*
|
||||
* @date 8/3/20
|
||||
* @since 5.8.8
|
||||
*
|
||||
* @param WP_Error error The error object.
|
||||
* @return void
|
||||
*/
|
||||
function send_error( $error ) {
|
||||
|
||||
// Get error status
|
||||
$error_data = $error->get_error_data();
|
||||
if( is_array($error_data) && isset($error_data['status']) ) {
|
||||
$status_code = $error_data['status'];
|
||||
} else {
|
||||
$status_code = 500;
|
||||
}
|
||||
|
||||
wp_send_json(array(
|
||||
'code' => $error->get_error_code(),
|
||||
'message' => $error->get_error_message(),
|
||||
'data' => $error->get_error_data()
|
||||
), $status_code);
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'ACF_Ajax' ) ) :
|
||||
|
||||
class ACF_Ajax {
|
||||
|
||||
/** @var string The AJAX action name. */
|
||||
var $action = '';
|
||||
|
||||
/** @var array The $_REQUEST data. */
|
||||
var $request;
|
||||
|
||||
/** @var bool Prevents access for non-logged in users. */
|
||||
var $public = false;
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
$this->initialize();
|
||||
$this->add_actions();
|
||||
}
|
||||
|
||||
/**
|
||||
* has
|
||||
*
|
||||
* Returns true if the request has data for the given key.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param string $key The data key.
|
||||
* @return boolean
|
||||
*/
|
||||
function has( $key = '' ) {
|
||||
return isset( $this->request[ $key ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* get
|
||||
*
|
||||
* Returns request data for the given key.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param string $key The data key.
|
||||
* @return mixed
|
||||
*/
|
||||
function get( $key = '' ) {
|
||||
return isset( $this->request[ $key ] ) ? $this->request[ $key ] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets request data for the given key.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param string $key The data key.
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Ajax
|
||||
*/
|
||||
function set( $key = '', $value = null ) {
|
||||
$this->request[ $key ] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* Allows easy access to modifying properties without changing constructor.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function initialize() {
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
/**
|
||||
* add_actions
|
||||
*
|
||||
* Adds the ajax actions for this response.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function add_actions() {
|
||||
|
||||
// add action for logged-in users
|
||||
add_action( "wp_ajax_{$this->action}", array( $this, 'request' ) );
|
||||
|
||||
// add action for non logged-in users
|
||||
if ( $this->public ) {
|
||||
add_action( "wp_ajax_nopriv_{$this->action}", array( $this, 'request' ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* request
|
||||
*
|
||||
* Callback for ajax action. Sets up properties and calls the get_response() function.
|
||||
*
|
||||
* @date 1/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function request() {
|
||||
|
||||
// Store data for has() and get() functions.
|
||||
$this->request = wp_unslash( $_REQUEST );
|
||||
|
||||
// Verify request and handle error.
|
||||
$error = $this->verify_request( $this->request );
|
||||
if ( is_wp_error( $error ) ) {
|
||||
$this->send( $error );
|
||||
}
|
||||
|
||||
// Send response.
|
||||
$this->send( $this->get_response( $this->request ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the request.
|
||||
*
|
||||
* @date 9/3/20
|
||||
* @since 5.8.8
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return (bool|WP_Error) True on success, WP_Error on fail.
|
||||
*/
|
||||
function verify_request( $request ) {
|
||||
|
||||
// Verify nonce.
|
||||
if ( ! acf_verify_ajax() ) {
|
||||
return new WP_Error( 'acf_invalid_nonce', __( 'Invalid nonce.', 'acf' ), array( 'status' => 404 ) );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_response
|
||||
*
|
||||
* Returns the response data to sent back.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $request The request args.
|
||||
* @return mixed The response data or WP_Error.
|
||||
*/
|
||||
function get_response( $request ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* send
|
||||
*
|
||||
* Sends back JSON based on the $response as either success or failure.
|
||||
*
|
||||
* @date 31/7/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param mixed $response The response to send back.
|
||||
* @return void
|
||||
*/
|
||||
function send( $response ) {
|
||||
|
||||
// Return error.
|
||||
if ( is_wp_error( $response ) ) {
|
||||
$this->send_error( $response );
|
||||
|
||||
// Return success.
|
||||
} else {
|
||||
wp_send_json( $response );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a JSON response for the given WP_Error object.
|
||||
*
|
||||
* @date 8/3/20
|
||||
* @since 5.8.8
|
||||
*
|
||||
* @param WP_Error error The error object.
|
||||
* @return void
|
||||
*/
|
||||
function send_error( $error ) {
|
||||
|
||||
// Get error status
|
||||
$error_data = $error->get_error_data();
|
||||
if ( is_array( $error_data ) && isset( $error_data['status'] ) ) {
|
||||
$status_code = $error_data['status'];
|
||||
} else {
|
||||
$status_code = 500;
|
||||
}
|
||||
|
||||
wp_send_json(
|
||||
array(
|
||||
'code' => $error->get_error_code(),
|
||||
'message' => $error->get_error_message(),
|
||||
'data' => $error->get_error_data(),
|
||||
),
|
||||
$status_code
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -5,71 +5,73 @@
|
|||
*
|
||||
* Returns an array of taxonomy names.
|
||||
*
|
||||
* @date 7/10/13
|
||||
* @since 5.0.0
|
||||
* @date 7/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $args An array of args used in the get_taxonomies() function.
|
||||
* @return array An array of taxonomy names.
|
||||
* @param array $args An array of args used in the get_taxonomies() function.
|
||||
* @return array An array of taxonomy names.
|
||||
*/
|
||||
|
||||
function acf_get_taxonomies( $args = array() ) {
|
||||
|
||||
// vars
|
||||
$taxonomies = array();
|
||||
|
||||
|
||||
// get taxonomy objects
|
||||
$objects = get_taxonomies( $args, 'objects' );
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $objects as $i => $object ) {
|
||||
|
||||
foreach ( $objects as $i => $object ) {
|
||||
|
||||
// bail early if is builtin (WP) private post type
|
||||
// - nav_menu_item, revision, customize_changeset, etc
|
||||
if( $object->_builtin && !$object->public ) continue;
|
||||
|
||||
if ( $object->_builtin && ! $object->public ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// append
|
||||
$taxonomies[] = $i;
|
||||
}
|
||||
|
||||
|
||||
// custom post_type arg which does not yet exist in core
|
||||
if( isset($args['post_type']) ) {
|
||||
$taxonomies = acf_get_taxonomies_for_post_type($args['post_type']);
|
||||
if ( isset( $args['post_type'] ) ) {
|
||||
$taxonomies = acf_get_taxonomies_for_post_type( $args['post_type'] );
|
||||
}
|
||||
|
||||
|
||||
// filter
|
||||
$taxonomies = apply_filters('acf/get_taxonomies', $taxonomies, $args);
|
||||
|
||||
$taxonomies = apply_filters( 'acf/get_taxonomies', $taxonomies, $args );
|
||||
|
||||
// return
|
||||
return $taxonomies;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_taxonomies_for_post_type
|
||||
*
|
||||
* Returns an array of taxonomies for a given post type(s)
|
||||
*
|
||||
* @date 7/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param string|array $post_types The post types to compare against.
|
||||
* @return array
|
||||
*/
|
||||
* acf_get_taxonomies_for_post_type
|
||||
*
|
||||
* Returns an array of taxonomies for a given post type(s)
|
||||
*
|
||||
* @date 7/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param string|array $post_types The post types to compare against.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_taxonomies_for_post_type( $post_types = 'post' ) {
|
||||
|
||||
|
||||
// vars
|
||||
$taxonomies = array();
|
||||
|
||||
|
||||
// loop
|
||||
foreach( (array) $post_types as $post_type ) {
|
||||
foreach ( (array) $post_types as $post_type ) {
|
||||
$object_taxonomies = get_object_taxonomies( $post_type );
|
||||
foreach( (array) $object_taxonomies as $taxonomy ) {
|
||||
$taxonomies[] = $taxonomy;
|
||||
foreach ( (array) $object_taxonomies as $taxonomy ) {
|
||||
$taxonomies[] = $taxonomy;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// remove duplicates
|
||||
$taxonomies = array_unique($taxonomies);
|
||||
|
||||
$taxonomies = array_unique( $taxonomies );
|
||||
|
||||
// return
|
||||
return $taxonomies;
|
||||
}
|
||||
|
|
@ -79,414 +81,426 @@ function acf_get_taxonomies_for_post_type( $post_types = 'post' ) {
|
|||
*
|
||||
* Returns an array of taxonomies in the format "name => label" for use in a select field.
|
||||
*
|
||||
* @date 3/8/18
|
||||
* @since 5.7.2
|
||||
* @date 3/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $taxonomies Optional. An array of specific taxonomies to return.
|
||||
* @return array
|
||||
* @param array $taxonomies Optional. An array of specific taxonomies to return.
|
||||
* @return array
|
||||
*/
|
||||
|
||||
function acf_get_taxonomy_labels( $taxonomies = array() ) {
|
||||
|
||||
|
||||
// default
|
||||
if( empty($taxonomies) ) {
|
||||
if ( empty( $taxonomies ) ) {
|
||||
$taxonomies = acf_get_taxonomies();
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$ref = array();
|
||||
$ref = array();
|
||||
$data = array();
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $taxonomies as $taxonomy ) {
|
||||
|
||||
foreach ( $taxonomies as $taxonomy ) {
|
||||
|
||||
// vars
|
||||
$object = get_taxonomy( $taxonomy );
|
||||
$label = $object->labels->singular_name;
|
||||
|
||||
$label = $object->labels->singular_name;
|
||||
|
||||
// append
|
||||
$data[ $taxonomy ] = $label;
|
||||
|
||||
|
||||
// increase counter
|
||||
if( !isset($ref[ $label ]) ) {
|
||||
if ( ! isset( $ref[ $label ] ) ) {
|
||||
$ref[ $label ] = 0;
|
||||
}
|
||||
$ref[ $label ]++;
|
||||
}
|
||||
|
||||
|
||||
// show taxonomy name next to label for shared labels
|
||||
foreach( $data as $taxonomy => $label ) {
|
||||
if( $ref[$label] > 1 ) {
|
||||
foreach ( $data as $taxonomy => $label ) {
|
||||
if ( $ref[ $label ] > 1 ) {
|
||||
$data[ $taxonomy ] .= ' (' . $taxonomy . ')';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_term_title
|
||||
*
|
||||
* Returns the title for this term object.
|
||||
*
|
||||
* @date 10/9/18
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param object $term The WP_Term object.
|
||||
* @return string
|
||||
*/
|
||||
* acf_get_term_title
|
||||
*
|
||||
* Returns the title for this term object.
|
||||
*
|
||||
* @date 10/9/18
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param object $term The WP_Term object.
|
||||
* @return string
|
||||
*/
|
||||
|
||||
function acf_get_term_title( $term ) {
|
||||
$title = $term->name;
|
||||
|
||||
|
||||
// Allow for empty name.
|
||||
if( $title === '' ) {
|
||||
$title = __('(no title)', 'acf');
|
||||
if ( $title === '' ) {
|
||||
$title = __( '(no title)', 'acf' );
|
||||
}
|
||||
|
||||
|
||||
// Prepend ancestors indentation.
|
||||
if( is_taxonomy_hierarchical($term->taxonomy) ) {
|
||||
if ( is_taxonomy_hierarchical( $term->taxonomy ) ) {
|
||||
$ancestors = get_ancestors( $term->term_id, $term->taxonomy );
|
||||
$title = str_repeat('- ', count($ancestors)) . $title;
|
||||
$title = str_repeat( '- ', count( $ancestors ) ) . $title;
|
||||
}
|
||||
|
||||
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_grouped_terms
|
||||
*
|
||||
* Returns an array of terms for the given query $args and groups by taxonomy name.
|
||||
*
|
||||
* @date 2/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $args An array of args used in the get_terms() function.
|
||||
* @return array
|
||||
*/
|
||||
* acf_get_grouped_terms
|
||||
*
|
||||
* Returns an array of terms for the given query $args and groups by taxonomy name.
|
||||
*
|
||||
* @date 2/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $args An array of args used in the get_terms() function.
|
||||
* @return array
|
||||
*/
|
||||
|
||||
function acf_get_grouped_terms( $args ) {
|
||||
|
||||
|
||||
// vars
|
||||
$data = array();
|
||||
|
||||
|
||||
// defaults
|
||||
$args = wp_parse_args($args, array(
|
||||
'taxonomy' => null,
|
||||
'hide_empty' => false,
|
||||
'update_term_meta_cache' => false,
|
||||
));
|
||||
|
||||
$args = wp_parse_args(
|
||||
$args,
|
||||
array(
|
||||
'taxonomy' => null,
|
||||
'hide_empty' => false,
|
||||
'update_term_meta_cache' => false,
|
||||
)
|
||||
);
|
||||
|
||||
// vars
|
||||
$taxonomies = acf_get_taxonomy_labels( acf_get_array($args['taxonomy']) );
|
||||
$is_single = (count($taxonomies) == 1);
|
||||
|
||||
$taxonomies = acf_get_taxonomy_labels( acf_get_array( $args['taxonomy'] ) );
|
||||
$is_single = ( count( $taxonomies ) == 1 );
|
||||
|
||||
// specify exact taxonomies required for _acf_terms_clauses() to work.
|
||||
$args['taxonomy'] = array_keys($taxonomies);
|
||||
|
||||
$args['taxonomy'] = array_keys( $taxonomies );
|
||||
|
||||
// add filter to group results by taxonomy
|
||||
if( !$is_single ) {
|
||||
add_filter('terms_clauses', '_acf_terms_clauses', 10, 3);
|
||||
if ( ! $is_single ) {
|
||||
add_filter( 'terms_clauses', '_acf_terms_clauses', 10, 3 );
|
||||
}
|
||||
|
||||
|
||||
// get terms
|
||||
$terms = get_terms( $args );
|
||||
|
||||
|
||||
// remove this filter (only once)
|
||||
if( !$is_single ) {
|
||||
remove_filter('terms_clauses', '_acf_terms_clauses', 10, 3);
|
||||
if ( ! $is_single ) {
|
||||
remove_filter( 'terms_clauses', '_acf_terms_clauses', 10, 3 );
|
||||
}
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $taxonomies as $taxonomy => $label ) {
|
||||
|
||||
foreach ( $taxonomies as $taxonomy => $label ) {
|
||||
|
||||
// vars
|
||||
$this_terms = array();
|
||||
|
||||
|
||||
// populate $this_terms
|
||||
foreach( $terms as $term ) {
|
||||
if( $term->taxonomy == $taxonomy ) {
|
||||
foreach ( $terms as $term ) {
|
||||
if ( $term->taxonomy == $taxonomy ) {
|
||||
$this_terms[] = $term;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// bail early if no $items
|
||||
if( empty($this_terms) ) continue;
|
||||
|
||||
if ( empty( $this_terms ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// sort into hierachial order
|
||||
// this will fail if a search has taken place because parents wont exist
|
||||
if( is_taxonomy_hierarchical($taxonomy) && empty($args['s'])) {
|
||||
|
||||
if ( is_taxonomy_hierarchical( $taxonomy ) && empty( $args['s'] ) ) {
|
||||
|
||||
// get all terms from this taxonomy
|
||||
$all_terms = get_terms(array_merge($args, array(
|
||||
'number' => 0,
|
||||
'offset' => 0,
|
||||
'taxonomy' => $taxonomy
|
||||
)));
|
||||
|
||||
$all_terms = get_terms(
|
||||
array_merge(
|
||||
$args,
|
||||
array(
|
||||
'number' => 0,
|
||||
'offset' => 0,
|
||||
'taxonomy' => $taxonomy,
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
// vars
|
||||
$length = count($this_terms);
|
||||
$length = count( $this_terms );
|
||||
$offset = 0;
|
||||
|
||||
|
||||
// find starting point (offset)
|
||||
foreach( $all_terms as $i => $term ) {
|
||||
if( $term->term_id == $this_terms[0]->term_id ) {
|
||||
foreach ( $all_terms as $i => $term ) {
|
||||
if ( $term->term_id == $this_terms[0]->term_id ) {
|
||||
$offset = $i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// order terms
|
||||
$parent = acf_maybe_get( $args, 'parent', 0 );
|
||||
$parent = acf_maybe_get( $args, 'child_of', $parent );
|
||||
$parent = acf_maybe_get( $args, 'parent', 0 );
|
||||
$parent = acf_maybe_get( $args, 'child_of', $parent );
|
||||
$ordered_terms = _get_term_children( $parent, $all_terms, $taxonomy );
|
||||
|
||||
|
||||
// compare aray lengths
|
||||
// if $ordered_posts is smaller than $all_posts, WP has lost posts during the get_page_children() function
|
||||
// this is possible when get_post( $args ) filter out parents (via taxonomy, meta and other search parameters)
|
||||
if( count($ordered_terms) == count($all_terms) ) {
|
||||
$this_terms = array_slice($ordered_terms, $offset, $length);
|
||||
if ( count( $ordered_terms ) == count( $all_terms ) ) {
|
||||
$this_terms = array_slice( $ordered_terms, $offset, $length );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// populate group
|
||||
$data[ $label ] = array();
|
||||
foreach( $this_terms as $term ) {
|
||||
foreach ( $this_terms as $term ) {
|
||||
$data[ $label ][ $term->term_id ] = $term;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* _acf_terms_clauses
|
||||
*
|
||||
* Used in the 'terms_clauses' filter to order terms by taxonomy name.
|
||||
*
|
||||
* @date 2/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $pieces Terms query SQL clauses.
|
||||
* @param array $taxonomies An array of taxonomies.
|
||||
* @param array $args An array of terms query arguments.
|
||||
* @return array $pieces
|
||||
*/
|
||||
* _acf_terms_clauses
|
||||
*
|
||||
* Used in the 'terms_clauses' filter to order terms by taxonomy name.
|
||||
*
|
||||
* @date 2/8/18
|
||||
* @since 5.7.2
|
||||
*
|
||||
* @param array $pieces Terms query SQL clauses.
|
||||
* @param array $taxonomies An array of taxonomies.
|
||||
* @param array $args An array of terms query arguments.
|
||||
* @return array $pieces
|
||||
*/
|
||||
|
||||
function _acf_terms_clauses( $pieces, $taxonomies, $args ) {
|
||||
|
||||
|
||||
// prepend taxonomy to 'orderby' SQL
|
||||
if( is_array($taxonomies) ) {
|
||||
$sql = "FIELD(tt.taxonomy,'" . implode("', '", array_map('esc_sql', $taxonomies)) . "')";
|
||||
$pieces['orderby'] = str_replace("ORDER BY", "ORDER BY $sql,", $pieces['orderby']);
|
||||
if ( is_array( $taxonomies ) ) {
|
||||
$sql = "FIELD(tt.taxonomy,'" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "')";
|
||||
$pieces['orderby'] = str_replace( 'ORDER BY', "ORDER BY $sql,", $pieces['orderby'] );
|
||||
}
|
||||
|
||||
// return
|
||||
|
||||
// return
|
||||
return $pieces;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_pretty_taxonomies
|
||||
*
|
||||
* Deprecated in favor of acf_get_taxonomy_labels() function.
|
||||
*
|
||||
* @date 7/10/13
|
||||
* @since 5.0.0
|
||||
* @deprecated 5.7.2
|
||||
*/
|
||||
* acf_get_pretty_taxonomies
|
||||
*
|
||||
* Deprecated in favor of acf_get_taxonomy_labels() function.
|
||||
*
|
||||
* @date 7/10/13
|
||||
* @since 5.0.0
|
||||
* @deprecated 5.7.2
|
||||
*/
|
||||
|
||||
function acf_get_pretty_taxonomies( $taxonomies = array() ) {
|
||||
return acf_get_taxonomy_labels( $taxonomies );
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_term
|
||||
*
|
||||
* Similar to get_term() but with some extra functionality.
|
||||
*
|
||||
* @date 19/8/18
|
||||
* @since 5.7.3
|
||||
*
|
||||
* @param mixed $term_id The term ID or a string of "taxonomy:slug".
|
||||
* @param string $taxonomy The taxonomyname.
|
||||
* @return WP_Term
|
||||
*/
|
||||
* acf_get_term
|
||||
*
|
||||
* Similar to get_term() but with some extra functionality.
|
||||
*
|
||||
* @date 19/8/18
|
||||
* @since 5.7.3
|
||||
*
|
||||
* @param mixed $term_id The term ID or a string of "taxonomy:slug".
|
||||
* @param string $taxonomy The taxonomyname.
|
||||
* @return WP_Term
|
||||
*/
|
||||
|
||||
function acf_get_term( $term_id, $taxonomy = '' ) {
|
||||
|
||||
|
||||
// allow $term_id parameter to be a string of "taxonomy:slug" or "taxonomy:id"
|
||||
if( is_string($term_id) && strpos($term_id, ':') ) {
|
||||
list( $taxonomy, $term_id ) = explode(':', $term_id);
|
||||
$term = get_term_by( 'slug', $term_id, $taxonomy );
|
||||
if( $term ) return $term;
|
||||
if ( is_string( $term_id ) && strpos( $term_id, ':' ) ) {
|
||||
list( $taxonomy, $term_id ) = explode( ':', $term_id );
|
||||
$term = get_term_by( 'slug', $term_id, $taxonomy );
|
||||
if ( $term ) {
|
||||
return $term;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return get_term( $term_id, $taxonomy );
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_encode_term
|
||||
*
|
||||
* Returns a "taxonomy:slug" string for a given WP_Term.
|
||||
*
|
||||
* @date 27/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param WP_Term $term The term object.
|
||||
* @return string
|
||||
*/
|
||||
* acf_encode_term
|
||||
*
|
||||
* Returns a "taxonomy:slug" string for a given WP_Term.
|
||||
*
|
||||
* @date 27/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param WP_Term $term The term object.
|
||||
* @return string
|
||||
*/
|
||||
function acf_encode_term( $term ) {
|
||||
return "{$term->taxonomy}:{$term->slug}";
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_decode_term
|
||||
*
|
||||
* Decodes a "taxonomy:slug" string into an array of taxonomy and slug.
|
||||
*
|
||||
* @date 27/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param WP_Term $term The term object.
|
||||
* @return string
|
||||
*/
|
||||
* acf_decode_term
|
||||
*
|
||||
* Decodes a "taxonomy:slug" string into an array of taxonomy and slug.
|
||||
*
|
||||
* @date 27/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param WP_Term $term The term object.
|
||||
* @return string
|
||||
*/
|
||||
function acf_decode_term( $string ) {
|
||||
if( is_string($string) && strpos($string, ':') ) {
|
||||
list( $taxonomy, $slug ) = explode(':', $string);
|
||||
if ( is_string( $string ) && strpos( $string, ':' ) ) {
|
||||
list( $taxonomy, $slug ) = explode( ':', $string );
|
||||
return compact( 'taxonomy', 'slug' );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_encoded_terms
|
||||
*
|
||||
* Returns an array of WP_Term objects from an array of encoded strings
|
||||
*
|
||||
* @date 9/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param array $values The array of encoded strings.
|
||||
* @return array
|
||||
*/
|
||||
* acf_get_encoded_terms
|
||||
*
|
||||
* Returns an array of WP_Term objects from an array of encoded strings
|
||||
*
|
||||
* @date 9/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param array $values The array of encoded strings.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_encoded_terms( $values ) {
|
||||
|
||||
|
||||
// vars
|
||||
$terms = array();
|
||||
|
||||
|
||||
// loop over values
|
||||
foreach( (array) $values as $value ) {
|
||||
|
||||
foreach ( (array) $values as $value ) {
|
||||
|
||||
// find term from string
|
||||
$term = acf_get_term( $value );
|
||||
|
||||
|
||||
// append
|
||||
if( $term instanceof WP_Term ) {
|
||||
if ( $term instanceof WP_Term ) {
|
||||
$terms[] = $term;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $terms;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_choices_from_terms
|
||||
*
|
||||
* Returns an array of choices from the terms provided.
|
||||
*
|
||||
* @date 8/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param array $values and array of WP_Terms objects or encoded strings.
|
||||
* @param string $format The value format (term_id, slug).
|
||||
* @return array
|
||||
*/
|
||||
* acf_get_choices_from_terms
|
||||
*
|
||||
* Returns an array of choices from the terms provided.
|
||||
*
|
||||
* @date 8/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param array $values and array of WP_Terms objects or encoded strings.
|
||||
* @param string $format The value format (term_id, slug).
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_choices_from_terms( $terms, $format = 'term_id' ) {
|
||||
|
||||
|
||||
// vars
|
||||
$groups = array();
|
||||
|
||||
|
||||
// get taxonomy lables
|
||||
$labels = acf_get_taxonomy_labels();
|
||||
|
||||
|
||||
// convert array of encoded strings to terms
|
||||
$term = reset($terms);
|
||||
if( !$term instanceof WP_Term ) {
|
||||
$term = reset( $terms );
|
||||
if ( ! $term instanceof WP_Term ) {
|
||||
$terms = acf_get_encoded_terms( $terms );
|
||||
}
|
||||
|
||||
|
||||
// loop over terms
|
||||
foreach( $terms as $term ) {
|
||||
$group = $labels[ $term->taxonomy ];
|
||||
$choice = acf_get_choice_from_term( $term, $format );
|
||||
foreach ( $terms as $term ) {
|
||||
$group = $labels[ $term->taxonomy ];
|
||||
$choice = acf_get_choice_from_term( $term, $format );
|
||||
$groups[ $group ][ $choice['id'] ] = $choice['text'];
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $groups;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_choices_from_grouped_terms
|
||||
*
|
||||
* Returns an array of choices from the grouped terms provided.
|
||||
*
|
||||
* @date 8/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param array $value A grouped array of WP_Terms objects.
|
||||
* @param string $format The value format (term_id, slug).
|
||||
* @return array
|
||||
*/
|
||||
* acf_get_choices_from_grouped_terms
|
||||
*
|
||||
* Returns an array of choices from the grouped terms provided.
|
||||
*
|
||||
* @date 8/9/18
|
||||
* @since 5.7.5
|
||||
*
|
||||
* @param array $value A grouped array of WP_Terms objects.
|
||||
* @param string $format The value format (term_id, slug).
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_choices_from_grouped_terms( $value, $format = 'term_id' ) {
|
||||
|
||||
|
||||
// vars
|
||||
$groups = array();
|
||||
|
||||
|
||||
// loop over values
|
||||
foreach( $value as $group => $terms ) {
|
||||
foreach ( $value as $group => $terms ) {
|
||||
$groups[ $group ] = array();
|
||||
foreach( $terms as $term_id => $term ) {
|
||||
$choice = acf_get_choice_from_term( $term, $format );
|
||||
foreach ( $terms as $term_id => $term ) {
|
||||
$choice = acf_get_choice_from_term( $term, $format );
|
||||
$groups[ $group ][ $choice['id'] ] = $choice['text'];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $groups;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf_get_choice_from_term
|
||||
*
|
||||
* Returns an array containing the id and text for this item.
|
||||
*
|
||||
* @date 10/9/18
|
||||
* @since 5.7.6
|
||||
*
|
||||
* @param object $item The item object such as WP_Post or WP_Term.
|
||||
* @param string $format The value format (term_id, slug)
|
||||
* @return array
|
||||
*/
|
||||
* acf_get_choice_from_term
|
||||
*
|
||||
* Returns an array containing the id and text for this item.
|
||||
*
|
||||
* @date 10/9/18
|
||||
* @since 5.7.6
|
||||
*
|
||||
* @param object $item The item object such as WP_Post or WP_Term.
|
||||
* @param string $format The value format (term_id, slug)
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_choice_from_term( $term, $format = 'term_id' ) {
|
||||
|
||||
|
||||
// vars
|
||||
$id = $term->term_id;
|
||||
$id = $term->term_id;
|
||||
$text = acf_get_term_title( $term );
|
||||
|
||||
|
||||
// return format
|
||||
if( $format == 'slug' ) {
|
||||
$id = acf_encode_term($term);
|
||||
if ( $format == 'slug' ) {
|
||||
$id = acf_encode_term( $term );
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return array(
|
||||
'id' => $id,
|
||||
'text' => $text
|
||||
'id' => $id,
|
||||
'text' => $text,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -494,15 +508,15 @@ function acf_get_choice_from_term( $term, $format = 'term_id' ) {
|
|||
* Returns a valid post_id string for a given term and taxonomy.
|
||||
* No longer needed since WP introduced the termmeta table in WP 4.4.
|
||||
*
|
||||
* @date 6/2/17
|
||||
* @since 5.5.6
|
||||
* @date 6/2/17
|
||||
* @since 5.5.6
|
||||
* @deprecated 5.9.2
|
||||
*
|
||||
* @param $taxonomy (string) The taxonomy type.
|
||||
* @param $term_id (int) The term ID.
|
||||
* @return (string)
|
||||
* @param $taxonomy (string) The taxonomy type.
|
||||
* @param $term_id (int) The term ID.
|
||||
* @return (string)
|
||||
*/
|
||||
function acf_get_term_post_id( $taxonomy, $term_id ) {
|
||||
_deprecated_function( __FUNCTION__, '5.9.2', 'string format term_%d' );
|
||||
return 'term_' . $term_id;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
1019
includes/assets.php
1019
includes/assets.php
File diff suppressed because it is too large
Load Diff
|
|
@ -1,354 +1,356 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
|
||||
|
||||
if( ! class_exists('ACF_Data') ) :
|
||||
|
||||
class ACF_Data {
|
||||
|
||||
/** @var string Unique identifier. */
|
||||
var $cid = '';
|
||||
|
||||
/** @var array Storage for data. */
|
||||
var $data = array();
|
||||
|
||||
/** @var array Storage for data aliases. */
|
||||
var $aliases = array();
|
||||
|
||||
/** @var bool Enables unique data per site. */
|
||||
var $multisite = false;
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param array $data Optional data to set.
|
||||
* @return void
|
||||
*/
|
||||
function __construct( $data = false ) {
|
||||
|
||||
// Set cid.
|
||||
$this->cid = acf_uniqid();
|
||||
|
||||
// Set data.
|
||||
if( $data ) {
|
||||
$this->set( $data );
|
||||
}
|
||||
|
||||
// Initialize.
|
||||
$this->initialize();
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* Called during constructor to setup class functionality.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function initialize() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* prop
|
||||
*
|
||||
* Sets a property for the given name and returns $this for chaining.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param (string|array) $name The data name or an array of data.
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function prop( $name = '', $value = null ) {
|
||||
|
||||
// Update property.
|
||||
$this->{$name} = $value;
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* _key
|
||||
*
|
||||
* Returns a key for the given name allowing aliasses to work.
|
||||
*
|
||||
* @date 18/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function _key( $name = '' ) {
|
||||
return isset($this->aliases[ $name ]) ? $this->aliases[ $name ] : $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* has
|
||||
*
|
||||
* Returns true if this has data for the given name.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The data name.
|
||||
* @return boolean
|
||||
*/
|
||||
function has( $name = '' ) {
|
||||
$key = $this->_key($name);
|
||||
return isset($this->data[ $key ]);
|
||||
}
|
||||
|
||||
/**
|
||||
* is
|
||||
*
|
||||
* Similar to has() but does not check aliases.
|
||||
*
|
||||
* @date 7/2/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function is( $key = '' ) {
|
||||
return isset($this->data[ $key ]);
|
||||
}
|
||||
|
||||
/**
|
||||
* get
|
||||
*
|
||||
* Returns data for the given name of null if doesn't exist.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The data name.
|
||||
* @return mixed
|
||||
*/
|
||||
function get( $name = false ) {
|
||||
|
||||
// Get all.
|
||||
if( $name === false ) {
|
||||
return $this->data;
|
||||
|
||||
// Get specific.
|
||||
} else {
|
||||
$key = $this->_key($name);
|
||||
return isset($this->data[ $key ]) ? $this->data[ $key ] : null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get_data
|
||||
*
|
||||
* Returns an array of all data.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return array
|
||||
*/
|
||||
function get_data() {
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* set
|
||||
*
|
||||
* Sets data for the given name and returns $this for chaining.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param (string|array) $name The data name or an array of data.
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function set( $name = '', $value = null ) {
|
||||
|
||||
// Set multiple.
|
||||
if( is_array($name) ) {
|
||||
$this->data = array_merge($this->data, $name);
|
||||
|
||||
// Set single.
|
||||
} else {
|
||||
$this->data[ $name ] = $value;
|
||||
}
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* append
|
||||
*
|
||||
* Appends data for the given name and returns $this for chaining.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function append( $value = null ) {
|
||||
|
||||
// Append.
|
||||
$this->data[] = $value;
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* remove
|
||||
*
|
||||
* Removes data for the given name.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The data name.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function remove( $name = '' ) {
|
||||
|
||||
// Remove data.
|
||||
unset( $this->data[ $name ] );
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* reset
|
||||
*
|
||||
* Resets the data.
|
||||
*
|
||||
* @date 22/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function reset() {
|
||||
$this->data = array();
|
||||
$this->aliases = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* count
|
||||
*
|
||||
* Returns the data count.
|
||||
*
|
||||
* @date 23/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return int
|
||||
*/
|
||||
function count() {
|
||||
return count( $this->data );
|
||||
}
|
||||
|
||||
/**
|
||||
* query
|
||||
*
|
||||
* Returns a filtered array of data based on the set of key => value arguments.
|
||||
*
|
||||
* @date 23/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return int
|
||||
*/
|
||||
function query( $args, $operator = 'AND' ) {
|
||||
return wp_list_filter( $this->data, $args, $operator );
|
||||
}
|
||||
|
||||
/**
|
||||
* alias
|
||||
*
|
||||
* Sets an alias for the given name allowing data to be found via multiple identifiers.
|
||||
*
|
||||
* @date 18/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function alias( $name = '' /*, $alias, $alias2, etc */ ) {
|
||||
|
||||
// Get all aliases.
|
||||
$args = func_get_args();
|
||||
array_shift( $args );
|
||||
|
||||
// Loop over aliases and add to data.
|
||||
foreach( $args as $alias ) {
|
||||
$this->aliases[ $alias ] = $name;
|
||||
}
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* switch_site
|
||||
*
|
||||
* Triggered when switching between sites on a multisite installation.
|
||||
*
|
||||
* @date 13/2/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param int $site_id New blog ID.
|
||||
* @param int prev_blog_id Prev blog ID.
|
||||
* @return void
|
||||
*/
|
||||
function switch_site( $site_id, $prev_site_id ) {
|
||||
|
||||
// Bail early if not multisite compatible.
|
||||
if( !$this->multisite ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Bail early if no change in blog ID.
|
||||
if( $site_id === $prev_site_id ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create storage.
|
||||
if( !isset($this->site_data) ) {
|
||||
$this->site_data = array();
|
||||
$this->site_aliases = array();
|
||||
}
|
||||
|
||||
// Save state.
|
||||
$this->site_data[ $prev_site_id ] = $this->data;
|
||||
$this->site_aliases[ $prev_site_id ] = $this->aliases;
|
||||
|
||||
// Reset state.
|
||||
$this->data = array();
|
||||
$this->aliases = array();
|
||||
|
||||
// Load state.
|
||||
if( isset($this->site_data[ $site_id ]) ) {
|
||||
$this->data = $this->site_data[ $site_id ];
|
||||
$this->aliases = $this->site_aliases[ $site_id ];
|
||||
unset( $this->site_data[ $site_id ] );
|
||||
unset( $this->site_aliases[ $site_id ] );
|
||||
}
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'ACF_Data' ) ) :
|
||||
|
||||
class ACF_Data {
|
||||
|
||||
/** @var string Unique identifier. */
|
||||
var $cid = '';
|
||||
|
||||
/** @var array Storage for data. */
|
||||
var $data = array();
|
||||
|
||||
/** @var array Storage for data aliases. */
|
||||
var $aliases = array();
|
||||
|
||||
/** @var bool Enables unique data per site. */
|
||||
var $multisite = false;
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param array $data Optional data to set.
|
||||
* @return void
|
||||
*/
|
||||
function __construct( $data = false ) {
|
||||
|
||||
// Set cid.
|
||||
$this->cid = acf_uniqid();
|
||||
|
||||
// Set data.
|
||||
if ( $data ) {
|
||||
$this->set( $data );
|
||||
}
|
||||
|
||||
// Initialize.
|
||||
$this->initialize();
|
||||
}
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* Called during constructor to setup class functionality.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function initialize() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* prop
|
||||
*
|
||||
* Sets a property for the given name and returns $this for chaining.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param (string|array) $name The data name or an array of data.
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function prop( $name = '', $value = null ) {
|
||||
|
||||
// Update property.
|
||||
$this->{$name} = $value;
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* _key
|
||||
*
|
||||
* Returns a key for the given name allowing aliasses to work.
|
||||
*
|
||||
* @date 18/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function _key( $name = '' ) {
|
||||
return isset( $this->aliases[ $name ] ) ? $this->aliases[ $name ] : $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* has
|
||||
*
|
||||
* Returns true if this has data for the given name.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The data name.
|
||||
* @return boolean
|
||||
*/
|
||||
function has( $name = '' ) {
|
||||
$key = $this->_key( $name );
|
||||
return isset( $this->data[ $key ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* is
|
||||
*
|
||||
* Similar to has() but does not check aliases.
|
||||
*
|
||||
* @date 7/2/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function is( $key = '' ) {
|
||||
return isset( $this->data[ $key ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* get
|
||||
*
|
||||
* Returns data for the given name of null if doesn't exist.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The data name.
|
||||
* @return mixed
|
||||
*/
|
||||
function get( $name = false ) {
|
||||
|
||||
// Get all.
|
||||
if ( $name === false ) {
|
||||
return $this->data;
|
||||
|
||||
// Get specific.
|
||||
} else {
|
||||
$key = $this->_key( $name );
|
||||
return isset( $this->data[ $key ] ) ? $this->data[ $key ] : null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get_data
|
||||
*
|
||||
* Returns an array of all data.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return array
|
||||
*/
|
||||
function get_data() {
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* set
|
||||
*
|
||||
* Sets data for the given name and returns $this for chaining.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param (string|array) $name The data name or an array of data.
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function set( $name = '', $value = null ) {
|
||||
|
||||
// Set multiple.
|
||||
if ( is_array( $name ) ) {
|
||||
$this->data = array_merge( $this->data, $name );
|
||||
|
||||
// Set single.
|
||||
} else {
|
||||
$this->data[ $name ] = $value;
|
||||
}
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* append
|
||||
*
|
||||
* Appends data for the given name and returns $this for chaining.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param mixed $value The data value.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function append( $value = null ) {
|
||||
|
||||
// Append.
|
||||
$this->data[] = $value;
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* remove
|
||||
*
|
||||
* Removes data for the given name.
|
||||
*
|
||||
* @date 9/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param string $name The data name.
|
||||
* @return ACF_Data
|
||||
*/
|
||||
function remove( $name = '' ) {
|
||||
|
||||
// Remove data.
|
||||
unset( $this->data[ $name ] );
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* reset
|
||||
*
|
||||
* Resets the data.
|
||||
*
|
||||
* @date 22/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function reset() {
|
||||
$this->data = array();
|
||||
$this->aliases = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* count
|
||||
*
|
||||
* Returns the data count.
|
||||
*
|
||||
* @date 23/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return int
|
||||
*/
|
||||
function count() {
|
||||
return count( $this->data );
|
||||
}
|
||||
|
||||
/**
|
||||
* query
|
||||
*
|
||||
* Returns a filtered array of data based on the set of key => value arguments.
|
||||
*
|
||||
* @date 23/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param void
|
||||
* @return int
|
||||
*/
|
||||
function query( $args, $operator = 'AND' ) {
|
||||
return wp_list_filter( $this->data, $args, $operator );
|
||||
}
|
||||
|
||||
/**
|
||||
* alias
|
||||
*
|
||||
* Sets an alias for the given name allowing data to be found via multiple identifiers.
|
||||
*
|
||||
* @date 18/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function alias( $name = '' /*, $alias, $alias2, etc */ ) {
|
||||
|
||||
// Get all aliases.
|
||||
$args = func_get_args();
|
||||
array_shift( $args );
|
||||
|
||||
// Loop over aliases and add to data.
|
||||
foreach ( $args as $alias ) {
|
||||
$this->aliases[ $alias ] = $name;
|
||||
}
|
||||
|
||||
// Return this for chaining.
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* switch_site
|
||||
*
|
||||
* Triggered when switching between sites on a multisite installation.
|
||||
*
|
||||
* @date 13/2/19
|
||||
* @since 5.7.11
|
||||
*
|
||||
* @param int $site_id New blog ID.
|
||||
* @param int prev_blog_id Prev blog ID.
|
||||
* @return void
|
||||
*/
|
||||
function switch_site( $site_id, $prev_site_id ) {
|
||||
|
||||
// Bail early if not multisite compatible.
|
||||
if ( ! $this->multisite ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Bail early if no change in blog ID.
|
||||
if ( $site_id === $prev_site_id ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create storage.
|
||||
if ( ! isset( $this->site_data ) ) {
|
||||
$this->site_data = array();
|
||||
$this->site_aliases = array();
|
||||
}
|
||||
|
||||
// Save state.
|
||||
$this->site_data[ $prev_site_id ] = $this->data;
|
||||
$this->site_aliases[ $prev_site_id ] = $this->aliases;
|
||||
|
||||
// Reset state.
|
||||
$this->data = array();
|
||||
$this->aliases = array();
|
||||
|
||||
// Load state.
|
||||
if ( isset( $this->site_data[ $site_id ] ) ) {
|
||||
$this->data = $this->site_data[ $site_id ];
|
||||
$this->aliases = $this->site_aliases[ $site_id ];
|
||||
unset( $this->site_data[ $site_id ] );
|
||||
unset( $this->site_aliases[ $site_id ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
endif; // class_exists check
|
||||
|
|
|
|||
|
|
@ -1,470 +1,474 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF_Compatibility') ) :
|
||||
|
||||
class ACF_Compatibility {
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 30/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_filter('acf/validate_field', array($this, 'validate_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=textarea', array($this, 'validate_textarea_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=relationship', array($this, 'validate_relationship_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=post_object', array($this, 'validate_relationship_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=page_link', array($this, 'validate_relationship_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=image', array($this, 'validate_image_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=file', array($this, 'validate_image_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=wysiwyg', array($this, 'validate_wysiwyg_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=date_picker', array($this, 'validate_date_picker_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=taxonomy', array($this, 'validate_taxonomy_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=date_time_picker', array($this, 'validate_date_time_picker_field'), 20, 1);
|
||||
add_filter('acf/validate_field/type=user', array($this, 'validate_user_field'), 20, 1);
|
||||
add_filter('acf/validate_field_group', array($this, 'validate_field_group'), 20, 1);
|
||||
|
||||
// Modify field wrapper attributes
|
||||
add_filter('acf/field_wrapper_attributes', array($this, 'field_wrapper_attributes'), 20, 2);
|
||||
|
||||
// location
|
||||
add_filter('acf/location/validate_rule/type=post_taxonomy', array($this, 'validate_post_taxonomy_location_rule'), 20, 1);
|
||||
add_filter('acf/location/validate_rule/type=post_category', array($this, 'validate_post_taxonomy_location_rule'), 20, 1);
|
||||
|
||||
// Update settings
|
||||
add_action('acf/init', array($this, 'init'));
|
||||
}
|
||||
|
||||
/**
|
||||
* init
|
||||
*
|
||||
* Adds compatibility for deprecated settings.
|
||||
*
|
||||
* @date 10/6/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function init() {
|
||||
|
||||
// Update "show_admin" setting based on defined constant.
|
||||
if( defined('ACF_LITE') && ACF_LITE ) {
|
||||
acf_update_setting( 'show_admin', false );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* field_wrapper_attributes
|
||||
*
|
||||
* Adds compatibility with deprecated field wrap attributes.
|
||||
*
|
||||
* @date 21/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param array $wrapper The wrapper attributes array.
|
||||
* @param array $field The field array.
|
||||
*/
|
||||
function field_wrapper_attributes( $wrapper, $field ) {
|
||||
|
||||
// Check compatibility setting.
|
||||
if( acf_get_compatibility('field_wrapper_class') ) {
|
||||
$wrapper['class'] .= " field_type-{$field['type']}";
|
||||
if( $field['key'] ) {
|
||||
$wrapper['class'] .= " field_key-{$field['key']}";
|
||||
}
|
||||
}
|
||||
|
||||
// Return wrapper.
|
||||
return $wrapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_field( $field ) {
|
||||
|
||||
// conditional logic data structure changed to groups in version 5.0.0
|
||||
// convert previous data (status, rules, allorany) into groups
|
||||
if( isset($field['conditional_logic']['status']) ) {
|
||||
|
||||
// check status
|
||||
if( $field['conditional_logic']['status'] ) {
|
||||
$field['conditional_logic'] = acf_convert_rules_to_groups($field['conditional_logic']['rules'], $field['conditional_logic']['allorany']);
|
||||
} else {
|
||||
$field['conditional_logic'] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_textarea_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_textarea_field( $field ) {
|
||||
|
||||
// formatting has been removed
|
||||
$formatting = acf_extract_var( $field, 'formatting' );
|
||||
if( $formatting === 'br' ) {
|
||||
$field['new_lines'] = 'br';
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_relationship_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_relationship_field( $field ) {
|
||||
|
||||
// remove 'all' from post_type
|
||||
if( acf_in_array('all', $field['post_type']) ) {
|
||||
$field['post_type'] = array();
|
||||
}
|
||||
|
||||
// remove 'all' from taxonomy
|
||||
if( acf_in_array('all', $field['taxonomy']) ) {
|
||||
$field['taxonomy'] = array();
|
||||
}
|
||||
|
||||
// result_elements is now elements
|
||||
if( isset($field['result_elements']) ) {
|
||||
$field['elements'] = acf_extract_var( $field, 'result_elements' );
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_image_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_image_field( $field ) {
|
||||
|
||||
// save_format is now return_format
|
||||
if( isset($field['save_format']) ) {
|
||||
$field['return_format'] = acf_extract_var( $field, 'save_format' );
|
||||
}
|
||||
|
||||
// object is now array
|
||||
if( $field['return_format'] == 'object' ) {
|
||||
$field['return_format'] = 'array';
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_wysiwyg_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_wysiwyg_field( $field ) {
|
||||
|
||||
// media_upload is now numeric
|
||||
if( $field['media_upload'] === 'yes' ) {
|
||||
$field['media_upload'] = 1;
|
||||
} elseif( $field['media_upload'] === 'no' ) {
|
||||
$field['media_upload'] = 0;
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_date_picker_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_date_picker_field( $field ) {
|
||||
|
||||
// date_format has changed to display_format
|
||||
if( isset($field['date_format']) ) {
|
||||
|
||||
// extract vars
|
||||
$date_format = $field['date_format'];
|
||||
$display_format = $field['display_format'];
|
||||
|
||||
// convert from js to php
|
||||
$display_format = acf_convert_date_to_php( $display_format );
|
||||
|
||||
// append settings
|
||||
$field['display_format'] = $display_format;
|
||||
$field['save_format'] = $date_format;
|
||||
|
||||
// clean up
|
||||
unset($field['date_format']);
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_taxonomy_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.2.7
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_taxonomy_field( $field ) {
|
||||
|
||||
// load_save_terms deprecated in favour of separate save_terms
|
||||
if( isset($field['load_save_terms']) ) {
|
||||
$field['save_terms'] = acf_extract_var( $field, 'load_save_terms' );
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_date_time_picker_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.2.7
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_date_time_picker_field( $field ) {
|
||||
|
||||
// 3rd party date time picker
|
||||
// https://github.com/soderlind/acf-field-date-time-picker
|
||||
if( !empty($field['time_format']) ) {
|
||||
|
||||
// extract vars
|
||||
$time_format = acf_extract_var( $field, 'time_format' );
|
||||
$date_format = acf_extract_var( $field, 'date_format' );
|
||||
$get_as_timestamp = acf_extract_var( $field, 'get_as_timestamp' );
|
||||
|
||||
// convert from js to php
|
||||
$time_format = acf_convert_time_to_php( $time_format );
|
||||
$date_format = acf_convert_date_to_php( $date_format );
|
||||
|
||||
// append settings
|
||||
$field['return_format'] = $date_format . ' ' . $time_format;
|
||||
$field['display_format'] = $date_format . ' ' . $time_format;
|
||||
|
||||
// timestamp
|
||||
if( $get_as_timestamp === 'true' ) {
|
||||
$field['return_format'] = 'U';
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_user_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.2.7
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_user_field( $field ) {
|
||||
|
||||
// remove 'all' from roles
|
||||
if( acf_in_array('all', $field['role']) ) {
|
||||
$field['role'] = '';
|
||||
}
|
||||
|
||||
// field_type removed in favour of multiple
|
||||
if( isset($field['field_type']) ) {
|
||||
|
||||
// extract vars
|
||||
$field_type = acf_extract_var( $field, 'field_type' );
|
||||
|
||||
// multiple
|
||||
if( $field_type === 'multi_select' ) {
|
||||
$field['multiple'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/*
|
||||
* validate_field_group
|
||||
*
|
||||
* This function will provide compatibility with ACF4 field groups
|
||||
*
|
||||
* @type function
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $field_group (array)
|
||||
* @return $field_group
|
||||
*/
|
||||
function validate_field_group( $field_group ) {
|
||||
|
||||
// vars
|
||||
$version = 5;
|
||||
|
||||
// field group key was added in version 5.0.0
|
||||
// detect ACF4 data and generate key
|
||||
if( !$field_group['key'] ) {
|
||||
$version = 4;
|
||||
$field_group['key'] = isset($field_group['id']) ? "group_{$field_group['id']}" : uniqid('group_');
|
||||
}
|
||||
|
||||
// prior to version 5.0.0, settings were saved in an 'options' array
|
||||
// extract and merge options into the field group
|
||||
if( isset($field_group['options']) ) {
|
||||
$options = acf_extract_var($field_group, 'options');
|
||||
$field_group = array_merge($field_group, $options);
|
||||
}
|
||||
|
||||
// location data structure changed to groups in version 4.1.0
|
||||
// convert previous data (rules, allorany) into groups
|
||||
if( isset($field_group['location']['rules']) ) {
|
||||
$field_group['location'] = acf_convert_rules_to_groups($field_group['location']['rules'], $field_group['location']['allorany']);
|
||||
}
|
||||
|
||||
// some location rule names have changed in version 5.0.0
|
||||
// loop over location data and modify rules
|
||||
$replace = array(
|
||||
'taxonomy' => 'post_taxonomy',
|
||||
'ef_media' => 'attachment',
|
||||
'ef_taxonomy' => 'taxonomy',
|
||||
'ef_user' => 'user_role',
|
||||
'user_type' => 'current_user_role' // 5.2.0
|
||||
);
|
||||
|
||||
// only replace 'taxonomy' rule if is an ACF4 field group
|
||||
if( $version > 4 ) {
|
||||
unset($replace['taxonomy']);
|
||||
}
|
||||
|
||||
// loop over location groups
|
||||
if( $field_group['location'] ) {
|
||||
foreach( $field_group['location'] as $i => $group ) {
|
||||
|
||||
// loop over group rules
|
||||
if( $group ) {
|
||||
foreach( $group as $j => $rule ) {
|
||||
|
||||
// migrate param
|
||||
if( isset($replace[ $rule['param'] ]) ) {
|
||||
$field_group['location'][ $i ][ $j ]['param'] = $replace[ $rule['param'] ];
|
||||
}
|
||||
}}
|
||||
}}
|
||||
|
||||
// change layout to style (v5.0.0)
|
||||
if( isset($field_group['layout']) ) {
|
||||
$field_group['style'] = acf_extract_var($field_group, 'layout');
|
||||
}
|
||||
|
||||
// change no_box to seamless (v5.0.0)
|
||||
if( $field_group['style'] === 'no_box' ) {
|
||||
$field_group['style'] = 'seamless';
|
||||
}
|
||||
|
||||
//return
|
||||
return $field_group;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_post_taxonomy_location_rule
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 27/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function validate_post_taxonomy_location_rule( $rule ) {
|
||||
|
||||
// previous versions of ACF (v4.4.12) saved value as term_id
|
||||
// convert term_id into "taxonomy:slug" string
|
||||
if( is_numeric($rule['value']) ) {
|
||||
$term = acf_get_term( $rule['value'] );
|
||||
if( $term ) {
|
||||
$rule['value'] = acf_encode_term($term);
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $rule;
|
||||
}
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
acf_new_instance('ACF_Compatibility');
|
||||
if ( ! class_exists( 'ACF_Compatibility' ) ) :
|
||||
|
||||
class ACF_Compatibility {
|
||||
|
||||
/**
|
||||
* __construct
|
||||
*
|
||||
* Sets up the class functionality.
|
||||
*
|
||||
* @date 30/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_filter( 'acf/validate_field', array( $this, 'validate_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=textarea', array( $this, 'validate_textarea_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=relationship', array( $this, 'validate_relationship_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=post_object', array( $this, 'validate_relationship_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=page_link', array( $this, 'validate_relationship_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=image', array( $this, 'validate_image_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=file', array( $this, 'validate_image_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=wysiwyg', array( $this, 'validate_wysiwyg_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=date_picker', array( $this, 'validate_date_picker_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=taxonomy', array( $this, 'validate_taxonomy_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=date_time_picker', array( $this, 'validate_date_time_picker_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field/type=user', array( $this, 'validate_user_field' ), 20, 1 );
|
||||
add_filter( 'acf/validate_field_group', array( $this, 'validate_field_group' ), 20, 1 );
|
||||
|
||||
// Modify field wrapper attributes
|
||||
add_filter( 'acf/field_wrapper_attributes', array( $this, 'field_wrapper_attributes' ), 20, 2 );
|
||||
|
||||
// location
|
||||
add_filter( 'acf/location/validate_rule/type=post_taxonomy', array( $this, 'validate_post_taxonomy_location_rule' ), 20, 1 );
|
||||
add_filter( 'acf/location/validate_rule/type=post_category', array( $this, 'validate_post_taxonomy_location_rule' ), 20, 1 );
|
||||
|
||||
// Update settings
|
||||
add_action( 'acf/init', array( $this, 'init' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* init
|
||||
*
|
||||
* Adds compatibility for deprecated settings.
|
||||
*
|
||||
* @date 10/6/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
function init() {
|
||||
|
||||
// Update "show_admin" setting based on defined constant.
|
||||
if ( defined( 'ACF_LITE' ) && ACF_LITE ) {
|
||||
acf_update_setting( 'show_admin', false );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* field_wrapper_attributes
|
||||
*
|
||||
* Adds compatibility with deprecated field wrap attributes.
|
||||
*
|
||||
* @date 21/1/19
|
||||
* @since 5.7.10
|
||||
*
|
||||
* @param array $wrapper The wrapper attributes array.
|
||||
* @param array $field The field array.
|
||||
*/
|
||||
function field_wrapper_attributes( $wrapper, $field ) {
|
||||
|
||||
// Check compatibility setting.
|
||||
if ( acf_get_compatibility( 'field_wrapper_class' ) ) {
|
||||
$wrapper['class'] .= " field_type-{$field['type']}";
|
||||
if ( $field['key'] ) {
|
||||
$wrapper['class'] .= " field_key-{$field['key']}";
|
||||
}
|
||||
}
|
||||
|
||||
// Return wrapper.
|
||||
return $wrapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_field( $field ) {
|
||||
|
||||
// conditional logic data structure changed to groups in version 5.0.0
|
||||
// convert previous data (status, rules, allorany) into groups
|
||||
if ( isset( $field['conditional_logic']['status'] ) ) {
|
||||
|
||||
// check status
|
||||
if ( $field['conditional_logic']['status'] ) {
|
||||
$field['conditional_logic'] = acf_convert_rules_to_groups( $field['conditional_logic']['rules'], $field['conditional_logic']['allorany'] );
|
||||
} else {
|
||||
$field['conditional_logic'] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_textarea_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_textarea_field( $field ) {
|
||||
|
||||
// formatting has been removed
|
||||
$formatting = acf_extract_var( $field, 'formatting' );
|
||||
if ( $formatting === 'br' ) {
|
||||
$field['new_lines'] = 'br';
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_relationship_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_relationship_field( $field ) {
|
||||
|
||||
// remove 'all' from post_type
|
||||
if ( acf_in_array( 'all', $field['post_type'] ) ) {
|
||||
$field['post_type'] = array();
|
||||
}
|
||||
|
||||
// remove 'all' from taxonomy
|
||||
if ( acf_in_array( 'all', $field['taxonomy'] ) ) {
|
||||
$field['taxonomy'] = array();
|
||||
}
|
||||
|
||||
// result_elements is now elements
|
||||
if ( isset( $field['result_elements'] ) ) {
|
||||
$field['elements'] = acf_extract_var( $field, 'result_elements' );
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_image_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_image_field( $field ) {
|
||||
|
||||
// save_format is now return_format
|
||||
if ( isset( $field['save_format'] ) ) {
|
||||
$field['return_format'] = acf_extract_var( $field, 'save_format' );
|
||||
}
|
||||
|
||||
// object is now array
|
||||
if ( $field['return_format'] == 'object' ) {
|
||||
$field['return_format'] = 'array';
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_wysiwyg_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_wysiwyg_field( $field ) {
|
||||
|
||||
// media_upload is now numeric
|
||||
if ( $field['media_upload'] === 'yes' ) {
|
||||
$field['media_upload'] = 1;
|
||||
} elseif ( $field['media_upload'] === 'no' ) {
|
||||
$field['media_upload'] = 0;
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_date_picker_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_date_picker_field( $field ) {
|
||||
|
||||
// date_format has changed to display_format
|
||||
if ( isset( $field['date_format'] ) ) {
|
||||
|
||||
// extract vars
|
||||
$date_format = $field['date_format'];
|
||||
$display_format = $field['display_format'];
|
||||
|
||||
// convert from js to php
|
||||
$display_format = acf_convert_date_to_php( $display_format );
|
||||
|
||||
// append settings
|
||||
$field['display_format'] = $display_format;
|
||||
$field['save_format'] = $date_format;
|
||||
|
||||
// clean up
|
||||
unset( $field['date_format'] );
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_taxonomy_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.2.7
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_taxonomy_field( $field ) {
|
||||
|
||||
// load_save_terms deprecated in favour of separate save_terms
|
||||
if ( isset( $field['load_save_terms'] ) ) {
|
||||
$field['save_terms'] = acf_extract_var( $field, 'load_save_terms' );
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_date_time_picker_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.2.7
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_date_time_picker_field( $field ) {
|
||||
|
||||
// 3rd party date time picker
|
||||
// https://github.com/soderlind/acf-field-date-time-picker
|
||||
if ( ! empty( $field['time_format'] ) ) {
|
||||
|
||||
// extract vars
|
||||
$time_format = acf_extract_var( $field, 'time_format' );
|
||||
$date_format = acf_extract_var( $field, 'date_format' );
|
||||
$get_as_timestamp = acf_extract_var( $field, 'get_as_timestamp' );
|
||||
|
||||
// convert from js to php
|
||||
$time_format = acf_convert_time_to_php( $time_format );
|
||||
$date_format = acf_convert_date_to_php( $date_format );
|
||||
|
||||
// append settings
|
||||
$field['return_format'] = $date_format . ' ' . $time_format;
|
||||
$field['display_format'] = $date_format . ' ' . $time_format;
|
||||
|
||||
// timestamp
|
||||
if ( $get_as_timestamp === 'true' ) {
|
||||
$field['return_format'] = 'U';
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_user_field
|
||||
*
|
||||
* Adds compatibility with deprecated settings
|
||||
*
|
||||
* @date 23/04/2014
|
||||
* @since 5.2.7
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return array $field
|
||||
*/
|
||||
function validate_user_field( $field ) {
|
||||
|
||||
// remove 'all' from roles
|
||||
if ( acf_in_array( 'all', $field['role'] ) ) {
|
||||
$field['role'] = '';
|
||||
}
|
||||
|
||||
// field_type removed in favour of multiple
|
||||
if ( isset( $field['field_type'] ) ) {
|
||||
|
||||
// extract vars
|
||||
$field_type = acf_extract_var( $field, 'field_type' );
|
||||
|
||||
// multiple
|
||||
if ( $field_type === 'multi_select' ) {
|
||||
$field['multiple'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
/*
|
||||
* validate_field_group
|
||||
*
|
||||
* This function will provide compatibility with ACF4 field groups
|
||||
*
|
||||
* @type function
|
||||
* @date 23/04/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $field_group (array)
|
||||
* @return $field_group
|
||||
*/
|
||||
function validate_field_group( $field_group ) {
|
||||
|
||||
// vars
|
||||
$version = 5;
|
||||
|
||||
// field group key was added in version 5.0.0
|
||||
// detect ACF4 data and generate key
|
||||
if ( ! $field_group['key'] ) {
|
||||
$version = 4;
|
||||
$field_group['key'] = isset( $field_group['id'] ) ? "group_{$field_group['id']}" : uniqid( 'group_' );
|
||||
}
|
||||
|
||||
// prior to version 5.0.0, settings were saved in an 'options' array
|
||||
// extract and merge options into the field group
|
||||
if ( isset( $field_group['options'] ) ) {
|
||||
$options = acf_extract_var( $field_group, 'options' );
|
||||
$field_group = array_merge( $field_group, $options );
|
||||
}
|
||||
|
||||
// location data structure changed to groups in version 4.1.0
|
||||
// convert previous data (rules, allorany) into groups
|
||||
if ( isset( $field_group['location']['rules'] ) ) {
|
||||
$field_group['location'] = acf_convert_rules_to_groups( $field_group['location']['rules'], $field_group['location']['allorany'] );
|
||||
}
|
||||
|
||||
// some location rule names have changed in version 5.0.0
|
||||
// loop over location data and modify rules
|
||||
$replace = array(
|
||||
'taxonomy' => 'post_taxonomy',
|
||||
'ef_media' => 'attachment',
|
||||
'ef_taxonomy' => 'taxonomy',
|
||||
'ef_user' => 'user_role',
|
||||
'user_type' => 'current_user_role', // 5.2.0
|
||||
);
|
||||
|
||||
// only replace 'taxonomy' rule if is an ACF4 field group
|
||||
if ( $version > 4 ) {
|
||||
unset( $replace['taxonomy'] );
|
||||
}
|
||||
|
||||
// loop over location groups
|
||||
if ( $field_group['location'] ) {
|
||||
foreach ( $field_group['location'] as $i => $group ) {
|
||||
|
||||
// loop over group rules
|
||||
if ( $group ) {
|
||||
foreach ( $group as $j => $rule ) {
|
||||
|
||||
// migrate param
|
||||
if ( isset( $replace[ $rule['param'] ] ) ) {
|
||||
$field_group['location'][ $i ][ $j ]['param'] = $replace[ $rule['param'] ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// change layout to style (v5.0.0)
|
||||
if ( isset( $field_group['layout'] ) ) {
|
||||
$field_group['style'] = acf_extract_var( $field_group, 'layout' );
|
||||
}
|
||||
|
||||
// change no_box to seamless (v5.0.0)
|
||||
if ( $field_group['style'] === 'no_box' ) {
|
||||
$field_group['style'] = 'seamless';
|
||||
}
|
||||
|
||||
// return
|
||||
return $field_group;
|
||||
}
|
||||
|
||||
/**
|
||||
* validate_post_taxonomy_location_rule
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 27/8/18
|
||||
* @since 5.7.4
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
function validate_post_taxonomy_location_rule( $rule ) {
|
||||
|
||||
// previous versions of ACF (v4.4.12) saved value as term_id
|
||||
// convert term_id into "taxonomy:slug" string
|
||||
if ( is_numeric( $rule['value'] ) ) {
|
||||
$term = acf_get_term( $rule['value'] );
|
||||
if ( $term ) {
|
||||
$rule['value'] = acf_encode_term( $term );
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $rule;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
acf_new_instance( 'ACF_Compatibility' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
|
|
@ -473,12 +477,12 @@ endif; // class_exists check
|
|||
*
|
||||
* Returns true if compatibility is enabled for the given component.
|
||||
*
|
||||
* @date 20/1/15
|
||||
* @since 5.1.5
|
||||
* @date 20/1/15
|
||||
* @since 5.1.5
|
||||
*
|
||||
* @param string $name The name of the component to check.
|
||||
* @return bool
|
||||
* @param string $name The name of the component to check.
|
||||
* @return bool
|
||||
*/
|
||||
function acf_get_compatibility( $name ) {
|
||||
return apply_filters( "acf/compatibility/{$name}", false );
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,38 +1,38 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
// Register deprecated filters ( $deprecated, $version, $replacement ).
|
||||
acf_add_deprecated_filter( 'acf/settings/export_textdomain', '5.3.3', 'acf/settings/l10n_textdomain' );
|
||||
acf_add_deprecated_filter( 'acf/settings/export_translate', '5.3.3', 'acf/settings/l10n_field' );
|
||||
acf_add_deprecated_filter( 'acf/settings/export_translate', '5.3.3', 'acf/settings/l10n_field_group' );
|
||||
acf_add_deprecated_filter( 'acf/settings/dir', '5.6.8', 'acf/settings/url' );
|
||||
acf_add_deprecated_filter( 'acf/get_valid_field', '5.5.6', 'acf/validate_field' );
|
||||
acf_add_deprecated_filter( 'acf/get_valid_field_group', '5.5.6', 'acf/validate_field_group' );
|
||||
acf_add_deprecated_filter( 'acf/get_valid_post_id', '5.5.6', 'acf/validate_post_id' );
|
||||
acf_add_deprecated_filter( 'acf/get_field_reference', '5.6.5', 'acf/load_reference' );
|
||||
acf_add_deprecated_filter( 'acf/get_field_group', '5.7.11', 'acf/load_field_group' );
|
||||
acf_add_deprecated_filter( 'acf/get_field_groups', '5.7.11', 'acf/load_field_groups' );
|
||||
acf_add_deprecated_filter( 'acf/get_fields', '5.7.11', 'acf/load_fields' );
|
||||
acf_add_deprecated_filter( 'acf/settings/export_textdomain', '5.3.3', 'acf/settings/l10n_textdomain' );
|
||||
acf_add_deprecated_filter( 'acf/settings/export_translate', '5.3.3', 'acf/settings/l10n_field' );
|
||||
acf_add_deprecated_filter( 'acf/settings/export_translate', '5.3.3', 'acf/settings/l10n_field_group' );
|
||||
acf_add_deprecated_filter( 'acf/settings/dir', '5.6.8', 'acf/settings/url' );
|
||||
acf_add_deprecated_filter( 'acf/get_valid_field', '5.5.6', 'acf/validate_field' );
|
||||
acf_add_deprecated_filter( 'acf/get_valid_field_group', '5.5.6', 'acf/validate_field_group' );
|
||||
acf_add_deprecated_filter( 'acf/get_valid_post_id', '5.5.6', 'acf/validate_post_id' );
|
||||
acf_add_deprecated_filter( 'acf/get_field_reference', '5.6.5', 'acf/load_reference' );
|
||||
acf_add_deprecated_filter( 'acf/get_field_group', '5.7.11', 'acf/load_field_group' );
|
||||
acf_add_deprecated_filter( 'acf/get_field_groups', '5.7.11', 'acf/load_field_groups' );
|
||||
acf_add_deprecated_filter( 'acf/get_fields', '5.7.11', 'acf/load_fields' );
|
||||
|
||||
// Register variations for deprecated filters.
|
||||
acf_add_filter_variations( 'acf/get_valid_field', array('type'), 0 );
|
||||
acf_add_filter_variations( 'acf/get_valid_field', array( 'type' ), 0 );
|
||||
|
||||
/**
|
||||
* acf_render_field_wrap_label
|
||||
*
|
||||
* Renders the field's label.
|
||||
*
|
||||
* @date 19/9/17
|
||||
* @since 5.6.3
|
||||
* @date 19/9/17
|
||||
* @since 5.6.3
|
||||
* @deprecated 5.6.5
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return void
|
||||
* @param array $field The field array.
|
||||
* @return void
|
||||
*/
|
||||
function acf_render_field_wrap_label( $field ) {
|
||||
|
||||
|
||||
// Warning.
|
||||
_deprecated_function( __FUNCTION__, '5.7.11', 'acf_render_field_label()' );
|
||||
|
||||
|
||||
// Render.
|
||||
acf_render_field_label( $field );
|
||||
}
|
||||
|
|
@ -42,18 +42,18 @@ function acf_render_field_wrap_label( $field ) {
|
|||
*
|
||||
* Renders the field's instructions.
|
||||
*
|
||||
* @date 19/9/17
|
||||
* @since 5.6.3
|
||||
* @date 19/9/17
|
||||
* @since 5.6.3
|
||||
* @deprecated 5.6.5
|
||||
*
|
||||
* @param array $field The field array.
|
||||
* @return void
|
||||
* @param array $field The field array.
|
||||
* @return void
|
||||
*/
|
||||
function acf_render_field_wrap_description( $field ) {
|
||||
|
||||
|
||||
// Warning.
|
||||
_deprecated_function( __FUNCTION__, '5.7.11', 'acf_render_field_instructions()' );
|
||||
|
||||
|
||||
// Render.
|
||||
acf_render_field_instructions( $field );
|
||||
}
|
||||
|
|
@ -63,20 +63,25 @@ function acf_render_field_wrap_description( $field ) {
|
|||
*
|
||||
* Returns and array of fields for the given $parent_id.
|
||||
*
|
||||
* @date 27/02/2014
|
||||
* @since 5.0.0.
|
||||
* @deprecated 5.7.11
|
||||
* @date 27/02/2014
|
||||
* @since 5.0.0.
|
||||
* @deprecated 5.7.11
|
||||
*
|
||||
* @param int $parent_id The parent ID.
|
||||
* @return array
|
||||
* @param int $parent_id The parent ID.
|
||||
* @return array
|
||||
*/
|
||||
function acf_get_fields_by_id( $parent_id = 0 ) {
|
||||
|
||||
|
||||
// Warning.
|
||||
_deprecated_function( __FUNCTION__, '5.7.11', 'acf_get_fields()' );
|
||||
|
||||
|
||||
// Return fields.
|
||||
return acf_get_fields(array( 'ID' => $parent_id, 'key' => "group_$parent_id" ));
|
||||
return acf_get_fields(
|
||||
array(
|
||||
'ID' => $parent_id,
|
||||
'key' => "group_$parent_id",
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -84,23 +89,23 @@ function acf_get_fields_by_id( $parent_id = 0 ) {
|
|||
*
|
||||
* A wrapper for the WP update_option but provides logic for a 'no' autoload
|
||||
*
|
||||
* @date 4/01/2014
|
||||
* @since 5.0.0
|
||||
* @deprecated 5.7.11
|
||||
* @date 4/01/2014
|
||||
* @since 5.0.0
|
||||
* @deprecated 5.7.11
|
||||
*
|
||||
* @param string $option The option name.
|
||||
* @param string $value The option value.
|
||||
* @param string $autoload An optional autoload value.
|
||||
* @return bool
|
||||
* @param string $option The option name.
|
||||
* @param string $value The option value.
|
||||
* @param string $autoload An optional autoload value.
|
||||
* @return bool
|
||||
*/
|
||||
function acf_update_option( $option = '', $value = '', $autoload = null ) {
|
||||
|
||||
|
||||
// Warning.
|
||||
_deprecated_function( __FUNCTION__, '5.7.11', 'update_option()' );
|
||||
|
||||
|
||||
// Update.
|
||||
if( $autoload === null ) {
|
||||
$autoload = (bool) acf_get_setting('autoload');
|
||||
if ( $autoload === null ) {
|
||||
$autoload = (bool) acf_get_setting( 'autoload' );
|
||||
}
|
||||
return update_option( $option, $value, $autoload );
|
||||
}
|
||||
|
|
@ -110,19 +115,19 @@ function acf_update_option( $option = '', $value = '', $autoload = null ) {
|
|||
*
|
||||
* Finds the field key for a given field name and post_id.
|
||||
*
|
||||
* @date 26/1/18
|
||||
* @since 5.6.5
|
||||
* @deprecated 5.6.8
|
||||
* @date 26/1/18
|
||||
* @since 5.6.5
|
||||
* @deprecated 5.6.8
|
||||
*
|
||||
* @param string $field_name The name of the field. eg 'sub_heading'
|
||||
* @param mixed $post_id The post_id of which the value is saved against
|
||||
* @return string $reference The field key
|
||||
* @param string $field_name The name of the field. eg 'sub_heading'
|
||||
* @param mixed $post_id The post_id of which the value is saved against
|
||||
* @return string $reference The field key
|
||||
*/
|
||||
function acf_get_field_reference( $field_name, $post_id ) {
|
||||
|
||||
|
||||
// Warning.
|
||||
_deprecated_function( __FUNCTION__, '5.6.8', 'acf_get_reference()' );
|
||||
|
||||
|
||||
// Return reference.
|
||||
return acf_get_reference( $field_name, $post_id );
|
||||
}
|
||||
|
|
@ -132,18 +137,18 @@ function acf_get_field_reference( $field_name, $post_id ) {
|
|||
*
|
||||
* Returns the plugin url to a specified file.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @deprecated 5.6.8
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
* @deprecated 5.6.8
|
||||
*
|
||||
* @param string $filename The specified file.
|
||||
* @return string
|
||||
* @param string $filename The specified file.
|
||||
* @return string
|
||||
*/
|
||||
function acf_get_dir( $filename = '' ) {
|
||||
|
||||
|
||||
// Warning.
|
||||
_deprecated_function( __FUNCTION__, '5.6.8', 'acf_get_url()' );
|
||||
|
||||
|
||||
// Return.
|
||||
return acf_get_url( $filename );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,139 +1,141 @@
|
|||
<?php
|
||||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('acf_fields') ) :
|
||||
|
||||
class acf_fields {
|
||||
|
||||
/** @var array Contains an array of field type instances */
|
||||
var $types = array();
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the class functionality
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_field_type
|
||||
*
|
||||
* This function will register a field type instance
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $class (string)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_field_type( $class ) {
|
||||
|
||||
// allow instance
|
||||
if( $class instanceOf acf_field ) {
|
||||
$this->types[ $class->name ] = $class;
|
||||
|
||||
// allow class name
|
||||
} else {
|
||||
$instance = new $class();
|
||||
$this->types[ $instance->name ] = $instance;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_field_type
|
||||
*
|
||||
* This function will return a field type instance
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $name (string)
|
||||
* @return (mixed)
|
||||
*/
|
||||
|
||||
function get_field_type( $name ) {
|
||||
return isset( $this->types[$name] ) ? $this->types[$name] : null;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* is_field_type
|
||||
*
|
||||
* This function will return true if a field type exists
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $name (string)
|
||||
* @return (mixed)
|
||||
*/
|
||||
|
||||
function is_field_type( $name ) {
|
||||
return isset( $this->types[$name] );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_field_type_info
|
||||
*
|
||||
* This function will store a basic array of info about the field type
|
||||
* to later be overriden by the above register_field_type function
|
||||
*
|
||||
* @type function
|
||||
* @date 29/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $info (array)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_field_type_info( $info ) {
|
||||
|
||||
// convert to object
|
||||
$instance = (object) $info;
|
||||
$this->types[ $instance->name ] = $instance;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_field_types
|
||||
*
|
||||
* This function will return an array of all field types
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $name (string)
|
||||
* @return (mixed)
|
||||
*/
|
||||
|
||||
function get_field_types() {
|
||||
return $this->types;
|
||||
}
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'acf_fields' ) ) :
|
||||
|
||||
// initialize
|
||||
acf()->fields = new acf_fields();
|
||||
class acf_fields {
|
||||
|
||||
/** @var array Contains an array of field type instances */
|
||||
var $types = array();
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the class functionality
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_field_type
|
||||
*
|
||||
* This function will register a field type instance
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $class (string)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_field_type( $class ) {
|
||||
|
||||
// allow instance
|
||||
if ( $class instanceof acf_field ) {
|
||||
$this->types[ $class->name ] = $class;
|
||||
|
||||
// allow class name
|
||||
} else {
|
||||
$instance = new $class();
|
||||
$this->types[ $instance->name ] = $instance;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_field_type
|
||||
*
|
||||
* This function will return a field type instance
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $name (string)
|
||||
* @return (mixed)
|
||||
*/
|
||||
|
||||
function get_field_type( $name ) {
|
||||
return isset( $this->types[ $name ] ) ? $this->types[ $name ] : null;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* is_field_type
|
||||
*
|
||||
* This function will return true if a field type exists
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $name (string)
|
||||
* @return (mixed)
|
||||
*/
|
||||
|
||||
function is_field_type( $name ) {
|
||||
return isset( $this->types[ $name ] );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_field_type_info
|
||||
*
|
||||
* This function will store a basic array of info about the field type
|
||||
* to later be overriden by the above register_field_type function
|
||||
*
|
||||
* @type function
|
||||
* @date 29/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $info (array)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_field_type_info( $info ) {
|
||||
|
||||
// convert to object
|
||||
$instance = (object) $info;
|
||||
$this->types[ $instance->name ] = $instance;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_field_types
|
||||
*
|
||||
* This function will return an array of all field types
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $name (string)
|
||||
* @return (mixed)
|
||||
*/
|
||||
|
||||
function get_field_types() {
|
||||
return $this->types;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf()->fields = new acf_fields();
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
|
|
@ -143,12 +145,12 @@ endif; // class_exists check
|
|||
*
|
||||
* alias of acf()->fields->register_field_type()
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_register_field_type( $class ) {
|
||||
|
|
@ -161,12 +163,12 @@ function acf_register_field_type( $class ) {
|
|||
*
|
||||
* alias of acf()->fields->register_field_type_info()
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_register_field_type_info( $info ) {
|
||||
|
|
@ -179,12 +181,12 @@ function acf_register_field_type_info( $info ) {
|
|||
*
|
||||
* alias of acf()->fields->get_field_type()
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_get_field_type( $name ) {
|
||||
|
|
@ -197,57 +199,60 @@ function acf_get_field_type( $name ) {
|
|||
*
|
||||
* alias of acf()->fields->get_field_types()
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_get_field_types( $args = array() ) {
|
||||
|
||||
|
||||
// default
|
||||
$args = wp_parse_args($args, array(
|
||||
'public' => true, // true, false
|
||||
));
|
||||
|
||||
$args = wp_parse_args(
|
||||
$args,
|
||||
array(
|
||||
'public' => true, // true, false
|
||||
)
|
||||
);
|
||||
|
||||
// get field types
|
||||
$field_types = acf()->fields->get_field_types();
|
||||
|
||||
|
||||
// filter
|
||||
return wp_filter_object_list( $field_types, $args );
|
||||
return wp_filter_object_list( $field_types, $args );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* acf_get_field_types_info
|
||||
*
|
||||
* Returns an array containing information about each field type
|
||||
*
|
||||
* @date 18/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
* acf_get_field_types_info
|
||||
*
|
||||
* Returns an array containing information about each field type
|
||||
*
|
||||
* @date 18/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
function acf_get_field_types_info( $args = array() ) {
|
||||
|
||||
|
||||
// vars
|
||||
$data = array();
|
||||
$data = array();
|
||||
$field_types = acf_get_field_types();
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $field_types as $type ) {
|
||||
foreach ( $field_types as $type ) {
|
||||
$data[ $type->name ] = array(
|
||||
'label' => $type->label,
|
||||
'name' => $type->name,
|
||||
'category' => $type->category,
|
||||
'public' => $type->public
|
||||
'label' => $type->label,
|
||||
'name' => $type->name,
|
||||
'category' => $type->category,
|
||||
'public' => $type->public,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $data;
|
||||
}
|
||||
|
|
@ -258,12 +263,12 @@ function acf_get_field_types_info( $args = array() ) {
|
|||
*
|
||||
* alias of acf()->fields->is_field_type()
|
||||
*
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
* @type function
|
||||
* @date 31/5/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_is_field_type( $name = '' ) {
|
||||
|
|
@ -276,17 +281,17 @@ function acf_is_field_type( $name = '' ) {
|
|||
*
|
||||
* This function will return a field type's property
|
||||
*
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return (array)
|
||||
* @param n/a
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
function acf_get_field_type_prop( $name = '', $prop = '' ) {
|
||||
$type = acf_get_field_type( $name );
|
||||
return ($type && isset($type->$prop)) ? $type->$prop : null;
|
||||
return ( $type && isset( $type->$prop ) ) ? $type->$prop : null;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -295,17 +300,17 @@ function acf_get_field_type_prop( $name = '', $prop = '' ) {
|
|||
*
|
||||
* This function will return the label of a field type
|
||||
*
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return (array)
|
||||
* @param n/a
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
function acf_get_field_type_label( $name = '' ) {
|
||||
$label = acf_get_field_type_prop( $name, 'label' );
|
||||
return $label ? $label : '<span class="acf-tooltip-js" title="'.__('Field type does not exist', 'acf').'">'.__('Unknown', 'acf').'</span>';
|
||||
return $label ? $label : '<span class="acf-tooltip-js" title="' . __( 'Field type does not exist', 'acf' ) . '">' . __( 'Unknown', 'acf' ) . '</span>';
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -314,12 +319,12 @@ function acf_get_field_type_label( $name = '' ) {
|
|||
*
|
||||
* deprecated in favour of acf_is_field_type()
|
||||
*
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $type (string)
|
||||
* @return (boolean)
|
||||
* @param $type (string)
|
||||
* @return (boolean)
|
||||
*/
|
||||
|
||||
function acf_field_type_exists( $type = '' ) {
|
||||
|
|
@ -332,47 +337,44 @@ function acf_field_type_exists( $type = '' ) {
|
|||
*
|
||||
* Returns an multi-dimentional array of field types "name => label" grouped by category
|
||||
*
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
* @type function
|
||||
* @date 1/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return (array)
|
||||
* @param n/a
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
function acf_get_grouped_field_types() {
|
||||
|
||||
|
||||
// vars
|
||||
$types = acf_get_field_types();
|
||||
$types = acf_get_field_types();
|
||||
$groups = array();
|
||||
$l10n = array(
|
||||
'basic' => __('Basic', 'acf'),
|
||||
'content' => __('Content', 'acf'),
|
||||
'choice' => __('Choice', 'acf'),
|
||||
'relational' => __('Relational', 'acf'),
|
||||
'jquery' => __('jQuery', 'acf'),
|
||||
'layout' => __('Layout', 'acf'),
|
||||
$l10n = array(
|
||||
'basic' => __( 'Basic', 'acf' ),
|
||||
'content' => __( 'Content', 'acf' ),
|
||||
'choice' => __( 'Choice', 'acf' ),
|
||||
'relational' => __( 'Relational', 'acf' ),
|
||||
'jquery' => __( 'jQuery', 'acf' ),
|
||||
'layout' => __( 'Layout', 'acf' ),
|
||||
);
|
||||
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $types as $type ) {
|
||||
|
||||
foreach ( $types as $type ) {
|
||||
|
||||
// translate
|
||||
$cat = $type->category;
|
||||
$cat = isset( $l10n[$cat] ) ? $l10n[$cat] : $cat;
|
||||
|
||||
$cat = isset( $l10n[ $cat ] ) ? $l10n[ $cat ] : $cat;
|
||||
|
||||
// append
|
||||
$groups[ $cat ][ $type->name ] = $type->label;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// filter
|
||||
$groups = apply_filters('acf/get_field_types', $groups);
|
||||
|
||||
|
||||
$groups = apply_filters( 'acf/get_field_types', $groups );
|
||||
|
||||
// return
|
||||
return $groups;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,167 +1,174 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field__accordion') ) :
|
||||
if ( ! class_exists( 'acf_field__accordion' ) ) :
|
||||
|
||||
class acf_field__accordion extends acf_field {
|
||||
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @date 30/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'accordion';
|
||||
$this->label = __("Accordion",'acf');
|
||||
$this->category = 'layout';
|
||||
$this->defaults = array(
|
||||
'open' => 0,
|
||||
'multi_expand' => 0,
|
||||
'endpoint' => 0
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* render_field
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @date 30/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array(
|
||||
'class' => 'acf-fields',
|
||||
'data-open' => $field['open'],
|
||||
'data-multi_expand' => $field['multi_expand'],
|
||||
'data-endpoint' => $field['endpoint']
|
||||
);
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e($atts); ?>></div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
/*
|
||||
// message
|
||||
$message = '';
|
||||
$message .= '<p>' . __( 'Accordions help you organize fields into panels that open and close.', 'acf') . '</p>';
|
||||
$message .= '<p>' . __( 'All fields following this accordion (or until another accordion is defined) will be grouped together.','acf') . '</p>';
|
||||
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Instructions','acf'),
|
||||
'instructions' => '',
|
||||
'name' => 'notes',
|
||||
'type' => 'message',
|
||||
'message' => $message,
|
||||
));
|
||||
*/
|
||||
|
||||
// active
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Open','acf'),
|
||||
'instructions' => __('Display this accordion as open on page load.','acf'),
|
||||
'name' => 'open',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
));
|
||||
|
||||
|
||||
// multi_expand
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Multi-expand','acf'),
|
||||
'instructions' => __('Allow this accordion to open without closing others.','acf'),
|
||||
'name' => 'multi_expand',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
));
|
||||
|
||||
|
||||
// endpoint
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Endpoint','acf'),
|
||||
'instructions' => __('Define an endpoint for the previous accordion to stop. This accordion will not be visible.','acf'),
|
||||
'name' => 'endpoint',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_field()
|
||||
*
|
||||
* This filter is appied to the $field after it is loaded from the database
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $field - the field array holding all the field options
|
||||
*/
|
||||
|
||||
function load_field( $field ) {
|
||||
|
||||
// remove name to avoid caching issue
|
||||
$field['name'] = '';
|
||||
|
||||
// remove required to avoid JS issues
|
||||
$field['required'] = 0;
|
||||
|
||||
// set value other than 'null' to avoid ACF loading / caching issue
|
||||
$field['value'] = false;
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
class acf_field__accordion extends acf_field {
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field__accordion' );
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @date 30/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'accordion';
|
||||
$this->label = __( 'Accordion', 'acf' );
|
||||
$this->category = 'layout';
|
||||
$this->defaults = array(
|
||||
'open' => 0,
|
||||
'multi_expand' => 0,
|
||||
'endpoint' => 0,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* render_field
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @date 30/10/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array(
|
||||
'class' => 'acf-fields',
|
||||
'data-open' => $field['open'],
|
||||
'data-multi_expand' => $field['multi_expand'],
|
||||
'data-endpoint' => $field['endpoint'],
|
||||
);
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $atts ); ?>></div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
/*
|
||||
// message
|
||||
$message = '';
|
||||
$message .= '<p>' . __( 'Accordions help you organize fields into panels that open and close.', 'acf') . '</p>';
|
||||
$message .= '<p>' . __( 'All fields following this accordion (or until another accordion is defined) will be grouped together.','acf') . '</p>';
|
||||
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Instructions','acf'),
|
||||
'instructions' => '',
|
||||
'name' => 'notes',
|
||||
'type' => 'message',
|
||||
'message' => $message,
|
||||
));
|
||||
*/
|
||||
|
||||
// active
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Open', 'acf' ),
|
||||
'instructions' => __( 'Display this accordion as open on page load.', 'acf' ),
|
||||
'name' => 'open',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
// multi_expand
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Multi-expand', 'acf' ),
|
||||
'instructions' => __( 'Allow this accordion to open without closing others.', 'acf' ),
|
||||
'name' => 'multi_expand',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
// endpoint
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Endpoint', 'acf' ),
|
||||
'instructions' => __( 'Define an endpoint for the previous accordion to stop. This accordion will not be visible.', 'acf' ),
|
||||
'name' => 'endpoint',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_field()
|
||||
*
|
||||
* This filter is appied to the $field after it is loaded from the database
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $field - the field array holding all the field options
|
||||
*/
|
||||
|
||||
function load_field( $field ) {
|
||||
|
||||
// remove name to avoid caching issue
|
||||
$field['name'] = '';
|
||||
|
||||
// remove required to avoid JS issues
|
||||
$field['required'] = 0;
|
||||
|
||||
// set value other than 'null' to avoid ACF loading / caching issue
|
||||
$field['value'] = false;
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field__accordion' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,292 +1,299 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_button_group') ) :
|
||||
if ( ! class_exists( 'acf_field_button_group' ) ) :
|
||||
|
||||
class acf_field_button_group extends acf_field {
|
||||
|
||||
|
||||
/**
|
||||
* initialize()
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'button_group';
|
||||
$this->label = __("Button Group",'acf');
|
||||
$this->category = 'choice';
|
||||
$this->defaults = array(
|
||||
'choices' => array(),
|
||||
'default_value' => '',
|
||||
'allow_null' => 0,
|
||||
'return_format' => 'value',
|
||||
'layout' => 'horizontal',
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* render_field()
|
||||
*
|
||||
* Creates the field's input HTML
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field settings array
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$html = '';
|
||||
$selected = null;
|
||||
$buttons = array();
|
||||
$value = esc_attr( $field['value'] );
|
||||
|
||||
|
||||
// bail ealrly if no choices
|
||||
if( empty($field['choices']) ) return;
|
||||
|
||||
|
||||
// buttons
|
||||
foreach( $field['choices'] as $_value => $_label ) {
|
||||
|
||||
// checked
|
||||
$checked = ( $value === esc_attr($_value) );
|
||||
if( $checked ) $selected = true;
|
||||
|
||||
|
||||
// append
|
||||
$buttons[] = array(
|
||||
'name' => $field['name'],
|
||||
'value' => $_value,
|
||||
'label' => $_label,
|
||||
'checked' => $checked
|
||||
class acf_field_button_group extends acf_field {
|
||||
|
||||
|
||||
/**
|
||||
* initialize()
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'button_group';
|
||||
$this->label = __( 'Button Group', 'acf' );
|
||||
$this->category = 'choice';
|
||||
$this->defaults = array(
|
||||
'choices' => array(),
|
||||
'default_value' => '',
|
||||
'allow_null' => 0,
|
||||
'return_format' => 'value',
|
||||
'layout' => 'horizontal',
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// maybe select initial value
|
||||
if( !$field['allow_null'] && $selected === null ) {
|
||||
$buttons[0]['checked'] = true;
|
||||
}
|
||||
|
||||
|
||||
// div
|
||||
$div = array( 'class' => 'acf-button-group' );
|
||||
|
||||
if( $field['layout'] == 'vertical' ) { $div['class'] .= ' -vertical'; }
|
||||
if( $field['class'] ) { $div['class'] .= ' ' . $field['class']; }
|
||||
if( $field['allow_null'] ) { $div['data-allow_null'] = 1; }
|
||||
|
||||
|
||||
// hdden input
|
||||
$html .= acf_get_hidden_input( array('name' => $field['name']) );
|
||||
|
||||
|
||||
// open
|
||||
$html .= '<div ' . acf_esc_attr($div) . '>';
|
||||
|
||||
// loop
|
||||
foreach( $buttons as $button ) {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* render_field()
|
||||
*
|
||||
* Creates the field's input HTML
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field settings array
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$html = '';
|
||||
$selected = null;
|
||||
$buttons = array();
|
||||
$value = esc_attr( $field['value'] );
|
||||
|
||||
// bail ealrly if no choices
|
||||
if ( empty( $field['choices'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// buttons
|
||||
foreach ( $field['choices'] as $_value => $_label ) {
|
||||
|
||||
// checked
|
||||
if( $button['checked'] ) {
|
||||
$checked = ( $value === esc_attr( $_value ) );
|
||||
if ( $checked ) {
|
||||
$selected = true;
|
||||
}
|
||||
|
||||
// append
|
||||
$buttons[] = array(
|
||||
'name' => $field['name'],
|
||||
'value' => $_value,
|
||||
'label' => $_label,
|
||||
'checked' => $checked,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// maybe select initial value
|
||||
if ( ! $field['allow_null'] && $selected === null ) {
|
||||
$buttons[0]['checked'] = true;
|
||||
}
|
||||
|
||||
// div
|
||||
$div = array( 'class' => 'acf-button-group' );
|
||||
|
||||
if ( $field['layout'] == 'vertical' ) {
|
||||
$div['class'] .= ' -vertical'; }
|
||||
if ( $field['class'] ) {
|
||||
$div['class'] .= ' ' . $field['class']; }
|
||||
if ( $field['allow_null'] ) {
|
||||
$div['data-allow_null'] = 1; }
|
||||
|
||||
// hdden input
|
||||
$html .= acf_get_hidden_input( array( 'name' => $field['name'] ) );
|
||||
|
||||
// open
|
||||
$html .= '<div ' . acf_esc_attr( $div ) . '>';
|
||||
|
||||
// loop
|
||||
foreach ( $buttons as $button ) {
|
||||
|
||||
// checked
|
||||
if ( $button['checked'] ) {
|
||||
$button['checked'] = 'checked';
|
||||
} else {
|
||||
unset($button['checked']);
|
||||
unset( $button['checked'] );
|
||||
}
|
||||
|
||||
|
||||
|
||||
// append
|
||||
$html .= acf_get_radio_input( $button );
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// close
|
||||
$html .= '</div>';
|
||||
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* render_field_settings()
|
||||
*
|
||||
* Creates the field's settings HTML
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field settings array
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// encode choices (convert from array)
|
||||
$field['choices'] = acf_encode_choices($field['choices']);
|
||||
|
||||
|
||||
// choices
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Choices','acf'),
|
||||
'instructions' => __('Enter each choice on a new line.','acf') . '<br /><br />' . __('For more control, you may specify both a value and label like this:','acf'). '<br /><br />' . __('red : Red','acf'),
|
||||
'type' => 'textarea',
|
||||
'name' => 'choices',
|
||||
));
|
||||
|
||||
|
||||
// allow_null
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Allow Null?','acf'),
|
||||
'instructions' => '',
|
||||
'name' => 'allow_null',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
));
|
||||
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Default Value','acf'),
|
||||
'instructions' => __('Appears when creating a new post','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
));
|
||||
|
||||
|
||||
// layout
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Layout','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'layout',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'horizontal' => __("Horizontal",'acf'),
|
||||
'vertical' => __("Vertical",'acf'),
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Value','acf'),
|
||||
'instructions' => __('Specify the returned value on front end','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'value' => __('Value','acf'),
|
||||
'label' => __('Label','acf'),
|
||||
'array' => __('Both (Array)','acf')
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_field()
|
||||
*
|
||||
* This filter is appied to the $field before it is saved to the database
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function update_field( $field ) {
|
||||
|
||||
return acf_get_field_type('radio')->update_field( $field );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param mixed $value The value found in the database
|
||||
* @param mixed $post_id The post ID from which the value was loaded from
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $value
|
||||
*/
|
||||
|
||||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type('radio')->load_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
* This function will translate field settings
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function translate_field( $field ) {
|
||||
|
||||
return acf_get_field_type('radio')->translate_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param mixed $value The value found in the database
|
||||
* @param mixed $post_id The post ID from which the value was loaded from
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type('radio')->format_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
// close
|
||||
$html .= '</div>';
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_button_group' );
|
||||
/**
|
||||
* render_field_settings()
|
||||
*
|
||||
* Creates the field's settings HTML
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field settings array
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// encode choices (convert from array)
|
||||
$field['choices'] = acf_encode_choices( $field['choices'] );
|
||||
|
||||
// choices
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Choices', 'acf' ),
|
||||
'instructions' => __( 'Enter each choice on a new line.', 'acf' ) . '<br /><br />' . __( 'For more control, you may specify both a value and label like this:', 'acf' ) . '<br /><br />' . __( 'red : Red', 'acf' ),
|
||||
'type' => 'textarea',
|
||||
'name' => 'choices',
|
||||
)
|
||||
);
|
||||
|
||||
// allow_null
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Allow Null?', 'acf' ),
|
||||
'instructions' => '',
|
||||
'name' => 'allow_null',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Default Value', 'acf' ),
|
||||
'instructions' => __( 'Appears when creating a new post', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
)
|
||||
);
|
||||
|
||||
// layout
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Layout', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'layout',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'horizontal' => __( 'Horizontal', 'acf' ),
|
||||
'vertical' => __( 'Vertical', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Value', 'acf' ),
|
||||
'instructions' => __( 'Specify the returned value on front end', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'value' => __( 'Value', 'acf' ),
|
||||
'label' => __( 'Label', 'acf' ),
|
||||
'array' => __( 'Both (Array)', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_field()
|
||||
*
|
||||
* This filter is appied to the $field before it is saved to the database
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function update_field( $field ) {
|
||||
|
||||
return acf_get_field_type( 'radio' )->update_field( $field );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param mixed $value The value found in the database
|
||||
* @param mixed $post_id The post ID from which the value was loaded from
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $value
|
||||
*/
|
||||
|
||||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type( 'radio' )->load_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
* This function will translate field settings
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function translate_field( $field ) {
|
||||
|
||||
return acf_get_field_type( 'radio' )->translate_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @date 18/9/17
|
||||
* @since 5.6.3
|
||||
*
|
||||
* @param mixed $value The value found in the database
|
||||
* @param mixed $post_id The post ID from which the value was loaded from
|
||||
* @param array $field The field array holding all the field options
|
||||
* @return $value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type( 'radio' )->format_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_button_group' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,144 +1,296 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_color_picker') ) :
|
||||
if ( ! class_exists( 'acf_field_color_picker' ) ) :
|
||||
|
||||
class acf_field_color_picker extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'color_picker';
|
||||
$this->label = __("Color Picker",'acf');
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
class acf_field_color_picker extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'color_picker';
|
||||
$this->label = __( 'Color Picker', 'acf' );
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'enable_opacity' => false,
|
||||
'return_format' => 'string', // 'string'|'array'
|
||||
);
|
||||
|
||||
// Register scripts for non-admin.
|
||||
// Applies logic from wp_default_scripts() function defined in "wp-includes/script-loader.php".
|
||||
if( !is_admin() ) {
|
||||
$suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
|
||||
$scripts = wp_scripts();
|
||||
$scripts->add( 'iris', '/wp-admin/js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), '1.0.7', 1 );
|
||||
$scripts->add( 'wp-color-picker', "/wp-admin/js/color-picker$suffix.js", array( 'iris' ), false, 1 );
|
||||
|
||||
// Handle localisation across multiple WP versions.
|
||||
// WP 5.0+
|
||||
if( method_exists($scripts, 'set_translations') ) {
|
||||
$scripts->set_translations( 'wp-color-picker' );
|
||||
// WP 4.9
|
||||
} else {
|
||||
$scripts->localize( 'wp-color-picker', 'wpColorPickerL10n', array(
|
||||
'clear' => __( 'Clear' ),
|
||||
'clearAriaLabel' => __( 'Clear color' ),
|
||||
'defaultString' => __( 'Default' ),
|
||||
'defaultAriaLabel' => __( 'Select default color' ),
|
||||
'pick' => __( 'Select Color' ),
|
||||
'defaultLabel' => __( 'Color value' ),
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Enqueue.
|
||||
wp_enqueue_style( 'wp-color-picker' );
|
||||
wp_enqueue_script( 'wp-color-picker' );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$text_input = acf_get_sub_array( $field, array('id', 'class', 'name', 'value') );
|
||||
$hidden_input = acf_get_sub_array( $field, array('name', 'value') );
|
||||
|
||||
|
||||
// html
|
||||
?>
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// Register scripts for non-admin.
|
||||
// Applies logic from wp_default_scripts() function defined in "wp-includes/script-loader.php".
|
||||
if ( ! is_admin() ) {
|
||||
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
||||
$scripts = wp_scripts();
|
||||
$scripts->add( 'iris', '/wp-admin/js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), '1.0.7', 1 );
|
||||
$scripts->add( 'wp-color-picker', "/wp-admin/js/color-picker$suffix.js", array( 'iris' ), false, 1 );
|
||||
|
||||
// Handle localisation across multiple WP versions.
|
||||
// WP 5.0+
|
||||
if ( method_exists( $scripts, 'set_translations' ) ) {
|
||||
$scripts->set_translations( 'wp-color-picker' );
|
||||
// WP 4.9
|
||||
} else {
|
||||
$scripts->localize(
|
||||
'wp-color-picker',
|
||||
'wpColorPickerL10n',
|
||||
array(
|
||||
'clear' => __( 'Clear' ),
|
||||
'clearAriaLabel' => __( 'Clear color' ),
|
||||
'defaultString' => __( 'Default' ),
|
||||
'defaultAriaLabel' => __( 'Select default color' ),
|
||||
'pick' => __( 'Select Color' ),
|
||||
'defaultLabel' => __( 'Color value' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Enqueue alpha color picker assets.
|
||||
wp_enqueue_script(
|
||||
'acf-color-picker-alpha',
|
||||
acf_get_url( 'assets/inc/color-picker-alpha/wp-color-picker-alpha.js' ),
|
||||
array( 'jquery', 'wp-color-picker' ),
|
||||
'3.0.0'
|
||||
);
|
||||
|
||||
// Enqueue.
|
||||
wp_enqueue_style( 'wp-color-picker' );
|
||||
wp_enqueue_script( 'wp-color-picker' );
|
||||
|
||||
acf_localize_data(
|
||||
array(
|
||||
'colorPickerL10n' => array(
|
||||
'hex_string' => __( 'Hex String', 'acf' ),
|
||||
'rgba_string' => __( 'RGBA String', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$text_input = acf_get_sub_array( $field, array( 'id', 'class', 'name', 'value' ) );
|
||||
$hidden_input = acf_get_sub_array( $field, array( 'name', 'value' ) );
|
||||
|
||||
// Color picker alpha library requires a specific data attribute to exist.
|
||||
if ( $field['enable_opacity'] ) {
|
||||
$text_input['data-alpha-enabled'] = true;
|
||||
}
|
||||
|
||||
// html
|
||||
?>
|
||||
<div class="acf-color-picker">
|
||||
<?php acf_hidden_input( $hidden_input ); ?>
|
||||
<?php acf_text_input( $text_input ); ?>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// display_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Default Value','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
'placeholder' => '#FFFFFF'
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_color_picker' );
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// display_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Default Value', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
'placeholder' => '#FFFFFF',
|
||||
)
|
||||
);
|
||||
|
||||
// Toggle opacity control.
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Enable Transparency', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'true_false',
|
||||
'name' => 'enable_opacity',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
// Return format control.
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Format', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'string' => __( 'Hex String', 'acf' ),
|
||||
'array' => __( 'RGBA Array', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the value for use in templates. At this stage, the value has been loaded from the
|
||||
* database and is being returned by an API function such as get_field(), the_field(), etc.
|
||||
*
|
||||
* @since 5.10
|
||||
* @date 15/12/20
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param int $post_id
|
||||
* @param array $field
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public function format_value( $value, $post_id, $field ) {
|
||||
if ( isset( $field['return_format'] ) && $field['return_format'] === 'array' ) {
|
||||
$value = $this->string_to_array( $value );
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert either a Hexadecimal or RGBA string to an RGBA array.
|
||||
*
|
||||
* @since 5.10
|
||||
* @date 15/12/20
|
||||
*
|
||||
* @param string $value
|
||||
* @return array
|
||||
*/
|
||||
private function string_to_array( $value ) {
|
||||
// Trim Value
|
||||
$value = trim( $value );
|
||||
|
||||
// Match and collect r,g,b values from 6 digit hex code. If there are 4
|
||||
// match-results, we have the values we need to build an r,g,b,a array.
|
||||
preg_match( '/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i', $value, $matches );
|
||||
if ( count( $matches ) === 4 ) {
|
||||
return array(
|
||||
'red' => hexdec( $matches[1] ),
|
||||
'green' => hexdec( $matches[2] ),
|
||||
'blue' => hexdec( $matches[3] ),
|
||||
'alpha' => (float) 1,
|
||||
);
|
||||
}
|
||||
|
||||
// Match and collect r,g,b values from 3 digit hex code. If there are 4
|
||||
// match-results, we have the values we need to build an r,g,b,a array.
|
||||
// We have to duplicate the matched hex digit for 3 digit hex codes.
|
||||
preg_match( '/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i', $value, $matches );
|
||||
if ( count( $matches ) === 4 ) {
|
||||
return array(
|
||||
'red' => hexdec( $matches[1] . $matches[1] ),
|
||||
'green' => hexdec( $matches[2] . $matches[2] ),
|
||||
'blue' => hexdec( $matches[3] . $matches[3] ),
|
||||
'alpha' => (float) 1,
|
||||
);
|
||||
}
|
||||
|
||||
// Attempt to match an rgba(…) or rgb(…) string (case-insensitive), capturing the decimals
|
||||
// as a string. If there are two match results, we have the RGBA decimal values as a
|
||||
// comma-separated string. Break it apart and, depending on the number of values, return
|
||||
// our formatted r,g,b,a array.
|
||||
preg_match( '/^rgba?\(([0-9,.]+)\)/i', $value, $matches );
|
||||
if ( count( $matches ) === 2 ) {
|
||||
$decimals = explode( ',', $matches[1] );
|
||||
|
||||
// Handle rgba() format.
|
||||
if ( count( $decimals ) === 4 ) {
|
||||
return array(
|
||||
'red' => (int) $decimals[0],
|
||||
'green' => (int) $decimals[1],
|
||||
'blue' => (int) $decimals[2],
|
||||
'alpha' => (float) $decimals[3],
|
||||
);
|
||||
}
|
||||
|
||||
// Handle rgb() format.
|
||||
if ( count( $decimals ) === 3 ) {
|
||||
return array(
|
||||
'red' => (int) $decimals[0],
|
||||
'green' => (int) $decimals[1],
|
||||
'blue' => (int) $decimals[2],
|
||||
'alpha' => (float) 1,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return array(
|
||||
'red' => 0,
|
||||
'green' => 0,
|
||||
'blue' => 0,
|
||||
'alpha' => (float) 0,
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_color_picker' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,277 +1,286 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_date_picker') ) :
|
||||
if ( ! class_exists( 'acf_field_date_picker' ) ) :
|
||||
|
||||
class acf_field_date_picker extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'date_picker';
|
||||
$this->label = __("Date Picker",'acf');
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'display_format' => 'd/m/Y',
|
||||
'return_format' => 'd/m/Y',
|
||||
'first_day' => 1
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// bail ealry if no enqueue
|
||||
if( !acf_get_setting('enqueue_datepicker') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// localize
|
||||
global $wp_locale;
|
||||
acf_localize_data(array(
|
||||
'datePickerL10n' => array(
|
||||
'closeText' => _x('Done', 'Date Picker JS closeText', 'acf'),
|
||||
'currentText' => _x('Today', 'Date Picker JS currentText', 'acf'),
|
||||
'nextText' => _x('Next', 'Date Picker JS nextText', 'acf'),
|
||||
'prevText' => _x('Prev', 'Date Picker JS prevText', 'acf'),
|
||||
'weekHeader' => _x('Wk', 'Date Picker JS weekHeader', 'acf'),
|
||||
'monthNames' => array_values( $wp_locale->month ),
|
||||
'monthNamesShort' => array_values( $wp_locale->month_abbrev ),
|
||||
'dayNames' => array_values( $wp_locale->weekday ),
|
||||
'dayNamesMin' => array_values( $wp_locale->weekday_initial ),
|
||||
'dayNamesShort' => array_values( $wp_locale->weekday_abbrev )
|
||||
)
|
||||
));
|
||||
|
||||
// script
|
||||
wp_enqueue_script('jquery-ui-datepicker');
|
||||
|
||||
// style
|
||||
wp_enqueue_style('acf-datepicker', acf_get_url('assets/inc/datepicker/jquery-ui.min.css'), array(), '1.11.4' );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$hidden_value = '';
|
||||
$display_value = '';
|
||||
|
||||
// format value
|
||||
if( $field['value'] ) {
|
||||
$hidden_value = acf_format_date( $field['value'], 'Ymd' );
|
||||
$display_value = acf_format_date( $field['value'], $field['display_format'] );
|
||||
class acf_field_date_picker extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'date_picker';
|
||||
$this->label = __( 'Date Picker', 'acf' );
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'display_format' => 'd/m/Y',
|
||||
'return_format' => 'd/m/Y',
|
||||
'first_day' => 1,
|
||||
);
|
||||
}
|
||||
|
||||
// elements
|
||||
$div = array(
|
||||
'class' => 'acf-date-picker acf-input-wrap',
|
||||
'data-date_format' => acf_convert_date_to_js($field['display_format']),
|
||||
'data-first_day' => $field['first_day'],
|
||||
);
|
||||
$hidden_input = array(
|
||||
'id' => $field['id'],
|
||||
'name' => $field['name'],
|
||||
'value' => $hidden_value,
|
||||
);
|
||||
$text_input = array(
|
||||
'class' => 'input',
|
||||
'value' => $display_value,
|
||||
);
|
||||
|
||||
// special attributes
|
||||
foreach( array( 'readonly', 'disabled' ) as $k ) {
|
||||
if( !empty($field[ $k ]) ) {
|
||||
$hidden_input[ $k ] = $k;
|
||||
$text_input[ $k ] = $k;
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// bail ealry if no enqueue
|
||||
if ( ! acf_get_setting( 'enqueue_datepicker' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// localize
|
||||
global $wp_locale;
|
||||
acf_localize_data(
|
||||
array(
|
||||
'datePickerL10n' => array(
|
||||
'closeText' => _x( 'Done', 'Date Picker JS closeText', 'acf' ),
|
||||
'currentText' => _x( 'Today', 'Date Picker JS currentText', 'acf' ),
|
||||
'nextText' => _x( 'Next', 'Date Picker JS nextText', 'acf' ),
|
||||
'prevText' => _x( 'Prev', 'Date Picker JS prevText', 'acf' ),
|
||||
'weekHeader' => _x( 'Wk', 'Date Picker JS weekHeader', 'acf' ),
|
||||
'monthNames' => array_values( $wp_locale->month ),
|
||||
'monthNamesShort' => array_values( $wp_locale->month_abbrev ),
|
||||
'dayNames' => array_values( $wp_locale->weekday ),
|
||||
'dayNamesMin' => array_values( $wp_locale->weekday_initial ),
|
||||
'dayNamesShort' => array_values( $wp_locale->weekday_abbrev ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// script
|
||||
wp_enqueue_script( 'jquery-ui-datepicker' );
|
||||
|
||||
// style
|
||||
wp_enqueue_style( 'acf-datepicker', acf_get_url( 'assets/inc/datepicker/jquery-ui.min.css' ), array(), '1.11.4' );
|
||||
}
|
||||
|
||||
// save_format - compatibility with ACF < 5.0.0
|
||||
if( !empty($field['save_format']) ) {
|
||||
|
||||
// add custom JS save format
|
||||
$div['data-save_format'] = $field['save_format'];
|
||||
|
||||
// revert hidden input value to raw DB value
|
||||
$hidden_input['value'] = $field['value'];
|
||||
|
||||
// remove formatted value (will do this via JS)
|
||||
$text_input['value'] = '';
|
||||
}
|
||||
|
||||
// html
|
||||
?>
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$hidden_value = '';
|
||||
$display_value = '';
|
||||
|
||||
// format value
|
||||
if ( $field['value'] ) {
|
||||
$hidden_value = acf_format_date( $field['value'], 'Ymd' );
|
||||
$display_value = acf_format_date( $field['value'], $field['display_format'] );
|
||||
}
|
||||
|
||||
// elements
|
||||
$div = array(
|
||||
'class' => 'acf-date-picker acf-input-wrap',
|
||||
'data-date_format' => acf_convert_date_to_js( $field['display_format'] ),
|
||||
'data-first_day' => $field['first_day'],
|
||||
);
|
||||
$hidden_input = array(
|
||||
'id' => $field['id'],
|
||||
'name' => $field['name'],
|
||||
'value' => $hidden_value,
|
||||
);
|
||||
$text_input = array(
|
||||
'class' => 'input',
|
||||
'value' => $display_value,
|
||||
);
|
||||
|
||||
// special attributes
|
||||
foreach ( array( 'readonly', 'disabled' ) as $k ) {
|
||||
if ( ! empty( $field[ $k ] ) ) {
|
||||
$hidden_input[ $k ] = $k;
|
||||
$text_input[ $k ] = $k;
|
||||
}
|
||||
}
|
||||
|
||||
// save_format - compatibility with ACF < 5.0.0
|
||||
if ( ! empty( $field['save_format'] ) ) {
|
||||
|
||||
// add custom JS save format
|
||||
$div['data-save_format'] = $field['save_format'];
|
||||
|
||||
// revert hidden input value to raw DB value
|
||||
$hidden_input['value'] = $field['value'];
|
||||
|
||||
// remove formatted value (will do this via JS)
|
||||
$text_input['value'] = '';
|
||||
}
|
||||
|
||||
// html
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $div ); ?>>
|
||||
<?php acf_hidden_input( $hidden_input ); ?>
|
||||
<?php acf_text_input( $text_input ); ?>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// global
|
||||
global $wp_locale;
|
||||
|
||||
|
||||
// vars
|
||||
$d_m_Y = date_i18n('d/m/Y');
|
||||
$m_d_Y = date_i18n('m/d/Y');
|
||||
$F_j_Y = date_i18n('F j, Y');
|
||||
$Ymd = date_i18n('Ymd');
|
||||
|
||||
|
||||
// display_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Display Format','acf'),
|
||||
'instructions' => __('The format displayed when editing a post','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'display_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y' => '<span>' . $d_m_Y . '</span><code>d/m/Y</code>',
|
||||
'm/d/Y' => '<span>' . $m_d_Y . '</span><code>m/d/Y</code>',
|
||||
'F j, Y' => '<span>' . $F_j_Y . '</span><code>F j, Y</code>',
|
||||
'other' => '<span>' . __('Custom:','acf') . '</span>'
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// save_format - compatibility with ACF < 5.0.0
|
||||
if( !empty($field['save_format']) ) {
|
||||
|
||||
// save_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Save Format','acf'),
|
||||
'instructions' => __('The format used when saving a value','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'save_format',
|
||||
//'readonly' => 1 // this setting was not readonly in v4
|
||||
));
|
||||
|
||||
} else {
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Format','acf'),
|
||||
'instructions' => __('The format returned via template functions','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y' => '<span>' . $d_m_Y . '</span><code>d/m/Y</code>',
|
||||
'm/d/Y' => '<span>' . $m_d_Y . '</span><code>m/d/Y</code>',
|
||||
'F j, Y' => '<span>' . $F_j_Y . '</span><code>F j, Y</code>',
|
||||
'Ymd' => '<span>' . $Ymd . '</span><code>Ymd</code>',
|
||||
'other' => '<span>' . __('Custom:','acf') . '</span>'
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// global
|
||||
global $wp_locale;
|
||||
|
||||
// vars
|
||||
$d_m_Y = date_i18n( 'd/m/Y' );
|
||||
$m_d_Y = date_i18n( 'm/d/Y' );
|
||||
$F_j_Y = date_i18n( 'F j, Y' );
|
||||
$Ymd = date_i18n( 'Ymd' );
|
||||
|
||||
// display_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Display Format', 'acf' ),
|
||||
'instructions' => __( 'The format displayed when editing a post', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'display_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y' => '<span>' . $d_m_Y . '</span><code>d/m/Y</code>',
|
||||
'm/d/Y' => '<span>' . $m_d_Y . '</span><code>m/d/Y</code>',
|
||||
'F j, Y' => '<span>' . $F_j_Y . '</span><code>F j, Y</code>',
|
||||
'other' => '<span>' . __( 'Custom:', 'acf' ) . '</span>',
|
||||
),
|
||||
)
|
||||
));
|
||||
|
||||
);
|
||||
|
||||
// save_format - compatibility with ACF < 5.0.0
|
||||
if ( ! empty( $field['save_format'] ) ) {
|
||||
|
||||
// save_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Save Format', 'acf' ),
|
||||
'instructions' => __( 'The format used when saving a value', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'save_format',
|
||||
// 'readonly' => 1 // this setting was not readonly in v4
|
||||
)
|
||||
);
|
||||
|
||||
} else {
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Format', 'acf' ),
|
||||
'instructions' => __( 'The format returned via template functions', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y' => '<span>' . $d_m_Y . '</span><code>d/m/Y</code>',
|
||||
'm/d/Y' => '<span>' . $m_d_Y . '</span><code>m/d/Y</code>',
|
||||
'F j, Y' => '<span>' . $F_j_Y . '</span><code>F j, Y</code>',
|
||||
'Ymd' => '<span>' . $Ymd . '</span><code>Ymd</code>',
|
||||
'other' => '<span>' . __( 'Custom:', 'acf' ) . '</span>',
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// first_day
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Week Starts On', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'first_day',
|
||||
'choices' => array_values( $wp_locale->weekday ),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// first_day
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Week Starts On','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'first_day',
|
||||
'choices' => array_values( $wp_locale->weekday )
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// save_format - compatibility with ACF < 5.0.0
|
||||
if( !empty($field['save_format']) ) {
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return acf_format_date( $value, $field['return_format'] );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_date_picker' );
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// save_format - compatibility with ACF < 5.0.0
|
||||
if ( ! empty( $field['save_format'] ) ) {
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return acf_format_date( $value, $field['return_format'] );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_date_picker' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,255 +1,261 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_date_and_time_picker') ) :
|
||||
if ( ! class_exists( 'acf_field_date_and_time_picker' ) ) :
|
||||
|
||||
class acf_field_date_and_time_picker extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'date_time_picker';
|
||||
$this->label = __("Date Time Picker",'acf');
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'display_format' => 'd/m/Y g:i a',
|
||||
'return_format' => 'd/m/Y g:i a',
|
||||
'first_day' => 1
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// bail ealry if no enqueue
|
||||
if( !acf_get_setting('enqueue_datetimepicker') ) return;
|
||||
|
||||
|
||||
// vars
|
||||
$version = '1.6.1';
|
||||
|
||||
|
||||
// script
|
||||
wp_enqueue_script('acf-timepicker', acf_get_url('assets/inc/timepicker/jquery-ui-timepicker-addon.min.js'), array('jquery-ui-datepicker'), $version);
|
||||
|
||||
|
||||
// style
|
||||
wp_enqueue_style('acf-timepicker', acf_get_url('assets/inc/timepicker/jquery-ui-timepicker-addon.min.css'), '', $version);
|
||||
|
||||
// localize
|
||||
acf_localize_data(array(
|
||||
'dateTimePickerL10n' => array(
|
||||
'timeOnlyTitle' => _x('Choose Time', 'Date Time Picker JS timeOnlyTitle', 'acf'),
|
||||
'timeText' => _x('Time', 'Date Time Picker JS timeText', 'acf'),
|
||||
'hourText' => _x('Hour', 'Date Time Picker JS hourText', 'acf'),
|
||||
'minuteText' => _x('Minute', 'Date Time Picker JS minuteText', 'acf'),
|
||||
'secondText' => _x('Second', 'Date Time Picker JS secondText', 'acf'),
|
||||
'millisecText' => _x('Millisecond', 'Date Time Picker JS millisecText', 'acf'),
|
||||
'microsecText' => _x('Microsecond', 'Date Time Picker JS microsecText', 'acf'),
|
||||
'timezoneText' => _x('Time Zone', 'Date Time Picker JS timezoneText', 'acf'),
|
||||
'currentText' => _x('Now', 'Date Time Picker JS currentText', 'acf'),
|
||||
'closeText' => _x('Done', 'Date Time Picker JS closeText', 'acf'),
|
||||
'selectText' => _x('Select', 'Date Time Picker JS selectText', 'acf'),
|
||||
'amNames' => array(
|
||||
_x('AM', 'Date Time Picker JS amText', 'acf'),
|
||||
_x('A', 'Date Time Picker JS amTextShort', 'acf'),
|
||||
),
|
||||
'pmNames' => array(
|
||||
_x('PM', 'Date Time Picker JS pmText', 'acf'),
|
||||
_x('P', 'Date Time Picker JS pmTextShort', 'acf'),
|
||||
)
|
||||
)
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// Set value.
|
||||
$hidden_value = '';
|
||||
$display_value = '';
|
||||
|
||||
if( $field['value'] ) {
|
||||
$hidden_value = acf_format_date( $field['value'], 'Y-m-d H:i:s' );
|
||||
$display_value = acf_format_date( $field['value'], $field['display_format'] );
|
||||
class acf_field_date_and_time_picker extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'date_time_picker';
|
||||
$this->label = __( 'Date Time Picker', 'acf' );
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'display_format' => 'd/m/Y g:i a',
|
||||
'return_format' => 'd/m/Y g:i a',
|
||||
'first_day' => 1,
|
||||
);
|
||||
}
|
||||
|
||||
// Convert "display_format" setting to individual date and time formats.
|
||||
$formats = acf_split_date_time( $field['display_format'] );
|
||||
|
||||
// Elements.
|
||||
$div = array(
|
||||
'class' => 'acf-date-time-picker acf-input-wrap',
|
||||
'data-date_format' => acf_convert_date_to_js($formats['date']),
|
||||
'data-time_format' => acf_convert_time_to_js($formats['time']),
|
||||
'data-first_day' => $field['first_day'],
|
||||
);
|
||||
$hidden_input = array(
|
||||
'id' => $field['id'],
|
||||
'class' => 'input-alt',
|
||||
'name' => $field['name'],
|
||||
'value' => $hidden_value,
|
||||
);
|
||||
$text_input = array(
|
||||
'class' => 'input',
|
||||
'value' => $display_value,
|
||||
);
|
||||
foreach( array( 'readonly', 'disabled' ) as $k ) {
|
||||
if( !empty($field[ $k ]) ) {
|
||||
$hidden_input[ $k ] = $k;
|
||||
$text_input[ $k ] = $k;
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// bail ealry if no enqueue
|
||||
if ( ! acf_get_setting( 'enqueue_datetimepicker' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
$version = '1.6.1';
|
||||
|
||||
// script
|
||||
wp_enqueue_script( 'acf-timepicker', acf_get_url( 'assets/inc/timepicker/jquery-ui-timepicker-addon.min.js' ), array( 'jquery-ui-datepicker' ), $version );
|
||||
|
||||
// style
|
||||
wp_enqueue_style( 'acf-timepicker', acf_get_url( 'assets/inc/timepicker/jquery-ui-timepicker-addon.min.css' ), '', $version );
|
||||
|
||||
// localize
|
||||
acf_localize_data(
|
||||
array(
|
||||
'dateTimePickerL10n' => array(
|
||||
'timeOnlyTitle' => _x( 'Choose Time', 'Date Time Picker JS timeOnlyTitle', 'acf' ),
|
||||
'timeText' => _x( 'Time', 'Date Time Picker JS timeText', 'acf' ),
|
||||
'hourText' => _x( 'Hour', 'Date Time Picker JS hourText', 'acf' ),
|
||||
'minuteText' => _x( 'Minute', 'Date Time Picker JS minuteText', 'acf' ),
|
||||
'secondText' => _x( 'Second', 'Date Time Picker JS secondText', 'acf' ),
|
||||
'millisecText' => _x( 'Millisecond', 'Date Time Picker JS millisecText', 'acf' ),
|
||||
'microsecText' => _x( 'Microsecond', 'Date Time Picker JS microsecText', 'acf' ),
|
||||
'timezoneText' => _x( 'Time Zone', 'Date Time Picker JS timezoneText', 'acf' ),
|
||||
'currentText' => _x( 'Now', 'Date Time Picker JS currentText', 'acf' ),
|
||||
'closeText' => _x( 'Done', 'Date Time Picker JS closeText', 'acf' ),
|
||||
'selectText' => _x( 'Select', 'Date Time Picker JS selectText', 'acf' ),
|
||||
'amNames' => array(
|
||||
_x( 'AM', 'Date Time Picker JS amText', 'acf' ),
|
||||
_x( 'A', 'Date Time Picker JS amTextShort', 'acf' ),
|
||||
),
|
||||
'pmNames' => array(
|
||||
_x( 'PM', 'Date Time Picker JS pmText', 'acf' ),
|
||||
_x( 'P', 'Date Time Picker JS pmTextShort', 'acf' ),
|
||||
),
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Output.
|
||||
?>
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// Set value.
|
||||
$hidden_value = '';
|
||||
$display_value = '';
|
||||
|
||||
if ( $field['value'] ) {
|
||||
$hidden_value = acf_format_date( $field['value'], 'Y-m-d H:i:s' );
|
||||
$display_value = acf_format_date( $field['value'], $field['display_format'] );
|
||||
}
|
||||
|
||||
// Convert "display_format" setting to individual date and time formats.
|
||||
$formats = acf_split_date_time( $field['display_format'] );
|
||||
|
||||
// Elements.
|
||||
$div = array(
|
||||
'class' => 'acf-date-time-picker acf-input-wrap',
|
||||
'data-date_format' => acf_convert_date_to_js( $formats['date'] ),
|
||||
'data-time_format' => acf_convert_time_to_js( $formats['time'] ),
|
||||
'data-first_day' => $field['first_day'],
|
||||
);
|
||||
$hidden_input = array(
|
||||
'id' => $field['id'],
|
||||
'class' => 'input-alt',
|
||||
'name' => $field['name'],
|
||||
'value' => $hidden_value,
|
||||
);
|
||||
$text_input = array(
|
||||
'class' => 'input',
|
||||
'value' => $display_value,
|
||||
);
|
||||
foreach ( array( 'readonly', 'disabled' ) as $k ) {
|
||||
if ( ! empty( $field[ $k ] ) ) {
|
||||
$hidden_input[ $k ] = $k;
|
||||
$text_input[ $k ] = $k;
|
||||
}
|
||||
}
|
||||
|
||||
// Output.
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $div ); ?>>
|
||||
<?php acf_hidden_input( $hidden_input ); ?>
|
||||
<?php acf_text_input( $text_input ); ?>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// global
|
||||
global $wp_locale;
|
||||
|
||||
|
||||
// vars
|
||||
$d_m_Y = date_i18n('d/m/Y g:i a');
|
||||
$m_d_Y = date_i18n('m/d/Y g:i a');
|
||||
$F_j_Y = date_i18n('F j, Y g:i a');
|
||||
$Ymd = date_i18n('Y-m-d H:i:s');
|
||||
|
||||
|
||||
// display_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Display Format','acf'),
|
||||
'instructions' => __('The format displayed when editing a post','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'display_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y g:i a' => '<span>' . $d_m_Y . '</span><code>d/m/Y g:i a</code>',
|
||||
'm/d/Y g:i a' => '<span>' . $m_d_Y . '</span><code>m/d/Y g:i a</code>',
|
||||
'F j, Y g:i a' => '<span>' . $F_j_Y . '</span><code>F j, Y g:i a</code>',
|
||||
'Y-m-d H:i:s' => '<span>' . $Ymd . '</span><code>Y-m-d H:i:s</code>',
|
||||
'other' => '<span>' . __('Custom:','acf') . '</span>'
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Format','acf'),
|
||||
'instructions' => __('The format returned via template functions','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y g:i a' => '<span>' . $d_m_Y . '</span><code>d/m/Y g:i a</code>',
|
||||
'm/d/Y g:i a' => '<span>' . $m_d_Y . '</span><code>m/d/Y g:i a</code>',
|
||||
'F j, Y g:i a' => '<span>' . $F_j_Y . '</span><code>F j, Y g:i a</code>',
|
||||
'Y-m-d H:i:s' => '<span>' . $Ymd . '</span><code>Y-m-d H:i:s</code>',
|
||||
'other' => '<span>' . __('Custom:','acf') . '</span>'
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// first_day
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Week Starts On','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'first_day',
|
||||
'choices' => array_values( $wp_locale->weekday )
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_format_date( $value, $field['return_format'] );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_date_and_time_picker' );
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// global
|
||||
global $wp_locale;
|
||||
|
||||
// vars
|
||||
$d_m_Y = date_i18n( 'd/m/Y g:i a' );
|
||||
$m_d_Y = date_i18n( 'm/d/Y g:i a' );
|
||||
$F_j_Y = date_i18n( 'F j, Y g:i a' );
|
||||
$Ymd = date_i18n( 'Y-m-d H:i:s' );
|
||||
|
||||
// display_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Display Format', 'acf' ),
|
||||
'instructions' => __( 'The format displayed when editing a post', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'display_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y g:i a' => '<span>' . $d_m_Y . '</span><code>d/m/Y g:i a</code>',
|
||||
'm/d/Y g:i a' => '<span>' . $m_d_Y . '</span><code>m/d/Y g:i a</code>',
|
||||
'F j, Y g:i a' => '<span>' . $F_j_Y . '</span><code>F j, Y g:i a</code>',
|
||||
'Y-m-d H:i:s' => '<span>' . $Ymd . '</span><code>Y-m-d H:i:s</code>',
|
||||
'other' => '<span>' . __( 'Custom:', 'acf' ) . '</span>',
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Format', 'acf' ),
|
||||
'instructions' => __( 'The format returned via template functions', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'other_choice' => 1,
|
||||
'choices' => array(
|
||||
'd/m/Y g:i a' => '<span>' . $d_m_Y . '</span><code>d/m/Y g:i a</code>',
|
||||
'm/d/Y g:i a' => '<span>' . $m_d_Y . '</span><code>m/d/Y g:i a</code>',
|
||||
'F j, Y g:i a' => '<span>' . $F_j_Y . '</span><code>F j, Y g:i a</code>',
|
||||
'Y-m-d H:i:s' => '<span>' . $Ymd . '</span><code>Y-m-d H:i:s</code>',
|
||||
'other' => '<span>' . __( 'Custom:', 'acf' ) . '</span>',
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// first_day
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Week Starts On', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'first_day',
|
||||
'choices' => array_values( $wp_locale->weekday ),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_format_date( $value, $field['return_format'] );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_date_and_time_picker' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,183 +1,189 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_email') ) :
|
||||
if ( ! class_exists( 'acf_field_email' ) ) :
|
||||
|
||||
class acf_field_email extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'email';
|
||||
$this->label = __( 'Email', 'acf' );
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
);
|
||||
|
||||
class acf_field_email extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'email';
|
||||
$this->label = __("Email",'acf');
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => ''
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$keys = array( 'type', 'id', 'class', 'name', 'value', 'placeholder', 'pattern' );
|
||||
$keys2 = array( 'readonly', 'disabled', 'required', 'multiple' );
|
||||
$html = '';
|
||||
|
||||
|
||||
// prepend
|
||||
if( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$html .= '<div class="acf-input-prepend">' . acf_esc_html($field['prepend']) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append
|
||||
if( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$html .= '<div class="acf-input-append">' . acf_esc_html($field['append']) . '</div>';
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$keys = array( 'type', 'id', 'class', 'name', 'value', 'placeholder', 'pattern' );
|
||||
$keys2 = array( 'readonly', 'disabled', 'required', 'multiple' );
|
||||
$html = '';
|
||||
|
||||
// prepend
|
||||
if ( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$html .= '<div class="acf-input-prepend">' . acf_esc_html( $field['prepend'] ) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
// append
|
||||
if ( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$html .= '<div class="acf-input-append">' . acf_esc_html( $field['append'] ) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
// atts (value="123")
|
||||
foreach ( $keys as $k ) {
|
||||
if ( isset( $field[ $k ] ) ) {
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
}
|
||||
}
|
||||
|
||||
// atts2 (disabled="disabled")
|
||||
foreach ( $keys2 as $k ) {
|
||||
if ( ! empty( $field[ $k ] ) ) {
|
||||
$atts[ $k ] = $k;
|
||||
}
|
||||
}
|
||||
|
||||
// remove empty atts
|
||||
$atts = acf_clean_atts( $atts );
|
||||
|
||||
// render
|
||||
$html .= '<div class="acf-input-wrap">' . acf_get_text_input( $atts ) . '</div>';
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// atts (value="123")
|
||||
foreach( $keys as $k ) {
|
||||
if( isset($field[ $k ]) ) $atts[ $k ] = $field[ $k ];
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Default Value', 'acf' ),
|
||||
'instructions' => __( 'Appears when creating a new post', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
)
|
||||
);
|
||||
|
||||
// placeholder
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Placeholder Text', 'acf' ),
|
||||
'instructions' => __( 'Appears within the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'placeholder',
|
||||
)
|
||||
);
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Prepend', 'acf' ),
|
||||
'instructions' => __( 'Appears before the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
)
|
||||
);
|
||||
|
||||
// append
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Append', 'acf' ),
|
||||
'instructions' => __( 'Appears after the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// atts2 (disabled="disabled")
|
||||
foreach( $keys2 as $k ) {
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
/**
|
||||
* Validate the email value. If this method returns TRUE, the input value is valid. If
|
||||
* FALSE or a string is returned, the input value is invalid and the user is shown a
|
||||
* notice. If a string is returned, the string is show as the message text.
|
||||
*
|
||||
* @param bool $valid Whether the value is valid.
|
||||
* @param mixed $value The field value.
|
||||
* @param array $field The field array.
|
||||
* @param string $input The request variable name for the inbound field.
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate_value( $valid, $value, $field, $input ) {
|
||||
$flags = defined( 'FILTER_FLAG_EMAIL_UNICODE' ) ? FILTER_FLAG_EMAIL_UNICODE : 0;
|
||||
|
||||
if ( $value && filter_var( wp_unslash( $value ), FILTER_VALIDATE_EMAIL, $flags ) === false ) {
|
||||
return sprintf( __( "'%s' is not a valid email address", 'acf' ), esc_html( $value ) );
|
||||
}
|
||||
|
||||
return $valid;
|
||||
}
|
||||
|
||||
|
||||
// remove empty atts
|
||||
$atts = acf_clean_atts( $atts );
|
||||
|
||||
|
||||
// render
|
||||
$html .= '<div class="acf-input-wrap">' . acf_get_text_input( $atts ) . '</div>';
|
||||
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Default Value','acf'),
|
||||
'instructions' => __('Appears when creating a new post','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
));
|
||||
|
||||
|
||||
// placeholder
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Placeholder Text','acf'),
|
||||
'instructions' => __('Appears within the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'placeholder',
|
||||
));
|
||||
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Prepend','acf'),
|
||||
'instructions' => __('Appears before the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
));
|
||||
|
||||
|
||||
// append
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Append','acf'),
|
||||
'instructions' => __('Appears after the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the email value. If this method returns TRUE, the input value is valid. If
|
||||
* FALSE or a string is returned, the input value is invalid and the user is shown a
|
||||
* notice. If a string is returned, the string is show as the message text.
|
||||
*
|
||||
* @param bool $valid Whether the value is valid.
|
||||
* @param mixed $value The field value.
|
||||
* @param array $field The field array.
|
||||
* @param string $input The request variable name for the inbound field.
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function validate_value( $valid, $value, $field, $input ) {
|
||||
$flags = defined( 'FILTER_FLAG_EMAIL_UNICODE' ) ? FILTER_FLAG_EMAIL_UNICODE : 0;
|
||||
|
||||
if ( $value && filter_var( wp_unslash($value), FILTER_VALIDATE_EMAIL, $flags ) === false ) {
|
||||
return sprintf( __( "'%s' is not a valid email address", 'acf' ), esc_html( $value ) );
|
||||
}
|
||||
|
||||
return $valid;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_email' );
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_email' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,437 +1,460 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_file') ) :
|
||||
if ( ! class_exists( 'acf_field_file' ) ) :
|
||||
|
||||
class acf_field_file extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'file';
|
||||
$this->label = __("File",'acf');
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'return_format' => 'array',
|
||||
'library' => 'all',
|
||||
'min_size' => 0,
|
||||
'max_size' => 0,
|
||||
'mime_types' => ''
|
||||
);
|
||||
|
||||
// filters
|
||||
add_filter('get_media_item_args', array($this, 'get_media_item_args'));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// localize
|
||||
acf_localize_text(array(
|
||||
'Select File' => __('Select File', 'acf'),
|
||||
'Edit File' => __('Edit File', 'acf'),
|
||||
'Update File' => __('Update File', 'acf'),
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$uploader = acf_get_setting('uploader');
|
||||
|
||||
|
||||
// allow custom uploader
|
||||
$uploader = acf_maybe_get($field, 'uploader', $uploader);
|
||||
|
||||
|
||||
// enqueue
|
||||
if( $uploader == 'wp' ) {
|
||||
acf_enqueue_uploader();
|
||||
class acf_field_file extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'file';
|
||||
$this->label = __( 'File', 'acf' );
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'return_format' => 'array',
|
||||
'library' => 'all',
|
||||
'min_size' => 0,
|
||||
'max_size' => 0,
|
||||
'mime_types' => '',
|
||||
);
|
||||
|
||||
// filters
|
||||
add_filter( 'get_media_item_args', array( $this, 'get_media_item_args' ) );
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$o = array(
|
||||
'icon' => '',
|
||||
'title' => '',
|
||||
'url' => '',
|
||||
'filename' => '',
|
||||
'filesize' => ''
|
||||
);
|
||||
|
||||
$div = array(
|
||||
'class' => 'acf-file-uploader',
|
||||
'data-library' => $field['library'],
|
||||
'data-mime_types' => $field['mime_types'],
|
||||
'data-uploader' => $uploader
|
||||
);
|
||||
|
||||
|
||||
// has value?
|
||||
if( $field['value'] ) {
|
||||
|
||||
$attachment = acf_get_attachment($field['value']);
|
||||
if( $attachment ) {
|
||||
|
||||
// has value
|
||||
$div['class'] .= ' has-value';
|
||||
|
||||
// update
|
||||
$o['icon'] = $attachment['icon'];
|
||||
$o['title'] = $attachment['title'];
|
||||
$o['url'] = $attachment['url'];
|
||||
$o['filename'] = $attachment['filename'];
|
||||
if( $attachment['filesize'] ) {
|
||||
$o['filesize'] = size_format($attachment['filesize']);
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// localize
|
||||
acf_localize_text(
|
||||
array(
|
||||
'Select File' => __( 'Select File', 'acf' ),
|
||||
'Edit File' => __( 'Edit File', 'acf' ),
|
||||
'Update File' => __( 'Update File', 'acf' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$uploader = acf_get_setting( 'uploader' );
|
||||
|
||||
// allow custom uploader
|
||||
$uploader = acf_maybe_get( $field, 'uploader', $uploader );
|
||||
|
||||
// enqueue
|
||||
if ( $uploader == 'wp' ) {
|
||||
acf_enqueue_uploader();
|
||||
}
|
||||
|
||||
// vars
|
||||
$o = array(
|
||||
'icon' => '',
|
||||
'title' => '',
|
||||
'url' => '',
|
||||
'filename' => '',
|
||||
'filesize' => '',
|
||||
);
|
||||
|
||||
$div = array(
|
||||
'class' => 'acf-file-uploader',
|
||||
'data-library' => $field['library'],
|
||||
'data-mime_types' => $field['mime_types'],
|
||||
'data-uploader' => $uploader,
|
||||
);
|
||||
|
||||
// has value?
|
||||
if ( $field['value'] ) {
|
||||
|
||||
$attachment = acf_get_attachment( $field['value'] );
|
||||
if ( $attachment ) {
|
||||
|
||||
// has value
|
||||
$div['class'] .= ' has-value';
|
||||
|
||||
// update
|
||||
$o['icon'] = $attachment['icon'];
|
||||
$o['title'] = $attachment['title'];
|
||||
$o['url'] = $attachment['url'];
|
||||
$o['filename'] = $attachment['filename'];
|
||||
if ( $attachment['filesize'] ) {
|
||||
$o['filesize'] = size_format( $attachment['filesize'] );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
}
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $div ); ?>>
|
||||
<?php acf_hidden_input(array( 'name' => $field['name'], 'value' => $field['value'], 'data-name' => 'id' )); ?>
|
||||
<?php
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'name' => $field['name'],
|
||||
'value' => $field['value'],
|
||||
'data-name' => 'id',
|
||||
)
|
||||
);
|
||||
?>
|
||||
<div class="show-if-value file-wrap">
|
||||
<div class="file-icon">
|
||||
<img data-name="icon" src="<?php echo esc_url($o['icon']); ?>" alt=""/>
|
||||
<img data-name="icon" src="<?php echo esc_url( $o['icon'] ); ?>" alt=""/>
|
||||
</div>
|
||||
<div class="file-info">
|
||||
<p>
|
||||
<strong data-name="title"><?php echo esc_html($o['title']); ?></strong>
|
||||
<strong data-name="title"><?php echo esc_html( $o['title'] ); ?></strong>
|
||||
</p>
|
||||
<p>
|
||||
<strong><?php _e('File name', 'acf'); ?>:</strong>
|
||||
<a data-name="filename" href="<?php echo esc_url($o['url']); ?>" target="_blank"><?php echo esc_html($o['filename']); ?></a>
|
||||
<strong><?php _e( 'File name', 'acf' ); ?>:</strong>
|
||||
<a data-name="filename" href="<?php echo esc_url( $o['url'] ); ?>" target="_blank"><?php echo esc_html( $o['filename'] ); ?></a>
|
||||
</p>
|
||||
<p>
|
||||
<strong><?php _e('File size', 'acf'); ?>:</strong>
|
||||
<span data-name="filesize"><?php echo esc_html($o['filesize']); ?></span>
|
||||
<strong><?php _e( 'File size', 'acf' ); ?>:</strong>
|
||||
<span data-name="filesize"><?php echo esc_html( $o['filesize'] ); ?></span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="acf-actions -hover">
|
||||
<?php if( $uploader != 'basic' ): ?>
|
||||
<a class="acf-icon -pencil dark" data-name="edit" href="#" title="<?php _e('Edit', 'acf'); ?>"></a>
|
||||
<?php if ( $uploader != 'basic' ) : ?>
|
||||
<a class="acf-icon -pencil dark" data-name="edit" href="#" title="<?php _e( 'Edit', 'acf' ); ?>"></a>
|
||||
<?php endif; ?>
|
||||
<a class="acf-icon -cancel dark" data-name="remove" href="#" title="<?php _e('Remove', 'acf'); ?>"></a>
|
||||
<a class="acf-icon -cancel dark" data-name="remove" href="#" title="<?php _e( 'Remove', 'acf' ); ?>"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hide-if-value">
|
||||
<?php if( $uploader == 'basic' ): ?>
|
||||
<?php if ( $uploader == 'basic' ) : ?>
|
||||
|
||||
<?php if( $field['value'] && !is_numeric($field['value']) ): ?>
|
||||
<div class="acf-error-message"><p><?php echo acf_esc_html($field['value']); ?></p></div>
|
||||
<?php if ( $field['value'] && ! is_numeric( $field['value'] ) ) : ?>
|
||||
<div class="acf-error-message"><p><?php echo acf_esc_html( $field['value'] ); ?></p></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<label class="acf-basic-uploader">
|
||||
<?php acf_file_input(array( 'name' => $field['name'], 'id' => $field['id'] )); ?>
|
||||
<?php
|
||||
acf_file_input(
|
||||
array(
|
||||
'name' => $field['name'],
|
||||
'id' => $field['id'],
|
||||
)
|
||||
);
|
||||
?>
|
||||
</label>
|
||||
|
||||
<?php else: ?>
|
||||
<?php else : ?>
|
||||
|
||||
<p><?php _e('No file selected','acf'); ?> <a data-name="add" class="acf-button button" href="#"><?php _e('Add File','acf'); ?></a></p>
|
||||
<p><?php _e( 'No file selected', 'acf' ); ?> <a data-name="add" class="acf-button button" href="#"><?php _e( 'Add File', 'acf' ); ?></a></p>
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// clear numeric settings
|
||||
$clear = array(
|
||||
'min_size',
|
||||
'max_size'
|
||||
);
|
||||
|
||||
foreach( $clear as $k ) {
|
||||
|
||||
if( empty($field[$k]) ) {
|
||||
|
||||
$field[$k] = '';
|
||||
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// clear numeric settings
|
||||
$clear = array(
|
||||
'min_size',
|
||||
'max_size',
|
||||
);
|
||||
|
||||
foreach ( $clear as $k ) {
|
||||
|
||||
if ( empty( $field[ $k ] ) ) {
|
||||
|
||||
$field[ $k ] = '';
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Value', 'acf' ),
|
||||
'instructions' => __( 'Specify the returned value on front end', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'array' => __( 'File Array', 'acf' ),
|
||||
'url' => __( 'File URL', 'acf' ),
|
||||
'id' => __( 'File ID', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// library
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Library', 'acf' ),
|
||||
'instructions' => __( 'Limit the media library choice', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'library',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'all' => __( 'All', 'acf' ),
|
||||
'uploadedTo' => __( 'Uploaded to post', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// min
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Minimum', 'acf' ),
|
||||
'instructions' => __( 'Restrict which files can be uploaded', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'min_size',
|
||||
'prepend' => __( 'File size', 'acf' ),
|
||||
'append' => 'MB',
|
||||
)
|
||||
);
|
||||
|
||||
// max
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Maximum', 'acf' ),
|
||||
'instructions' => __( 'Restrict which files can be uploaded', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'max_size',
|
||||
'prepend' => __( 'File size', 'acf' ),
|
||||
'append' => 'MB',
|
||||
)
|
||||
);
|
||||
|
||||
// allowed type
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Allowed file types', 'acf' ),
|
||||
'instructions' => __( 'Comma separated list. Leave blank for all types', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'mime_types',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Value','acf'),
|
||||
'instructions' => __('Specify the returned value on front end','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'array' => __("File Array",'acf'),
|
||||
'url' => __("File URL",'acf'),
|
||||
'id' => __("File ID",'acf')
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// library
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Library','acf'),
|
||||
'instructions' => __('Limit the media library choice','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'library',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'all' => __('All', 'acf'),
|
||||
'uploadedTo' => __('Uploaded to post', 'acf')
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// min
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Minimum','acf'),
|
||||
'instructions' => __('Restrict which files can be uploaded','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'min_size',
|
||||
'prepend' => __('File size', 'acf'),
|
||||
'append' => 'MB',
|
||||
));
|
||||
|
||||
|
||||
// max
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Maximum','acf'),
|
||||
'instructions' => __('Restrict which files can be uploaded','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'max_size',
|
||||
'prepend' => __('File size', 'acf'),
|
||||
'append' => 'MB',
|
||||
));
|
||||
|
||||
|
||||
// allowed type
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Allowed file types','acf'),
|
||||
'instructions' => __('Comma separated list. Leave blank for all types','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'mime_types',
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if( empty($value) ) return false;
|
||||
|
||||
|
||||
// bail early if not numeric (error message)
|
||||
if( !is_numeric($value) ) return false;
|
||||
|
||||
|
||||
// convert to int
|
||||
$value = intval($value);
|
||||
|
||||
|
||||
// format
|
||||
if( $field['return_format'] == 'url' ) {
|
||||
|
||||
return wp_get_attachment_url($value);
|
||||
|
||||
} elseif( $field['return_format'] == 'array' ) {
|
||||
|
||||
return acf_get_attachment( $value );
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_media_item_args
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 27/01/13
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param $vars (array)
|
||||
* @return $vars
|
||||
*/
|
||||
|
||||
function get_media_item_args( $vars ) {
|
||||
|
||||
$vars['send'] = true;
|
||||
return($vars);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// Bail early if no value.
|
||||
if( empty($value) ) {
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if ( empty( $value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bail early if not numeric (error message)
|
||||
if ( ! is_numeric( $value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// convert to int
|
||||
$value = intval( $value );
|
||||
|
||||
// format
|
||||
if ( $field['return_format'] == 'url' ) {
|
||||
|
||||
return wp_get_attachment_url( $value );
|
||||
|
||||
} elseif ( $field['return_format'] == 'array' ) {
|
||||
|
||||
return acf_get_attachment( $value );
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Parse value for id.
|
||||
$attachment_id = acf_idval( $value );
|
||||
|
||||
// Connect attacment to post.
|
||||
acf_connect_attachment_to_post( $attachment_id, $post_id );
|
||||
|
||||
// Return id.
|
||||
return $attachment_id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* This function will validate a basic file input
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ){
|
||||
|
||||
// bail early if empty
|
||||
if( empty($value) ) return $valid;
|
||||
|
||||
|
||||
// bail ealry if is numeric
|
||||
if( is_numeric($value) ) return $valid;
|
||||
|
||||
|
||||
// bail ealry if not basic string
|
||||
if( !is_string($value) ) return $valid;
|
||||
|
||||
|
||||
// decode value
|
||||
$file = null;
|
||||
parse_str($value, $file);
|
||||
|
||||
|
||||
// bail early if no attachment
|
||||
if( empty($file) ) return $valid;
|
||||
|
||||
|
||||
// get errors
|
||||
$errors = acf_validate_attachment( $file, $field, 'basic_upload' );
|
||||
|
||||
|
||||
// append error
|
||||
if( !empty($errors) ) {
|
||||
|
||||
$valid = implode("\n", $errors);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* get_media_item_args
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 27/01/13
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param $vars (array)
|
||||
* @return $vars
|
||||
*/
|
||||
|
||||
function get_media_item_args( $vars ) {
|
||||
|
||||
$vars['send'] = true;
|
||||
return( $vars );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $valid;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// Bail early if no value.
|
||||
if ( empty( $value ) ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Parse value for id.
|
||||
$attachment_id = acf_idval( $value );
|
||||
|
||||
// Connect attacment to post.
|
||||
acf_connect_attachment_to_post( $attachment_id, $post_id );
|
||||
|
||||
// Return id.
|
||||
return $attachment_id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* This function will validate a basic file input
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ) {
|
||||
|
||||
// bail early if empty
|
||||
if ( empty( $value ) ) {
|
||||
return $valid;
|
||||
}
|
||||
|
||||
// bail ealry if is numeric
|
||||
if ( is_numeric( $value ) ) {
|
||||
return $valid;
|
||||
}
|
||||
|
||||
// bail ealry if not basic string
|
||||
if ( ! is_string( $value ) ) {
|
||||
return $valid;
|
||||
}
|
||||
|
||||
// decode value
|
||||
$file = null;
|
||||
parse_str( $value, $file );
|
||||
|
||||
// bail early if no attachment
|
||||
if ( empty( $file ) ) {
|
||||
return $valid;
|
||||
}
|
||||
|
||||
// get errors
|
||||
$errors = acf_validate_attachment( $file, $field, 'basic_upload' );
|
||||
|
||||
// append error
|
||||
if ( ! empty( $errors ) ) {
|
||||
|
||||
$valid = implode( "\n", $errors );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $valid;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_file' );
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_file' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,291 +1,312 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_google_map') ) :
|
||||
if ( ! class_exists( 'acf_field_google_map' ) ) :
|
||||
|
||||
class acf_field_google_map extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'google_map';
|
||||
$this->label = __("Google Map",'acf');
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'height' => '',
|
||||
'center_lat' => '',
|
||||
'center_lng' => '',
|
||||
'zoom' => ''
|
||||
);
|
||||
$this->default_values = array(
|
||||
'height' => '400',
|
||||
'center_lat' => '-37.81411',
|
||||
'center_lng' => '144.96328',
|
||||
'zoom' => '14'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// localize
|
||||
acf_localize_text(array(
|
||||
'Sorry, this browser does not support geolocation' => __('Sorry, this browser does not support geolocation', 'acf'),
|
||||
));
|
||||
|
||||
|
||||
// bail ealry if no enqueue
|
||||
if( !acf_get_setting('enqueue_google_maps') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$api = array(
|
||||
'key' => acf_get_setting('google_api_key'),
|
||||
'client' => acf_get_setting('google_api_client'),
|
||||
'libraries' => 'places',
|
||||
'ver' => 3,
|
||||
'callback' => '',
|
||||
'language' => acf_get_locale()
|
||||
);
|
||||
|
||||
|
||||
// filter
|
||||
$api = apply_filters('acf/fields/google_map/api', $api);
|
||||
|
||||
|
||||
// remove empty
|
||||
if( empty($api['key']) ) unset($api['key']);
|
||||
if( empty($api['client']) ) unset($api['client']);
|
||||
|
||||
|
||||
// construct url
|
||||
$url = add_query_arg($api, 'https://maps.googleapis.com/maps/api/js');
|
||||
|
||||
|
||||
// localize
|
||||
acf_localize_data(array(
|
||||
'google_map_api' => $url
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// Apply defaults.
|
||||
foreach( $this->default_values as $k => $v ) {
|
||||
if( !$field[ $k ] ) {
|
||||
$field[ $k ] = $v;
|
||||
}
|
||||
class acf_field_google_map extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'google_map';
|
||||
$this->label = __( 'Google Map', 'acf' );
|
||||
$this->category = 'jquery';
|
||||
$this->defaults = array(
|
||||
'height' => '',
|
||||
'center_lat' => '',
|
||||
'center_lng' => '',
|
||||
'zoom' => '',
|
||||
);
|
||||
$this->default_values = array(
|
||||
'height' => '400',
|
||||
'center_lat' => '-37.81411',
|
||||
'center_lng' => '144.96328',
|
||||
'zoom' => '14',
|
||||
);
|
||||
}
|
||||
|
||||
// Attrs.
|
||||
$attrs = array(
|
||||
'id' => $field['id'],
|
||||
'class' => "acf-google-map {$field['class']}",
|
||||
'data-lat' => $field['center_lat'],
|
||||
'data-lng' => $field['center_lng'],
|
||||
'data-zoom' => $field['zoom'],
|
||||
);
|
||||
|
||||
$search = '';
|
||||
if( $field['value'] ) {
|
||||
$attrs['class'] .= ' -value';
|
||||
$search = $field['value']['address'];
|
||||
} else {
|
||||
$field['value'] = '';
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// localize
|
||||
acf_localize_text(
|
||||
array(
|
||||
'Sorry, this browser does not support geolocation' => __( 'Sorry, this browser does not support geolocation', 'acf' ),
|
||||
)
|
||||
);
|
||||
|
||||
// bail ealry if no enqueue
|
||||
if ( ! acf_get_setting( 'enqueue_google_maps' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
$api = array(
|
||||
'key' => acf_get_setting( 'google_api_key' ),
|
||||
'client' => acf_get_setting( 'google_api_client' ),
|
||||
'libraries' => 'places',
|
||||
'ver' => 3,
|
||||
'callback' => '',
|
||||
'language' => acf_get_locale(),
|
||||
);
|
||||
|
||||
// filter
|
||||
$api = apply_filters( 'acf/fields/google_map/api', $api );
|
||||
|
||||
// remove empty
|
||||
if ( empty( $api['key'] ) ) {
|
||||
unset( $api['key'] );
|
||||
}
|
||||
if ( empty( $api['client'] ) ) {
|
||||
unset( $api['client'] );
|
||||
}
|
||||
|
||||
// construct url
|
||||
$url = add_query_arg( $api, 'https://maps.googleapis.com/maps/api/js' );
|
||||
|
||||
// localize
|
||||
acf_localize_data(
|
||||
array(
|
||||
'google_map_api' => $url,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e($attrs); ?>>
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// Apply defaults.
|
||||
foreach ( $this->default_values as $k => $v ) {
|
||||
if ( ! $field[ $k ] ) {
|
||||
$field[ $k ] = $v;
|
||||
}
|
||||
}
|
||||
|
||||
// Attrs.
|
||||
$attrs = array(
|
||||
'id' => $field['id'],
|
||||
'class' => "acf-google-map {$field['class']}",
|
||||
'data-lat' => $field['center_lat'],
|
||||
'data-lng' => $field['center_lng'],
|
||||
'data-zoom' => $field['zoom'],
|
||||
);
|
||||
|
||||
$search = '';
|
||||
if ( $field['value'] ) {
|
||||
$attrs['class'] .= ' -value';
|
||||
$search = $field['value']['address'];
|
||||
} else {
|
||||
$field['value'] = '';
|
||||
}
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $attrs ); ?>>
|
||||
|
||||
<?php acf_hidden_input( array('name' => $field['name'], 'value' => $field['value']) ); ?>
|
||||
<?php
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'name' => $field['name'],
|
||||
'value' => $field['value'],
|
||||
)
|
||||
);
|
||||
?>
|
||||
|
||||
<div class="title">
|
||||
|
||||
<div class="acf-actions -hover">
|
||||
<a href="#" data-name="search" class="acf-icon -search grey" title="<?php _e("Search", 'acf'); ?>"></a>
|
||||
<a href="#" data-name="clear" class="acf-icon -cancel grey" title="<?php _e("Clear location", 'acf'); ?>"></a>
|
||||
<a href="#" data-name="locate" class="acf-icon -location grey" title="<?php _e("Find current location", 'acf'); ?>"></a>
|
||||
<a href="#" data-name="search" class="acf-icon -search grey" title="<?php _e( 'Search', 'acf' ); ?>"></a>
|
||||
<a href="#" data-name="clear" class="acf-icon -cancel grey" title="<?php _e( 'Clear location', 'acf' ); ?>"></a>
|
||||
<a href="#" data-name="locate" class="acf-icon -location grey" title="<?php _e( 'Find current location', 'acf' ); ?>"></a>
|
||||
</div>
|
||||
|
||||
<input class="search" type="text" placeholder="<?php _e("Search for address...",'acf'); ?>" value="<?php echo esc_attr( $search ); ?>" />
|
||||
<input class="search" type="text" placeholder="<?php _e( 'Search for address...', 'acf' ); ?>" value="<?php echo esc_attr( $search ); ?>" />
|
||||
<i class="acf-loading"></i>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="canvas" style="<?php echo esc_attr('height: '.$field['height'].'px'); ?>"></div>
|
||||
<div class="canvas" style="<?php echo esc_attr( 'height: ' . $field['height'] . 'px' ); ?>"></div>
|
||||
|
||||
</div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// center_lat
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Center','acf'),
|
||||
'instructions' => __('Center the initial map','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'center_lat',
|
||||
'prepend' => 'lat',
|
||||
'placeholder' => $this->default_values['center_lat']
|
||||
));
|
||||
|
||||
|
||||
// center_lng
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Center','acf'),
|
||||
'instructions' => __('Center the initial map','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'center_lng',
|
||||
'prepend' => 'lng',
|
||||
'placeholder' => $this->default_values['center_lng'],
|
||||
'_append' => 'center_lat'
|
||||
));
|
||||
|
||||
|
||||
// zoom
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Zoom','acf'),
|
||||
'instructions' => __('Set the initial zoom level','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'zoom',
|
||||
'placeholder' => $this->default_values['zoom']
|
||||
));
|
||||
|
||||
|
||||
// allow_null
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Height','acf'),
|
||||
'instructions' => __('Customize the map height','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'height',
|
||||
'append' => 'px',
|
||||
'placeholder' => $this->default_values['height']
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* load_value
|
||||
*
|
||||
* Filters the value loaded from the database.
|
||||
*
|
||||
* @date 16/10/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param mixed $value The value loaded from the database.
|
||||
* @param mixed $post_id The post ID where the value is saved.
|
||||
* @param array $field The field settings array.
|
||||
* @return (array|false)
|
||||
*/
|
||||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
// Ensure value is an array.
|
||||
if( $value ) {
|
||||
return wp_parse_args($value, array(
|
||||
'address' => '',
|
||||
'lat' => 0,
|
||||
'lng' => 0
|
||||
));
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
// Return default.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// decode JSON string.
|
||||
if( is_string($value) ) {
|
||||
$value = json_decode( wp_unslash($value), true );
|
||||
}
|
||||
|
||||
// Ensure value is an array.
|
||||
if( $value ) {
|
||||
return (array) $value;
|
||||
}
|
||||
|
||||
// Return default.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_google_map' );
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// center_lat
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Center', 'acf' ),
|
||||
'instructions' => __( 'Center the initial map', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'center_lat',
|
||||
'prepend' => 'lat',
|
||||
'placeholder' => $this->default_values['center_lat'],
|
||||
)
|
||||
);
|
||||
|
||||
// center_lng
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Center', 'acf' ),
|
||||
'instructions' => __( 'Center the initial map', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'center_lng',
|
||||
'prepend' => 'lng',
|
||||
'placeholder' => $this->default_values['center_lng'],
|
||||
'_append' => 'center_lat',
|
||||
)
|
||||
);
|
||||
|
||||
// zoom
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Zoom', 'acf' ),
|
||||
'instructions' => __( 'Set the initial zoom level', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'zoom',
|
||||
'placeholder' => $this->default_values['zoom'],
|
||||
)
|
||||
);
|
||||
|
||||
// allow_null
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Height', 'acf' ),
|
||||
'instructions' => __( 'Customize the map height', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'height',
|
||||
'append' => 'px',
|
||||
'placeholder' => $this->default_values['height'],
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* load_value
|
||||
*
|
||||
* Filters the value loaded from the database.
|
||||
*
|
||||
* @date 16/10/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param mixed $value The value loaded from the database.
|
||||
* @param mixed $post_id The post ID where the value is saved.
|
||||
* @param array $field The field settings array.
|
||||
* @return (array|false)
|
||||
*/
|
||||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
// Ensure value is an array.
|
||||
if ( $value ) {
|
||||
return wp_parse_args(
|
||||
$value,
|
||||
array(
|
||||
'address' => '',
|
||||
'lat' => 0,
|
||||
'lng' => 0,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Return default.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// decode JSON string.
|
||||
if ( is_string( $value ) ) {
|
||||
$value = json_decode( wp_unslash( $value ), true );
|
||||
}
|
||||
|
||||
// Ensure value is an array.
|
||||
if ( $value ) {
|
||||
return (array) $value;
|
||||
}
|
||||
|
||||
// Return default.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_google_map' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,419 +1,452 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_image') ) :
|
||||
if ( ! class_exists( 'acf_field_image' ) ) :
|
||||
|
||||
class acf_field_image extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'image';
|
||||
$this->label = __( 'Image', 'acf' );
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'return_format' => 'array',
|
||||
'preview_size' => 'medium',
|
||||
'library' => 'all',
|
||||
'min_width' => 0,
|
||||
'min_height' => 0,
|
||||
'min_size' => 0,
|
||||
'max_width' => 0,
|
||||
'max_height' => 0,
|
||||
'max_size' => 0,
|
||||
'mime_types' => '',
|
||||
);
|
||||
|
||||
// filters
|
||||
add_filter( 'get_media_item_args', array( $this, 'get_media_item_args' ) );
|
||||
|
||||
class acf_field_image extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'image';
|
||||
$this->label = __("Image",'acf');
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'return_format' => 'array',
|
||||
'preview_size' => 'medium',
|
||||
'library' => 'all',
|
||||
'min_width' => 0,
|
||||
'min_height' => 0,
|
||||
'min_size' => 0,
|
||||
'max_width' => 0,
|
||||
'max_height' => 0,
|
||||
'max_size' => 0,
|
||||
'mime_types' => ''
|
||||
);
|
||||
|
||||
// filters
|
||||
add_filter('get_media_item_args', array($this, 'get_media_item_args'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// localize
|
||||
acf_localize_text(array(
|
||||
'Select Image' => __('Select Image', 'acf'),
|
||||
'Edit Image' => __('Edit Image', 'acf'),
|
||||
'Update Image' => __('Update Image', 'acf'),
|
||||
'All images' => __('All images', 'acf'),
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the field HTML.
|
||||
*
|
||||
* @date 23/01/13
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param array $field The field settings.
|
||||
* @return void
|
||||
*/
|
||||
function render_field( $field ) {
|
||||
$uploader = acf_get_setting('uploader');
|
||||
|
||||
// Enqueue uploader scripts
|
||||
if( $uploader === 'wp' ) {
|
||||
acf_enqueue_uploader();
|
||||
}
|
||||
|
||||
// Elements and attributes.
|
||||
$value = '';
|
||||
$div_attrs = array(
|
||||
'class' => 'acf-image-uploader',
|
||||
'data-preview_size' => $field['preview_size'],
|
||||
'data-library' => $field['library'],
|
||||
'data-mime_types' => $field['mime_types'],
|
||||
'data-uploader' => $uploader
|
||||
);
|
||||
$img_attrs = array(
|
||||
'src' => '',
|
||||
'alt' => '',
|
||||
'data-name' => 'image'
|
||||
);
|
||||
|
||||
// Detect value.
|
||||
if( $field['value'] && is_numeric($field['value']) ) {
|
||||
$image = wp_get_attachment_image_src( $field['value'], $field['preview_size'] );
|
||||
if( $image ) {
|
||||
$value = $field['value'];
|
||||
$img_attrs['src'] = $image[0];
|
||||
$img_attrs['alt'] = get_post_meta( $field['value'], '_wp_attachment_image_alt', true );
|
||||
$div_attrs['class'] .= ' has-value';
|
||||
}
|
||||
}
|
||||
|
||||
// Add "preview size" max width and height style.
|
||||
// Apply max-width to wrap, and max-height to img for max compatibility with field widths.
|
||||
$size = acf_get_image_size( $field['preview_size'] );
|
||||
$size_w = $size['width'] ? $size['width'] . 'px' : '100%';
|
||||
$size_h = $size['height'] ? $size['height'] . 'px' : '100%';
|
||||
$img_attrs['style'] = sprintf( 'max-height: %s;', $size_h );
|
||||
|
||||
// Render HTML.
|
||||
?>
|
||||
/*
|
||||
* input_admin_enqueue_scripts
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/12/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function input_admin_enqueue_scripts() {
|
||||
|
||||
// localize
|
||||
acf_localize_text(
|
||||
array(
|
||||
'Select Image' => __( 'Select Image', 'acf' ),
|
||||
'Edit Image' => __( 'Edit Image', 'acf' ),
|
||||
'Update Image' => __( 'Update Image', 'acf' ),
|
||||
'All images' => __( 'All images', 'acf' ),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the field HTML.
|
||||
*
|
||||
* @date 23/01/13
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param array $field The field settings.
|
||||
* @return void
|
||||
*/
|
||||
function render_field( $field ) {
|
||||
$uploader = acf_get_setting( 'uploader' );
|
||||
|
||||
// Enqueue uploader scripts
|
||||
if ( $uploader === 'wp' ) {
|
||||
acf_enqueue_uploader();
|
||||
}
|
||||
|
||||
// Elements and attributes.
|
||||
$value = '';
|
||||
$div_attrs = array(
|
||||
'class' => 'acf-image-uploader',
|
||||
'data-preview_size' => $field['preview_size'],
|
||||
'data-library' => $field['library'],
|
||||
'data-mime_types' => $field['mime_types'],
|
||||
'data-uploader' => $uploader,
|
||||
);
|
||||
$img_attrs = array(
|
||||
'src' => '',
|
||||
'alt' => '',
|
||||
'data-name' => 'image',
|
||||
);
|
||||
|
||||
// Detect value.
|
||||
if ( $field['value'] && is_numeric( $field['value'] ) ) {
|
||||
$image = wp_get_attachment_image_src( $field['value'], $field['preview_size'] );
|
||||
if ( $image ) {
|
||||
$value = $field['value'];
|
||||
$img_attrs['src'] = $image[0];
|
||||
$img_attrs['alt'] = get_post_meta( $field['value'], '_wp_attachment_image_alt', true );
|
||||
$div_attrs['class'] .= ' has-value';
|
||||
}
|
||||
}
|
||||
|
||||
// Add "preview size" max width and height style.
|
||||
// Apply max-width to wrap, and max-height to img for max compatibility with field widths.
|
||||
$size = acf_get_image_size( $field['preview_size'] );
|
||||
$size_w = $size['width'] ? $size['width'] . 'px' : '100%';
|
||||
$size_h = $size['height'] ? $size['height'] . 'px' : '100%';
|
||||
$img_attrs['style'] = sprintf( 'max-height: %s;', $size_h );
|
||||
|
||||
// Render HTML.
|
||||
?>
|
||||
<div <?php echo acf_esc_attrs( $div_attrs ); ?>>
|
||||
<?php acf_hidden_input(array(
|
||||
'name' => $field['name'],
|
||||
'value' => $value
|
||||
)); ?>
|
||||
<?php
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'name' => $field['name'],
|
||||
'value' => $value,
|
||||
)
|
||||
);
|
||||
?>
|
||||
<div class="show-if-value image-wrap" style="max-width: <?php echo esc_attr( $size_w ); ?>">
|
||||
<img <?php echo acf_esc_attrs( $img_attrs ); ?> />
|
||||
<div class="acf-actions -hover">
|
||||
<?php if( $uploader !== 'basic' ): ?>
|
||||
<?php if ( $uploader !== 'basic' ) : ?>
|
||||
<a class="acf-icon -pencil dark" data-name="edit" href="#" title="<?php _e( 'Edit', 'acf' ); ?>"></a>
|
||||
<?php endif; ?>
|
||||
<a class="acf-icon -cancel dark" data-name="remove" href="#" title="<?php _e( 'Remove', 'acf' ); ?>"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hide-if-value">
|
||||
<?php if( $uploader === 'basic' ): ?>
|
||||
<?php if( $field['value'] && !is_numeric($field['value']) ): ?>
|
||||
<?php if ( $uploader === 'basic' ) : ?>
|
||||
<?php if ( $field['value'] && ! is_numeric( $field['value'] ) ) : ?>
|
||||
<div class="acf-error-message"><p><?php echo acf_esc_html( $field['value'] ); ?></p></div>
|
||||
<?php endif; ?>
|
||||
<label class="acf-basic-uploader">
|
||||
<?php acf_file_input(array(
|
||||
'name' => $field['name'],
|
||||
'id' => $field['id']
|
||||
)); ?>
|
||||
<?php
|
||||
acf_file_input(
|
||||
array(
|
||||
'name' => $field['name'],
|
||||
'id' => $field['id'],
|
||||
)
|
||||
);
|
||||
?>
|
||||
</label>
|
||||
<?php else: ?>
|
||||
<?php else : ?>
|
||||
<p><?php _e( 'No image selected', 'acf' ); ?> <a data-name="add" class="acf-button button" href="#"><?php _e( 'Add Image', 'acf' ); ?></a></p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// clear numeric settings
|
||||
$clear = array(
|
||||
'min_width',
|
||||
'min_height',
|
||||
'min_size',
|
||||
'max_width',
|
||||
'max_height',
|
||||
'max_size'
|
||||
);
|
||||
|
||||
foreach( $clear as $k ) {
|
||||
|
||||
if( empty($field[$k]) ) {
|
||||
|
||||
$field[$k] = '';
|
||||
|
||||
<?php
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// clear numeric settings
|
||||
$clear = array(
|
||||
'min_width',
|
||||
'min_height',
|
||||
'min_size',
|
||||
'max_width',
|
||||
'max_height',
|
||||
'max_size',
|
||||
);
|
||||
|
||||
foreach ( $clear as $k ) {
|
||||
|
||||
if ( empty( $field[ $k ] ) ) {
|
||||
|
||||
$field[ $k ] = '';
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Format', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'array' => __( 'Image Array', 'acf' ),
|
||||
'url' => __( 'Image URL', 'acf' ),
|
||||
'id' => __( 'Image ID', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// preview_size
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Preview Size', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'preview_size',
|
||||
'choices' => acf_get_image_sizes(),
|
||||
)
|
||||
);
|
||||
|
||||
// library
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Library', 'acf' ),
|
||||
'instructions' => __( 'Limit the media library choice', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'library',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'all' => __( 'All', 'acf' ),
|
||||
'uploadedTo' => __( 'Uploaded to post', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// min
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Minimum', 'acf' ),
|
||||
'instructions' => __( 'Restrict which images can be uploaded', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'min_width',
|
||||
'prepend' => __( 'Width', 'acf' ),
|
||||
'append' => 'px',
|
||||
)
|
||||
);
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'min_height',
|
||||
'prepend' => __( 'Height', 'acf' ),
|
||||
'append' => 'px',
|
||||
'_append' => 'min_width',
|
||||
)
|
||||
);
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'min_size',
|
||||
'prepend' => __( 'File size', 'acf' ),
|
||||
'append' => 'MB',
|
||||
'_append' => 'min_width',
|
||||
)
|
||||
);
|
||||
|
||||
// max
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Maximum', 'acf' ),
|
||||
'instructions' => __( 'Restrict which images can be uploaded', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'max_width',
|
||||
'prepend' => __( 'Width', 'acf' ),
|
||||
'append' => 'px',
|
||||
)
|
||||
);
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'max_height',
|
||||
'prepend' => __( 'Height', 'acf' ),
|
||||
'append' => 'px',
|
||||
'_append' => 'max_width',
|
||||
)
|
||||
);
|
||||
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'max_size',
|
||||
'prepend' => __( 'File size', 'acf' ),
|
||||
'append' => 'MB',
|
||||
'_append' => 'max_width',
|
||||
)
|
||||
);
|
||||
|
||||
// allowed type
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Allowed file types', 'acf' ),
|
||||
'instructions' => __( 'Comma separated list. Leave blank for all types', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'mime_types',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Format','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'array' => __("Image Array",'acf'),
|
||||
'url' => __("Image URL",'acf'),
|
||||
'id' => __("Image ID",'acf')
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// preview_size
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Preview Size','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'select',
|
||||
'name' => 'preview_size',
|
||||
'choices' => acf_get_image_sizes()
|
||||
));
|
||||
|
||||
|
||||
// library
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Library','acf'),
|
||||
'instructions' => __('Limit the media library choice','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'library',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'all' => __('All', 'acf'),
|
||||
'uploadedTo' => __('Uploaded to post', 'acf')
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// min
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Minimum','acf'),
|
||||
'instructions' => __('Restrict which images can be uploaded','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'min_width',
|
||||
'prepend' => __('Width', 'acf'),
|
||||
'append' => 'px',
|
||||
));
|
||||
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'min_height',
|
||||
'prepend' => __('Height', 'acf'),
|
||||
'append' => 'px',
|
||||
'_append' => 'min_width'
|
||||
));
|
||||
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'min_size',
|
||||
'prepend' => __('File size', 'acf'),
|
||||
'append' => 'MB',
|
||||
'_append' => 'min_width'
|
||||
));
|
||||
|
||||
|
||||
// max
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Maximum','acf'),
|
||||
'instructions' => __('Restrict which images can be uploaded','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'max_width',
|
||||
'prepend' => __('Width', 'acf'),
|
||||
'append' => 'px',
|
||||
));
|
||||
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'max_height',
|
||||
'prepend' => __('Height', 'acf'),
|
||||
'append' => 'px',
|
||||
'_append' => 'max_width'
|
||||
));
|
||||
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => '',
|
||||
'type' => 'text',
|
||||
'name' => 'max_size',
|
||||
'prepend' => __('File size', 'acf'),
|
||||
'append' => 'MB',
|
||||
'_append' => 'max_width'
|
||||
));
|
||||
|
||||
|
||||
// allowed type
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Allowed file types','acf'),
|
||||
'instructions' => __('Comma separated list. Leave blank for all types','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'mime_types',
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if( empty($value) ) return false;
|
||||
|
||||
|
||||
// bail early if not numeric (error message)
|
||||
if( !is_numeric($value) ) return false;
|
||||
|
||||
|
||||
// convert to int
|
||||
$value = intval($value);
|
||||
|
||||
|
||||
// format
|
||||
if( $field['return_format'] == 'url' ) {
|
||||
|
||||
return wp_get_attachment_url( $value );
|
||||
|
||||
} elseif( $field['return_format'] == 'array' ) {
|
||||
|
||||
return acf_get_attachment( $value );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_media_item_args
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 27/01/13
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param $vars (array)
|
||||
* @return $vars
|
||||
*/
|
||||
|
||||
function get_media_item_args( $vars ) {
|
||||
|
||||
$vars['send'] = true;
|
||||
return($vars);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type('file')->update_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* This function will validate a basic file input
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ){
|
||||
|
||||
return acf_get_field_type('file')->validate_value( $valid, $value, $field, $input );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_image' );
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if ( empty( $value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bail early if not numeric (error message)
|
||||
if ( ! is_numeric( $value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// convert to int
|
||||
$value = intval( $value );
|
||||
|
||||
// format
|
||||
if ( $field['return_format'] == 'url' ) {
|
||||
|
||||
return wp_get_attachment_url( $value );
|
||||
|
||||
} elseif ( $field['return_format'] == 'array' ) {
|
||||
|
||||
return acf_get_attachment( $value );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_media_item_args
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 27/01/13
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param $vars (array)
|
||||
* @return $vars
|
||||
*/
|
||||
|
||||
function get_media_item_args( $vars ) {
|
||||
|
||||
$vars['send'] = true;
|
||||
return( $vars );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type( 'file' )->update_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* This function will validate a basic file input
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ) {
|
||||
|
||||
return acf_get_field_type( 'file' )->validate_value( $valid, $value, $field, $input );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_image' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,287 +1,291 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_link') ) :
|
||||
if ( ! class_exists( 'acf_field_link' ) ) :
|
||||
|
||||
class acf_field_link extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'link';
|
||||
$this->label = __("Link",'acf');
|
||||
$this->category = 'relational';
|
||||
$this->defaults = array(
|
||||
'return_format' => 'array',
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_link
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/5/17
|
||||
* @since 5.5.13
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function get_link( $value = '' ) {
|
||||
|
||||
// vars
|
||||
$link = array(
|
||||
'title' => '',
|
||||
'url' => '',
|
||||
'target' => ''
|
||||
);
|
||||
|
||||
|
||||
// array (ACF 5.6.0)
|
||||
if( is_array($value) ) {
|
||||
|
||||
$link = array_merge($link, $value);
|
||||
|
||||
// post id (ACF < 5.6.0)
|
||||
} elseif( is_numeric($value) ) {
|
||||
|
||||
$link['title'] = get_the_title( $value );
|
||||
$link['url'] = get_permalink( $value );
|
||||
|
||||
// string (ACF < 5.6.0)
|
||||
} elseif( is_string($value) ) {
|
||||
|
||||
$link['url'] = $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $link;
|
||||
|
||||
}
|
||||
|
||||
class acf_field_link extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'link';
|
||||
$this->label = __( 'Link', 'acf' );
|
||||
$this->category = 'relational';
|
||||
$this->defaults = array(
|
||||
'return_format' => 'array',
|
||||
);
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ){
|
||||
|
||||
// vars
|
||||
$div = array(
|
||||
'id' => $field['id'],
|
||||
'class' => $field['class'] . ' acf-link',
|
||||
);
|
||||
|
||||
|
||||
// render scripts/styles
|
||||
acf_enqueue_uploader();
|
||||
|
||||
|
||||
// get link
|
||||
$link = $this->get_link( $field['value'] );
|
||||
|
||||
|
||||
// classes
|
||||
if( $link['url'] ) {
|
||||
$div['class'] .= ' -value';
|
||||
}
|
||||
|
||||
if( $link['target'] === '_blank' ) {
|
||||
$div['class'] .= ' -external';
|
||||
|
||||
|
||||
/*
|
||||
* get_link
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 16/5/17
|
||||
* @since 5.5.13
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function get_link( $value = '' ) {
|
||||
|
||||
// vars
|
||||
$link = array(
|
||||
'title' => '',
|
||||
'url' => '',
|
||||
'target' => '',
|
||||
);
|
||||
|
||||
// array (ACF 5.6.0)
|
||||
if ( is_array( $value ) ) {
|
||||
|
||||
$link = array_merge( $link, $value );
|
||||
|
||||
// post id (ACF < 5.6.0)
|
||||
} elseif ( is_numeric( $value ) ) {
|
||||
|
||||
$link['title'] = get_the_title( $value );
|
||||
$link['url'] = get_permalink( $value );
|
||||
|
||||
// string (ACF < 5.6.0)
|
||||
} elseif ( is_string( $value ) ) {
|
||||
|
||||
$link['url'] = $value;
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $link;
|
||||
|
||||
}
|
||||
|
||||
/*<textarea id="<?php echo esc_attr($field['id']); ?>-textarea"><?php
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$div = array(
|
||||
'id' => $field['id'],
|
||||
'class' => $field['class'] . ' acf-link',
|
||||
);
|
||||
|
||||
// render scripts/styles
|
||||
acf_enqueue_uploader();
|
||||
|
||||
// get link
|
||||
$link = $this->get_link( $field['value'] );
|
||||
|
||||
// classes
|
||||
if ( $link['url'] ) {
|
||||
$div['class'] .= ' -value';
|
||||
}
|
||||
|
||||
if ( $link['target'] === '_blank' ) {
|
||||
$div['class'] .= ' -external';
|
||||
}
|
||||
|
||||
/*
|
||||
<textarea id="<?php echo esc_attr($field['id']); ?>-textarea"><?php
|
||||
echo esc_textarea('<a href="'.$link['url'].'" target="'.$link['target'].'">'.$link['title'].'</a>');
|
||||
?></textarea>*/
|
||||
?>
|
||||
<div <?php acf_esc_attr_e($div); ?>>
|
||||
?></textarea>*/
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $div ); ?>>
|
||||
|
||||
<div class="acf-hidden">
|
||||
<a class="link-node" href="<?php echo esc_url($link['url']); ?>" target="<?php echo esc_attr($link['target']); ?>"><?php echo esc_html($link['title']); ?></a>
|
||||
<?php foreach( $link as $k => $v ): ?>
|
||||
<?php acf_hidden_input(array( 'class' => "input-$k", 'name' => $field['name'] . "[$k]", 'value' => $v )); ?>
|
||||
<a class="link-node" href="<?php echo esc_url( $link['url'] ); ?>" target="<?php echo esc_attr( $link['target'] ); ?>"><?php echo esc_html( $link['title'] ); ?></a>
|
||||
<?php foreach ( $link as $k => $v ) : ?>
|
||||
<?php
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'class' => "input-$k",
|
||||
'name' => $field['name'] . "[$k]",
|
||||
'value' => $v,
|
||||
)
|
||||
);
|
||||
?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<a href="#" class="button" data-name="add" target=""><?php _e('Select Link', 'acf'); ?></a>
|
||||
<a href="#" class="button" data-name="add" target=""><?php _e( 'Select Link', 'acf' ); ?></a>
|
||||
|
||||
<div class="link-wrap">
|
||||
<span class="link-title"><?php echo esc_html($link['title']); ?></span>
|
||||
<a class="link-url" href="<?php echo esc_url($link['url']); ?>" target="_blank"><?php echo esc_html($link['url']); ?></a>
|
||||
<i class="acf-icon -link-ext acf-js-tooltip" title="<?php _e('Opens in a new window/tab', 'acf'); ?>"></i><?php
|
||||
?><a class="acf-icon -pencil -clear acf-js-tooltip" data-name="edit" href="#" title="<?php _e('Edit', 'acf'); ?>"></a><?php
|
||||
?><a class="acf-icon -cancel -clear acf-js-tooltip" data-name="remove" href="#" title="<?php _e('Remove', 'acf'); ?>"></a>
|
||||
<span class="link-title"><?php echo esc_html( $link['title'] ); ?></span>
|
||||
<a class="link-url" href="<?php echo esc_url( $link['url'] ); ?>" target="_blank"><?php echo esc_html( $link['url'] ); ?></a>
|
||||
<i class="acf-icon -link-ext acf-js-tooltip" title="<?php _e( 'Opens in a new window/tab', 'acf' ); ?>"></i><a class="acf-icon -pencil -clear acf-js-tooltip" data-name="edit" href="#" title="<?php _e( 'Edit', 'acf' ); ?>"></a><a class="acf-icon -cancel -clear acf-js-tooltip" data-name="remove" href="#" title="<?php _e( 'Remove', 'acf' ); ?>"></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Value','acf'),
|
||||
'instructions' => __('Specify the returned value on front end','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'array' => __("Link Array",'acf'),
|
||||
'url' => __("Link URL",'acf'),
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if( empty($value) ) return $value;
|
||||
|
||||
|
||||
// get link
|
||||
$link = $this->get_link( $value );
|
||||
|
||||
|
||||
// format value
|
||||
if( $field['return_format'] == 'url' ) {
|
||||
|
||||
return $link['url'];
|
||||
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return link
|
||||
return $link;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ){
|
||||
|
||||
// bail early if not required
|
||||
if( !$field['required'] ) return $valid;
|
||||
|
||||
|
||||
// URL is required
|
||||
if( empty($value) || empty($value['url']) ) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $valid;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// Check if value is an empty array and convert to empty string.
|
||||
if( empty($value) || empty($value['url']) ) {
|
||||
$value = "";
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_link' );
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Value', 'acf' ),
|
||||
'instructions' => __( 'Specify the returned value on front end', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'array' => __( 'Link Array', 'acf' ),
|
||||
'url' => __( 'Link URL', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if ( empty( $value ) ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// get link
|
||||
$link = $this->get_link( $value );
|
||||
|
||||
// format value
|
||||
if ( $field['return_format'] == 'url' ) {
|
||||
|
||||
return $link['url'];
|
||||
|
||||
}
|
||||
|
||||
// return link
|
||||
return $link;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ) {
|
||||
|
||||
// bail early if not required
|
||||
if ( ! $field['required'] ) {
|
||||
return $valid;
|
||||
}
|
||||
|
||||
// URL is required
|
||||
if ( empty( $value ) || empty( $value['url'] ) ) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $valid;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// Check if value is an empty array and convert to empty string.
|
||||
if ( empty( $value ) || empty( $value['url'] ) ) {
|
||||
$value = '';
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_link' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,198 +1,200 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_message') ) :
|
||||
if ( ! class_exists( 'acf_field_message' ) ) :
|
||||
|
||||
class acf_field_message extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'message';
|
||||
$this->label = __( 'Message', 'acf' );
|
||||
$this->category = 'layout';
|
||||
$this->defaults = array(
|
||||
'message' => '',
|
||||
'esc_html' => 0,
|
||||
'new_lines' => 'wpautop',
|
||||
);
|
||||
|
||||
class acf_field_message extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'message';
|
||||
$this->label = __("Message",'acf');
|
||||
$this->category = 'layout';
|
||||
$this->defaults = array(
|
||||
'message' => '',
|
||||
'esc_html' => 0,
|
||||
'new_lines' => 'wpautop',
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$m = $field['message'];
|
||||
|
||||
|
||||
// wptexturize (improves "quotes")
|
||||
$m = wptexturize( $m );
|
||||
|
||||
|
||||
// esc_html
|
||||
if( $field['esc_html'] ) {
|
||||
|
||||
$m = esc_html( $m );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// new lines
|
||||
if( $field['new_lines'] == 'wpautop' ) {
|
||||
|
||||
$m = wpautop($m);
|
||||
|
||||
} elseif( $field['new_lines'] == 'br' ) {
|
||||
|
||||
$m = nl2br($m);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$m = $field['message'];
|
||||
|
||||
// wptexturize (improves "quotes")
|
||||
$m = wptexturize( $m );
|
||||
|
||||
// esc_html
|
||||
if ( $field['esc_html'] ) {
|
||||
|
||||
$m = esc_html( $m );
|
||||
|
||||
}
|
||||
|
||||
// new lines
|
||||
if ( $field['new_lines'] == 'wpautop' ) {
|
||||
|
||||
$m = wpautop( $m );
|
||||
|
||||
} elseif ( $field['new_lines'] == 'br' ) {
|
||||
|
||||
$m = nl2br( $m );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
echo acf_esc_html( $m );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
echo acf_esc_html( $m );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Message','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'textarea',
|
||||
'name' => 'message',
|
||||
));
|
||||
|
||||
|
||||
// formatting
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('New Lines','acf'),
|
||||
'instructions' => __('Controls how new lines are rendered','acf'),
|
||||
'type' => 'select',
|
||||
'name' => 'new_lines',
|
||||
'choices' => array(
|
||||
'wpautop' => __("Automatically add paragraphs",'acf'),
|
||||
'br' => __("Automatically add <br>",'acf'),
|
||||
'' => __("No Formatting",'acf')
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// HTML
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Escape HTML','acf'),
|
||||
'instructions' => __('Allow HTML markup to display as visible text instead of rendering','acf'),
|
||||
'name' => 'esc_html',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
* This function will translate field settings
|
||||
*
|
||||
* @type function
|
||||
* @date 8/03/2016
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function translate_field( $field ) {
|
||||
|
||||
// translate
|
||||
$field['message'] = acf_translate( $field['message'] );
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_field()
|
||||
*
|
||||
* This filter is appied to the $field after it is loaded from the database
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $field - the field array holding all the field options
|
||||
*/
|
||||
function load_field( $field ) {
|
||||
|
||||
// remove name to avoid caching issue
|
||||
$field['name'] = '';
|
||||
|
||||
// remove instructions
|
||||
$field['instructions'] = '';
|
||||
|
||||
// remove required to avoid JS issues
|
||||
$field['required'] = 0;
|
||||
|
||||
// set value other than 'null' to avoid ACF loading / caching issue
|
||||
$field['value'] = false;
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_message' );
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Message', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'textarea',
|
||||
'name' => 'message',
|
||||
)
|
||||
);
|
||||
|
||||
// formatting
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'New Lines', 'acf' ),
|
||||
'instructions' => __( 'Controls how new lines are rendered', 'acf' ),
|
||||
'type' => 'select',
|
||||
'name' => 'new_lines',
|
||||
'choices' => array(
|
||||
'wpautop' => __( 'Automatically add paragraphs', 'acf' ),
|
||||
'br' => __( 'Automatically add <br>', 'acf' ),
|
||||
'' => __( 'No Formatting', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// HTML
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Escape HTML', 'acf' ),
|
||||
'instructions' => __( 'Allow HTML markup to display as visible text instead of rendering', 'acf' ),
|
||||
'name' => 'esc_html',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
* This function will translate field settings
|
||||
*
|
||||
* @type function
|
||||
* @date 8/03/2016
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function translate_field( $field ) {
|
||||
|
||||
// translate
|
||||
$field['message'] = acf_translate( $field['message'] );
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_field()
|
||||
*
|
||||
* This filter is appied to the $field after it is loaded from the database
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $field - the field array holding all the field options
|
||||
*/
|
||||
function load_field( $field ) {
|
||||
|
||||
// remove name to avoid caching issue
|
||||
$field['name'] = '';
|
||||
|
||||
// remove instructions
|
||||
$field['instructions'] = '';
|
||||
|
||||
// remove required to avoid JS issues
|
||||
$field['required'] = 0;
|
||||
|
||||
// set value other than 'null' to avoid ACF loading / caching issue
|
||||
$field['value'] = false;
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_message' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,304 +1,307 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_number') ) :
|
||||
if ( ! class_exists( 'acf_field_number' ) ) :
|
||||
|
||||
class acf_field_number extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'number';
|
||||
$this->label = __( 'Number', 'acf' );
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'min' => '',
|
||||
'max' => '',
|
||||
'step' => '',
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
);
|
||||
|
||||
class acf_field_number extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'number';
|
||||
$this->label = __("Number",'acf');
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'min' => '',
|
||||
'max' => '',
|
||||
'step' => '',
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => ''
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$keys = array( 'type', 'id', 'class', 'name', 'value', 'min', 'max', 'step', 'placeholder', 'pattern' );
|
||||
$keys2 = array( 'readonly', 'disabled', 'required' );
|
||||
$html = '';
|
||||
|
||||
|
||||
// step
|
||||
if( !$field['step'] ) {
|
||||
$field['step'] = 'any';
|
||||
}
|
||||
|
||||
|
||||
// prepend
|
||||
if( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$html .= '<div class="acf-input-prepend">' . acf_esc_html($field['prepend']) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append
|
||||
if( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$html .= '<div class="acf-input-append">' . acf_esc_html($field['append']) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// atts (value="123")
|
||||
foreach( $keys as $k ) {
|
||||
if( isset($field[ $k ]) ) $atts[ $k ] = $field[ $k ];
|
||||
}
|
||||
|
||||
|
||||
// atts2 (disabled="disabled")
|
||||
foreach( $keys2 as $k ) {
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
}
|
||||
|
||||
|
||||
// remove empty atts
|
||||
$atts = acf_clean_atts( $atts );
|
||||
|
||||
|
||||
// render
|
||||
$html .= '<div class="acf-input-wrap">' . acf_get_text_input( $atts ) . '</div>';
|
||||
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Default Value','acf'),
|
||||
'instructions' => __('Appears when creating a new post','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
));
|
||||
|
||||
|
||||
// placeholder
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Placeholder Text','acf'),
|
||||
'instructions' => __('Appears within the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'placeholder',
|
||||
));
|
||||
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Prepend','acf'),
|
||||
'instructions' => __('Appears before the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
));
|
||||
|
||||
|
||||
// append
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Append','acf'),
|
||||
'instructions' => __('Appears after the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
));
|
||||
|
||||
|
||||
// min
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Minimum Value','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'min',
|
||||
));
|
||||
|
||||
|
||||
// max
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Maximum Value','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'max',
|
||||
));
|
||||
|
||||
|
||||
// max
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Step Size','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'step',
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ){
|
||||
|
||||
// remove ','
|
||||
if( acf_str_exists(',', $value) ) {
|
||||
|
||||
$value = str_replace(',', '', $value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// if value is not numeric...
|
||||
if( !is_numeric($value) ) {
|
||||
|
||||
// allow blank to be saved
|
||||
if( !empty($value) ) {
|
||||
|
||||
$valid = __('Value must be a number', 'acf');
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$keys = array( 'type', 'id', 'class', 'name', 'value', 'min', 'max', 'step', 'placeholder', 'pattern' );
|
||||
$keys2 = array( 'readonly', 'disabled', 'required' );
|
||||
$html = '';
|
||||
|
||||
// step
|
||||
if ( ! $field['step'] ) {
|
||||
$field['step'] = 'any';
|
||||
}
|
||||
|
||||
|
||||
// return early
|
||||
|
||||
// prepend
|
||||
if ( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$html .= '<div class="acf-input-prepend">' . acf_esc_html( $field['prepend'] ) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
// append
|
||||
if ( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$html .= '<div class="acf-input-append">' . acf_esc_html( $field['append'] ) . '</div>';
|
||||
|
||||
}
|
||||
|
||||
// atts (value="123")
|
||||
foreach ( $keys as $k ) {
|
||||
if ( isset( $field[ $k ] ) ) {
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
}
|
||||
}
|
||||
|
||||
// atts2 (disabled="disabled")
|
||||
foreach ( $keys2 as $k ) {
|
||||
if ( ! empty( $field[ $k ] ) ) {
|
||||
$atts[ $k ] = $k;
|
||||
}
|
||||
}
|
||||
|
||||
// remove empty atts
|
||||
$atts = acf_clean_atts( $atts );
|
||||
|
||||
// render
|
||||
$html .= '<div class="acf-input-wrap">' . acf_get_text_input( $atts ) . '</div>';
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Default Value', 'acf' ),
|
||||
'instructions' => __( 'Appears when creating a new post', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
)
|
||||
);
|
||||
|
||||
// placeholder
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Placeholder Text', 'acf' ),
|
||||
'instructions' => __( 'Appears within the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'placeholder',
|
||||
)
|
||||
);
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Prepend', 'acf' ),
|
||||
'instructions' => __( 'Appears before the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
)
|
||||
);
|
||||
|
||||
// append
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Append', 'acf' ),
|
||||
'instructions' => __( 'Appears after the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
)
|
||||
);
|
||||
|
||||
// min
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Minimum Value', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'min',
|
||||
)
|
||||
);
|
||||
|
||||
// max
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Maximum Value', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'max',
|
||||
)
|
||||
);
|
||||
|
||||
// max
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Step Size', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'step',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* validate_value
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 11/02/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function validate_value( $valid, $value, $field, $input ) {
|
||||
|
||||
// remove ','
|
||||
if ( acf_str_exists( ',', $value ) ) {
|
||||
|
||||
$value = str_replace( ',', '', $value );
|
||||
|
||||
}
|
||||
|
||||
// if value is not numeric...
|
||||
if ( ! is_numeric( $value ) ) {
|
||||
|
||||
// allow blank to be saved
|
||||
if ( ! empty( $value ) ) {
|
||||
|
||||
$valid = __( 'Value must be a number', 'acf' );
|
||||
|
||||
}
|
||||
|
||||
// return early
|
||||
return $valid;
|
||||
|
||||
}
|
||||
|
||||
// convert
|
||||
$value = floatval( $value );
|
||||
|
||||
// min
|
||||
if ( is_numeric( $field['min'] ) && $value < floatval( $field['min'] ) ) {
|
||||
|
||||
$valid = sprintf( __( 'Value must be equal to or higher than %d', 'acf' ), $field['min'] );
|
||||
|
||||
}
|
||||
|
||||
// max
|
||||
if ( is_numeric( $field['max'] ) && $value > floatval( $field['max'] ) ) {
|
||||
|
||||
$valid = sprintf( __( 'Value must be equal to or lower than %d', 'acf' ), $field['max'] );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $valid;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// convert
|
||||
$value = floatval($value);
|
||||
|
||||
|
||||
// min
|
||||
if( is_numeric($field['min']) && $value < floatval($field['min'])) {
|
||||
|
||||
$valid = sprintf(__('Value must be equal to or higher than %d', 'acf'), $field['min'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// max
|
||||
if( is_numeric($field['max']) && $value > floatval($field['max']) ) {
|
||||
|
||||
$valid = sprintf(__('Value must be equal to or lower than %d', 'acf'), $field['max'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $valid;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $field - the field array holding all the field options
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// no formatting needed for empty value
|
||||
if( empty($value) ) {
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $field - the field array holding all the field options
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// no formatting needed for empty value
|
||||
if ( empty( $value ) ) {
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
// remove ','
|
||||
if ( acf_str_exists( ',', $value ) ) {
|
||||
|
||||
$value = str_replace( ',', '', $value );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// remove ','
|
||||
if( acf_str_exists(',', $value) ) {
|
||||
|
||||
$value = str_replace(',', '', $value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_number' );
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_number' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,219 +1,237 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_oembed') ) :
|
||||
if ( ! class_exists( 'acf_field_oembed' ) ) :
|
||||
|
||||
class acf_field_oembed extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'oembed';
|
||||
$this->label = __( 'oEmbed', 'acf' );
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'width' => '',
|
||||
'height' => '',
|
||||
);
|
||||
$this->width = 640;
|
||||
$this->height = 390;
|
||||
|
||||
// extra
|
||||
add_action( 'wp_ajax_acf/fields/oembed/search', array( $this, 'ajax_query' ) );
|
||||
add_action( 'wp_ajax_nopriv_acf/fields/oembed/search', array( $this, 'ajax_query' ) );
|
||||
|
||||
class acf_field_oembed extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'oembed';
|
||||
$this->label = __("oEmbed",'acf');
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'width' => '',
|
||||
'height' => '',
|
||||
);
|
||||
$this->width = 640;
|
||||
$this->height = 390;
|
||||
|
||||
|
||||
// extra
|
||||
add_action('wp_ajax_acf/fields/oembed/search', array($this, 'ajax_query'));
|
||||
add_action('wp_ajax_nopriv_acf/fields/oembed/search', array($this, 'ajax_query'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* prepare_field
|
||||
*
|
||||
* This function will prepare the field for input
|
||||
*
|
||||
* @type function
|
||||
* @date 14/2/17
|
||||
* @since 5.5.8
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return (int)
|
||||
*/
|
||||
|
||||
function prepare_field( $field ) {
|
||||
|
||||
// defaults
|
||||
if( !$field['width'] ) $field['width'] = $this->width;
|
||||
if( !$field['height'] ) $field['height'] = $this->height;
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* wp_oembed_get
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 24/01/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function wp_oembed_get( $url = '', $width = 0, $height = 0 ) {
|
||||
|
||||
// vars
|
||||
$embed = '';
|
||||
$res = array(
|
||||
'width' => $width,
|
||||
'height' => $height
|
||||
);
|
||||
|
||||
|
||||
// get emebed
|
||||
$embed = @wp_oembed_get( $url, $res );
|
||||
|
||||
|
||||
// try shortcode
|
||||
if( !$embed ) {
|
||||
|
||||
// global
|
||||
global $wp_embed;
|
||||
|
||||
|
||||
// get emebed
|
||||
$embed = $wp_embed->shortcode($res, $url);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $embed;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* prepare_field
|
||||
*
|
||||
* This function will prepare the field for input
|
||||
*
|
||||
* @type function
|
||||
* @date 14/2/17
|
||||
* @since 5.5.8
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return (int)
|
||||
*/
|
||||
|
||||
function prepare_field( $field ) {
|
||||
|
||||
// defaults
|
||||
if ( ! $field['width'] ) {
|
||||
$field['width'] = $this->width;
|
||||
}
|
||||
if ( ! $field['height'] ) {
|
||||
$field['height'] = $this->height;
|
||||
}
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* wp_oembed_get
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 24/01/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function wp_oembed_get( $url = '', $width = 0, $height = 0 ) {
|
||||
|
||||
// vars
|
||||
$embed = '';
|
||||
$res = array(
|
||||
'width' => $width,
|
||||
'height' => $height,
|
||||
);
|
||||
|
||||
// get emebed
|
||||
$embed = @wp_oembed_get( $url, $res );
|
||||
|
||||
// try shortcode
|
||||
if ( ! $embed ) {
|
||||
|
||||
// global
|
||||
global $wp_embed;
|
||||
|
||||
// get emebed
|
||||
$embed = $wp_embed->shortcode( $res, $url );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $embed;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ajax_query
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function ajax_query() {
|
||||
|
||||
// validate
|
||||
if ( ! acf_verify_ajax() ) {
|
||||
die();
|
||||
}
|
||||
|
||||
// get choices
|
||||
$response = $this->get_ajax_query( $_POST );
|
||||
|
||||
// return
|
||||
wp_send_json( $response );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_ajax_query
|
||||
*
|
||||
* This function will return an array of data formatted for use in a select2 AJAX response
|
||||
*
|
||||
* @type function
|
||||
* @date 15/10/2014
|
||||
* @since 5.0.9
|
||||
*
|
||||
* @param $options (array)
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
function get_ajax_query( $args = array() ) {
|
||||
|
||||
// defaults
|
||||
$args = acf_parse_args(
|
||||
$args,
|
||||
array(
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
)
|
||||
);
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $args['field_key'] );
|
||||
if ( ! $field ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// prepare field to correct width and height
|
||||
$field = $this->prepare_field( $field );
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'url' => $args['s'],
|
||||
'html' => $this->wp_oembed_get( $args['s'], $field['width'], $field['height'] ),
|
||||
);
|
||||
|
||||
// return
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// atts
|
||||
$atts = array(
|
||||
'class' => 'acf-oembed',
|
||||
);
|
||||
|
||||
// <strong><?php _e("Error.", 'acf'); </strong> _e("No embed found for the given URL.", 'acf');
|
||||
|
||||
// value
|
||||
if ( $field['value'] ) {
|
||||
$atts['class'] .= ' has-value';
|
||||
}
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e( $atts ); ?>>
|
||||
|
||||
|
||||
/*
|
||||
* ajax_query
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function ajax_query() {
|
||||
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) die();
|
||||
|
||||
|
||||
// get choices
|
||||
$response = $this->get_ajax_query( $_POST );
|
||||
|
||||
|
||||
// return
|
||||
wp_send_json($response);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_ajax_query
|
||||
*
|
||||
* This function will return an array of data formatted for use in a select2 AJAX response
|
||||
*
|
||||
* @type function
|
||||
* @date 15/10/2014
|
||||
* @since 5.0.9
|
||||
*
|
||||
* @param $options (array)
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
function get_ajax_query( $args = array() ) {
|
||||
|
||||
// defaults
|
||||
$args = acf_parse_args($args, array(
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
));
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $args['field_key'] );
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// prepare field to correct width and height
|
||||
$field = $this->prepare_field($field);
|
||||
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'url' => $args['s'],
|
||||
'html' => $this->wp_oembed_get($args['s'], $field['width'], $field['height'])
|
||||
);
|
||||
|
||||
|
||||
// return
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// atts
|
||||
$atts = array(
|
||||
'class' => 'acf-oembed',
|
||||
);
|
||||
|
||||
// <strong><?php _e("Error.", 'acf'); </strong> _e("No embed found for the given URL.", 'acf');
|
||||
|
||||
// value
|
||||
if( $field['value'] ) $atts['class'] .= ' has-value';
|
||||
|
||||
?>
|
||||
<div <?php acf_esc_attr_e($atts) ?>>
|
||||
|
||||
<?php acf_hidden_input(array( 'class' => 'input-value', 'name' => $field['name'], 'value' => $field['value'] )); ?>
|
||||
<?php
|
||||
acf_hidden_input(
|
||||
array(
|
||||
'class' => 'input-value',
|
||||
'name' => $field['name'],
|
||||
'value' => $field['value'],
|
||||
)
|
||||
);
|
||||
?>
|
||||
|
||||
<div class="title">
|
||||
<?php acf_text_input(array( 'class' => 'input-search', 'value' => $field['value'], 'placeholder' => __("Enter URL", 'acf'), 'autocomplete' => 'off' )); ?>
|
||||
<?php
|
||||
acf_text_input(
|
||||
array(
|
||||
'class' => 'input-search',
|
||||
'value' => $field['value'],
|
||||
'placeholder' => __( 'Enter URL', 'acf' ),
|
||||
'autocomplete' => 'off',
|
||||
)
|
||||
);
|
||||
?>
|
||||
<div class="acf-actions -hover">
|
||||
<a data-name="clear-button" href="#" class="acf-icon -cancel grey"></a>
|
||||
</div>
|
||||
|
|
@ -221,100 +239,106 @@ class acf_field_oembed extends acf_field {
|
|||
|
||||
<div class="canvas">
|
||||
<div class="canvas-media">
|
||||
<?php if( $field['value'] ) {
|
||||
echo $this->wp_oembed_get($field['value'], $field['width'], $field['height']);
|
||||
} ?>
|
||||
<?php
|
||||
if ( $field['value'] ) {
|
||||
echo $this->wp_oembed_get( $field['value'], $field['width'], $field['height'] );
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<i class="acf-icon -picture hide-if-value"></i>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// width
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Embed Size','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'width',
|
||||
'prepend' => __('Width', 'acf'),
|
||||
'append' => 'px',
|
||||
'placeholder' => $this->width
|
||||
));
|
||||
|
||||
|
||||
// height
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Embed Size','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'height',
|
||||
'prepend' => __('Height', 'acf'),
|
||||
'append' => 'px',
|
||||
'placeholder' => $this->height,
|
||||
'_append' => 'width'
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if( empty($value) ) return $value;
|
||||
|
||||
|
||||
// prepare field to correct width and height
|
||||
$field = $this->prepare_field($field);
|
||||
|
||||
|
||||
// get oembed
|
||||
$value = $this->wp_oembed_get($value, $field['width'], $field['height']);
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_oembed' );
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// width
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Embed Size', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'width',
|
||||
'prepend' => __( 'Width', 'acf' ),
|
||||
'append' => 'px',
|
||||
'placeholder' => $this->width,
|
||||
)
|
||||
);
|
||||
|
||||
// height
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Embed Size', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'height',
|
||||
'prepend' => __( 'Height', 'acf' ),
|
||||
'append' => 'px',
|
||||
'placeholder' => $this->height,
|
||||
'_append' => 'width',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value
|
||||
if ( empty( $value ) ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// prepare field to correct width and height
|
||||
$field = $this->prepare_field( $field );
|
||||
|
||||
// get oembed
|
||||
$value = $this->wp_oembed_get( $value, $field['width'], $field['height'] );
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_oembed' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,77 +1,78 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_output') ) :
|
||||
if ( ! class_exists( 'acf_field_output' ) ) :
|
||||
|
||||
class acf_field_output extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'output';
|
||||
$this->label = 'output';
|
||||
$this->public = false;
|
||||
$this->defaults = array(
|
||||
'html' => false,
|
||||
);
|
||||
|
||||
class acf_field_output extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'output';
|
||||
$this->label = 'output';
|
||||
$this->public = false;
|
||||
$this->defaults = array(
|
||||
'html' => false
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field (array) the $field being rendered
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field (array) the $field being edited
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// bail early if no html
|
||||
if( !$field['html'] ) return;
|
||||
|
||||
|
||||
// html
|
||||
if( is_string($field['html']) && !function_exists($field['html']) ) {
|
||||
|
||||
echo $field['html'];
|
||||
|
||||
// function
|
||||
} else {
|
||||
|
||||
call_user_func_array($field['html'], array($field));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field (array) the $field being rendered
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field (array) the $field being edited
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// bail early if no html
|
||||
if ( ! $field['html'] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// html
|
||||
if ( is_string( $field['html'] ) && ! function_exists( $field['html'] ) ) {
|
||||
|
||||
echo $field['html'];
|
||||
|
||||
// function
|
||||
} else {
|
||||
|
||||
call_user_func_array( $field['html'], array( $field ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_output' );
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_output' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,104 +1,111 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_password') ) :
|
||||
if ( ! class_exists( 'acf_field_password' ) ) :
|
||||
|
||||
class acf_field_password extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'password';
|
||||
$this->label = __("Password",'acf');
|
||||
$this->defaults = array(
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
acf_get_field_type('text')->render_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// placeholder
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Placeholder Text','acf'),
|
||||
'instructions' => __('Appears within the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'placeholder',
|
||||
));
|
||||
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Prepend','acf'),
|
||||
'instructions' => __('Appears before the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
));
|
||||
|
||||
|
||||
// append
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Append','acf'),
|
||||
'instructions' => __('Appears after the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
class acf_field_password extends acf_field {
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_password' );
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'password';
|
||||
$this->label = __( 'Password', 'acf' );
|
||||
$this->defaults = array(
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
acf_get_field_type( 'text' )->render_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// placeholder
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Placeholder Text', 'acf' ),
|
||||
'instructions' => __( 'Appears within the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'placeholder',
|
||||
)
|
||||
);
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Prepend', 'acf' ),
|
||||
'instructions' => __( 'Appears before the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
)
|
||||
);
|
||||
|
||||
// append
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Append', 'acf' ),
|
||||
'instructions' => __( 'Appears after the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_password' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,448 +1,454 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_radio') ) :
|
||||
if ( ! class_exists( 'acf_field_radio' ) ) :
|
||||
|
||||
class acf_field_radio extends acf_field {
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'radio';
|
||||
$this->label = __("Radio Button",'acf');
|
||||
$this->category = 'choice';
|
||||
$this->defaults = array(
|
||||
'layout' => 'vertical',
|
||||
'choices' => array(),
|
||||
'default_value' => '',
|
||||
'other_choice' => 0,
|
||||
'save_other_choice' => 0,
|
||||
'allow_null' => 0,
|
||||
'return_format' => 'value'
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field (array) the $field being rendered
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field (array) the $field being edited
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
class acf_field_radio extends acf_field {
|
||||
|
||||
// vars
|
||||
$e = '';
|
||||
$ul = array(
|
||||
'class' => 'acf-radio-list',
|
||||
'data-allow_null' => $field['allow_null'],
|
||||
'data-other_choice' => $field['other_choice']
|
||||
);
|
||||
|
||||
|
||||
// append to class
|
||||
$ul['class'] .= ' ' . ($field['layout'] == 'horizontal' ? 'acf-hl' : 'acf-bl');
|
||||
$ul['class'] .= ' ' . $field['class'];
|
||||
|
||||
|
||||
// Determine selected value.
|
||||
$value = (string) $field['value'];
|
||||
|
||||
// 1. Selected choice.
|
||||
if( isset( $field['choices'][ $value ] ) ) {
|
||||
$checked = (string) $value;
|
||||
|
||||
// 2. Custom choice.
|
||||
} elseif( $field['other_choice'] && $value !== '' ) {
|
||||
$checked = 'other';
|
||||
|
||||
// 3. Empty choice.
|
||||
} elseif( $field['allow_null'] ) {
|
||||
$checked = '';
|
||||
|
||||
// 4. Default to first choice.
|
||||
} else {
|
||||
$checked = (string) key( $field['choices'] );
|
||||
}
|
||||
|
||||
// other choice
|
||||
$other_input = false;
|
||||
if( $field['other_choice'] ) {
|
||||
|
||||
// Define other input attrs.
|
||||
$other_input = array(
|
||||
'type' => 'text',
|
||||
'name' => $field['name'],
|
||||
'value' => '',
|
||||
'disabled' => 'disabled',
|
||||
'class' => 'acf-disabled'
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'radio';
|
||||
$this->label = __( 'Radio Button', 'acf' );
|
||||
$this->category = 'choice';
|
||||
$this->defaults = array(
|
||||
'layout' => 'vertical',
|
||||
'choices' => array(),
|
||||
'default_value' => '',
|
||||
'other_choice' => 0,
|
||||
'save_other_choice' => 0,
|
||||
'allow_null' => 0,
|
||||
'return_format' => 'value',
|
||||
);
|
||||
|
||||
// Select other choice if value is not a valid choice.
|
||||
if( $checked === 'other' ) {
|
||||
unset( $other_input['disabled'] );
|
||||
$other_input['value'] = $field['value'];
|
||||
}
|
||||
|
||||
// Ensure an 'other' choice is defined.
|
||||
if( !isset( $field['choices']['other'] ) ) {
|
||||
$field['choices']['other'] = '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Bail early if no choices.
|
||||
if( empty( $field['choices'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Hiden input.
|
||||
$e .= acf_get_hidden_input( array('name' => $field['name']) );
|
||||
|
||||
// Open <ul>.
|
||||
$e .= '<ul ' . acf_esc_attr($ul) . '>';
|
||||
|
||||
// Loop through choices.
|
||||
foreach( $field['choices'] as $value => $label ) {
|
||||
$is_selected = false;
|
||||
|
||||
// Ensure value is a string.
|
||||
$value = (string) $value;
|
||||
|
||||
// Define input attrs.
|
||||
$attrs = array(
|
||||
'type' => 'radio',
|
||||
'id' => sanitize_title( $field['id'] . '-' . $value ),
|
||||
'name' => $field['name'],
|
||||
'value' => $value
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field (array) the $field being rendered
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field (array) the $field being edited
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$e = '';
|
||||
$ul = array(
|
||||
'class' => 'acf-radio-list',
|
||||
'data-allow_null' => $field['allow_null'],
|
||||
'data-other_choice' => $field['other_choice'],
|
||||
);
|
||||
|
||||
// Check if selected.
|
||||
if( esc_attr($value) === esc_attr($checked) ) {
|
||||
$attrs['checked'] = 'checked';
|
||||
$is_selected = true;
|
||||
|
||||
// append to class
|
||||
$ul['class'] .= ' ' . ( $field['layout'] == 'horizontal' ? 'acf-hl' : 'acf-bl' );
|
||||
$ul['class'] .= ' ' . $field['class'];
|
||||
|
||||
// Determine selected value.
|
||||
$value = (string) $field['value'];
|
||||
|
||||
// 1. Selected choice.
|
||||
if ( isset( $field['choices'][ $value ] ) ) {
|
||||
$checked = (string) $value;
|
||||
|
||||
// 2. Custom choice.
|
||||
} elseif ( $field['other_choice'] && $value !== '' ) {
|
||||
$checked = 'other';
|
||||
|
||||
// 3. Empty choice.
|
||||
} elseif ( $field['allow_null'] ) {
|
||||
$checked = '';
|
||||
|
||||
// 4. Default to first choice.
|
||||
} else {
|
||||
$checked = (string) key( $field['choices'] );
|
||||
}
|
||||
|
||||
// Check if is disabled.
|
||||
if( isset($field['disabled']) && acf_in_array($value, $field['disabled']) ) {
|
||||
$attrs['disabled'] = 'disabled';
|
||||
|
||||
// other choice
|
||||
$other_input = false;
|
||||
if ( $field['other_choice'] ) {
|
||||
|
||||
// Define other input attrs.
|
||||
$other_input = array(
|
||||
'type' => 'text',
|
||||
'name' => $field['name'],
|
||||
'value' => '',
|
||||
'disabled' => 'disabled',
|
||||
'class' => 'acf-disabled',
|
||||
);
|
||||
|
||||
// Select other choice if value is not a valid choice.
|
||||
if ( $checked === 'other' ) {
|
||||
unset( $other_input['disabled'] );
|
||||
$other_input['value'] = $field['value'];
|
||||
}
|
||||
|
||||
// Ensure an 'other' choice is defined.
|
||||
if ( ! isset( $field['choices']['other'] ) ) {
|
||||
$field['choices']['other'] = '';
|
||||
}
|
||||
}
|
||||
|
||||
// Additional HTML (the "Other" input).
|
||||
$additional_html = '';
|
||||
if( $value === 'other' && $other_input ) {
|
||||
$additional_html = ' ' . acf_get_text_input( $other_input );
|
||||
|
||||
// Bail early if no choices.
|
||||
if ( empty( $field['choices'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// append
|
||||
$e .= '<li><label' . ( $is_selected ? ' class="selected"' : '' ) . '><input ' . acf_esc_attr( $attrs ) . '/>' . acf_esc_html( $label ) . '</label>' . $additional_html . '</li>';
|
||||
|
||||
// Hiden input.
|
||||
$e .= acf_get_hidden_input( array( 'name' => $field['name'] ) );
|
||||
|
||||
// Open <ul>.
|
||||
$e .= '<ul ' . acf_esc_attr( $ul ) . '>';
|
||||
|
||||
// Loop through choices.
|
||||
foreach ( $field['choices'] as $value => $label ) {
|
||||
$is_selected = false;
|
||||
|
||||
// Ensure value is a string.
|
||||
$value = (string) $value;
|
||||
|
||||
// Define input attrs.
|
||||
$attrs = array(
|
||||
'type' => 'radio',
|
||||
'id' => sanitize_title( $field['id'] . '-' . $value ),
|
||||
'name' => $field['name'],
|
||||
'value' => $value,
|
||||
);
|
||||
|
||||
// Check if selected.
|
||||
if ( esc_attr( $value ) === esc_attr( $checked ) ) {
|
||||
$attrs['checked'] = 'checked';
|
||||
$is_selected = true;
|
||||
}
|
||||
|
||||
// Check if is disabled.
|
||||
if ( isset( $field['disabled'] ) && acf_in_array( $value, $field['disabled'] ) ) {
|
||||
$attrs['disabled'] = 'disabled';
|
||||
}
|
||||
|
||||
// Additional HTML (the "Other" input).
|
||||
$additional_html = '';
|
||||
if ( $value === 'other' && $other_input ) {
|
||||
$additional_html = ' ' . acf_get_text_input( $other_input );
|
||||
}
|
||||
|
||||
// append
|
||||
$e .= '<li><label' . ( $is_selected ? ' class="selected"' : '' ) . '><input ' . acf_esc_attr( $attrs ) . '/>' . acf_esc_html( $label ) . '</label>' . $additional_html . '</li>';
|
||||
}
|
||||
|
||||
// Close <ul>.
|
||||
$e .= '</ul>';
|
||||
|
||||
// Output HTML.
|
||||
echo $e;
|
||||
}
|
||||
|
||||
// Close <ul>.
|
||||
$e .= '</ul>';
|
||||
|
||||
// Output HTML.
|
||||
echo $e;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// encode choices (convert from array)
|
||||
$field['choices'] = acf_encode_choices($field['choices']);
|
||||
|
||||
|
||||
// choices
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Choices','acf'),
|
||||
'instructions' => __('Enter each choice on a new line.','acf') . '<br /><br />' . __('For more control, you may specify both a value and label like this:','acf'). '<br /><br />' . __('red : Red','acf'),
|
||||
'type' => 'textarea',
|
||||
'name' => 'choices',
|
||||
));
|
||||
|
||||
|
||||
// allow_null
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Allow Null?','acf'),
|
||||
'instructions' => '',
|
||||
'name' => 'allow_null',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
));
|
||||
|
||||
|
||||
// other_choice
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Other','acf'),
|
||||
'instructions' => '',
|
||||
'name' => 'other_choice',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
'message' => __("Add 'other' choice to allow for custom values", 'acf'),
|
||||
));
|
||||
|
||||
|
||||
// save_other_choice
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Save Other','acf'),
|
||||
'instructions' => '',
|
||||
'name' => 'save_other_choice',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
'message' => __("Save 'other' values to the field's choices", 'acf'),
|
||||
'conditions' => array(
|
||||
'field' => 'other_choice',
|
||||
'operator' => '==',
|
||||
'value' => 1
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Default Value','acf'),
|
||||
'instructions' => __('Appears when creating a new post','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
));
|
||||
|
||||
|
||||
// layout
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Layout','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'layout',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'vertical' => __("Vertical",'acf'),
|
||||
'horizontal' => __("Horizontal",'acf')
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Value','acf'),
|
||||
'instructions' => __('Specify the returned value on front end','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'value' => __('Value','acf'),
|
||||
'label' => __('Label','acf'),
|
||||
'array' => __('Both (Array)','acf')
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_field()
|
||||
*
|
||||
* This filter is appied to the $field before it is saved to the database
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - the field array holding all the field options
|
||||
* @param $post_id - the field group ID (post_type = acf)
|
||||
*
|
||||
* @return $field - the modified field
|
||||
*/
|
||||
|
||||
function update_field( $field ) {
|
||||
|
||||
// decode choices (convert to array)
|
||||
$field['choices'] = acf_decode_choices($field['choices']);
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
* @todo Fix bug where $field was found via json and has no ID
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value (allow 0 to be saved)
|
||||
if( !$value && !is_numeric($value) ) return $value;
|
||||
|
||||
|
||||
// save_other_choice
|
||||
if( $field['save_other_choice'] ) {
|
||||
|
||||
// value isn't in choices yet
|
||||
if( !isset($field['choices'][ $value ]) ) {
|
||||
|
||||
// get raw $field (may have been changed via repeater field)
|
||||
// if field is local, it won't have an ID
|
||||
$selector = $field['ID'] ? $field['ID'] : $field['key'];
|
||||
$field = acf_get_field( $selector, true );
|
||||
|
||||
|
||||
// bail early if no ID (JSON only)
|
||||
if( !$field['ID'] ) return $value;
|
||||
|
||||
|
||||
// unslash (fixes serialize single quote issue)
|
||||
$value = wp_unslash($value);
|
||||
|
||||
|
||||
// sanitize (remove tags)
|
||||
$value = sanitize_text_field($value);
|
||||
|
||||
|
||||
// update $field
|
||||
$field['choices'][ $value ] = $value;
|
||||
|
||||
|
||||
// save
|
||||
acf_update_field( $field );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 5.2.9
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value found in the database
|
||||
* @param $post_id - the $post_id from which the value was loaded from
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the value to be saved in te database
|
||||
*/
|
||||
|
||||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
// must be single value
|
||||
if( is_array($value) ) {
|
||||
|
||||
$value = array_pop($value);
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// encode choices (convert from array)
|
||||
$field['choices'] = acf_encode_choices( $field['choices'] );
|
||||
|
||||
// choices
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Choices', 'acf' ),
|
||||
'instructions' => __( 'Enter each choice on a new line.', 'acf' ) . '<br /><br />' . __( 'For more control, you may specify both a value and label like this:', 'acf' ) . '<br /><br />' . __( 'red : Red', 'acf' ),
|
||||
'type' => 'textarea',
|
||||
'name' => 'choices',
|
||||
)
|
||||
);
|
||||
|
||||
// allow_null
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Allow Null?', 'acf' ),
|
||||
'instructions' => '',
|
||||
'name' => 'allow_null',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
)
|
||||
);
|
||||
|
||||
// other_choice
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Other', 'acf' ),
|
||||
'instructions' => '',
|
||||
'name' => 'other_choice',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
'message' => __( "Add 'other' choice to allow for custom values", 'acf' ),
|
||||
)
|
||||
);
|
||||
|
||||
// save_other_choice
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Save Other', 'acf' ),
|
||||
'instructions' => '',
|
||||
'name' => 'save_other_choice',
|
||||
'type' => 'true_false',
|
||||
'ui' => 1,
|
||||
'message' => __( "Save 'other' values to the field's choices", 'acf' ),
|
||||
'conditions' => array(
|
||||
'field' => 'other_choice',
|
||||
'operator' => '==',
|
||||
'value' => 1,
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Default Value', 'acf' ),
|
||||
'instructions' => __( 'Appears when creating a new post', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'default_value',
|
||||
)
|
||||
);
|
||||
|
||||
// layout
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Layout', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'layout',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'vertical' => __( 'Vertical', 'acf' ),
|
||||
'horizontal' => __( 'Horizontal', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Return Value', 'acf' ),
|
||||
'instructions' => __( 'Specify the returned value on front end', 'acf' ),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'value' => __( 'Value', 'acf' ),
|
||||
'label' => __( 'Label', 'acf' ),
|
||||
'array' => __( 'Both (Array)', 'acf' ),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
* This function will translate field settings
|
||||
*
|
||||
* @type function
|
||||
* @date 8/03/2016
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function translate_field( $field ) {
|
||||
|
||||
return acf_get_field_type('select')->translate_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type('select')->format_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_radio' );
|
||||
/*
|
||||
* update_field()
|
||||
*
|
||||
* This filter is appied to the $field before it is saved to the database
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - the field array holding all the field options
|
||||
* @param $post_id - the field group ID (post_type = acf)
|
||||
*
|
||||
* @return $field - the modified field
|
||||
*/
|
||||
|
||||
function update_field( $field ) {
|
||||
|
||||
// decode choices (convert to array)
|
||||
$field['choices'] = acf_decode_choices( $field['choices'] );
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* update_value()
|
||||
*
|
||||
* This filter is appied to the $value before it is updated in the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
* @todo Fix bug where $field was found via json and has no ID
|
||||
*
|
||||
* @param $value - the value which will be saved in the database
|
||||
* @param $post_id - the $post_id of which the value will be saved
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the modified value
|
||||
*/
|
||||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// bail early if no value (allow 0 to be saved)
|
||||
if ( ! $value && ! is_numeric( $value ) ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// save_other_choice
|
||||
if ( $field['save_other_choice'] ) {
|
||||
|
||||
// value isn't in choices yet
|
||||
if ( ! isset( $field['choices'][ $value ] ) ) {
|
||||
|
||||
// get raw $field (may have been changed via repeater field)
|
||||
// if field is local, it won't have an ID
|
||||
$selector = $field['ID'] ? $field['ID'] : $field['key'];
|
||||
$field = acf_get_field( $selector, true );
|
||||
|
||||
// bail early if no ID (JSON only)
|
||||
if ( ! $field['ID'] ) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
// unslash (fixes serialize single quote issue)
|
||||
$value = wp_unslash( $value );
|
||||
|
||||
// sanitize (remove tags)
|
||||
$value = sanitize_text_field( $value );
|
||||
|
||||
// update $field
|
||||
$field['choices'][ $value ] = $value;
|
||||
|
||||
// save
|
||||
acf_update_field( $field );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db
|
||||
*
|
||||
* @type filter
|
||||
* @since 5.2.9
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value - the value found in the database
|
||||
* @param $post_id - the $post_id from which the value was loaded from
|
||||
* @param $field - the field array holding all the field options
|
||||
*
|
||||
* @return $value - the value to be saved in te database
|
||||
*/
|
||||
|
||||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
// must be single value
|
||||
if ( is_array( $value ) ) {
|
||||
|
||||
$value = array_pop( $value );
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
* This function will translate field settings
|
||||
*
|
||||
* @type function
|
||||
* @date 8/03/2016
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function translate_field( $field ) {
|
||||
|
||||
return acf_get_field_type( 'select' )->translate_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
* This filter is appied to the $value after it is loaded from the db and before it is returned to the template
|
||||
*
|
||||
* @type filter
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $value (mixed) the value which was loaded from the database
|
||||
* @param $post_id (mixed) the $post_id from which the value was loaded
|
||||
* @param $field (array) the field array holding all the field options
|
||||
*
|
||||
* @return $value (mixed) the modified value
|
||||
*/
|
||||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
return acf_get_field_type( 'select' )->format_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_radio' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,220 +1,239 @@
|
|||
<?php
|
||||
|
||||
if( ! class_exists('acf_field_range') ) :
|
||||
if ( ! class_exists( 'acf_field_range' ) ) :
|
||||
|
||||
class acf_field_range extends acf_field_number {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'range';
|
||||
$this->label = __( 'Range', 'acf' );
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'min' => '',
|
||||
'max' => '',
|
||||
'step' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
);
|
||||
|
||||
class acf_field_range extends acf_field_number {
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will setup the field type data
|
||||
*
|
||||
* @type function
|
||||
* @date 5/03/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$this->name = 'range';
|
||||
$this->label = __("Range",'acf');
|
||||
$this->defaults = array(
|
||||
'default_value' => '',
|
||||
'min' => '',
|
||||
'max' => '',
|
||||
'step' => '',
|
||||
'prepend' => '',
|
||||
'append' => ''
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$keys = array( 'type', 'id', 'class', 'name', 'value', 'min', 'max', 'step' );
|
||||
$keys2 = array( 'readonly', 'disabled', 'required' );
|
||||
$html = '';
|
||||
|
||||
// step
|
||||
if( !$field['step'] ) {
|
||||
$field['step'] = 1;
|
||||
}
|
||||
|
||||
// min / max
|
||||
if( !$field['min'] ) {
|
||||
$field['min'] = 0;
|
||||
}
|
||||
if( !$field['max'] ) {
|
||||
$field['max'] = 100;
|
||||
}
|
||||
|
||||
// allow for prev 'non numeric' value
|
||||
if( !is_numeric($field['value']) ) {
|
||||
$field['value'] = 0;
|
||||
}
|
||||
|
||||
// constrain within max and min
|
||||
$field['value'] = max($field['value'], $field['min']);
|
||||
$field['value'] = min($field['value'], $field['max']);
|
||||
|
||||
// atts (value="123")
|
||||
foreach( $keys as $k ) {
|
||||
if( isset($field[ $k ]) ) $atts[ $k ] = $field[ $k ];
|
||||
}
|
||||
|
||||
// atts2 (disabled="disabled")
|
||||
foreach( $keys2 as $k ) {
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
}
|
||||
|
||||
// remove empty atts
|
||||
$atts = acf_clean_atts( $atts );
|
||||
|
||||
// open
|
||||
$html .= '<div class="acf-range-wrap">';
|
||||
|
||||
// prepend
|
||||
if( $field['prepend'] !== '' ) {
|
||||
$html .= '<div class="acf-prepend">' . acf_esc_html($field['prepend']) . '</div>';
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
* Create the HTML interface for your field
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*/
|
||||
|
||||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$keys = array( 'type', 'id', 'class', 'name', 'value', 'min', 'max', 'step' );
|
||||
$keys2 = array( 'readonly', 'disabled', 'required' );
|
||||
$html = '';
|
||||
|
||||
// step
|
||||
if ( ! $field['step'] ) {
|
||||
$field['step'] = 1;
|
||||
}
|
||||
|
||||
|
||||
// min / max
|
||||
if ( ! $field['min'] ) {
|
||||
$field['min'] = 0;
|
||||
}
|
||||
if ( ! $field['max'] ) {
|
||||
$field['max'] = 100;
|
||||
}
|
||||
|
||||
// allow for prev 'non numeric' value
|
||||
if ( ! is_numeric( $field['value'] ) ) {
|
||||
$field['value'] = 0;
|
||||
}
|
||||
|
||||
// constrain within max and min
|
||||
$field['value'] = max( $field['value'], $field['min'] );
|
||||
$field['value'] = min( $field['value'], $field['max'] );
|
||||
|
||||
// atts (value="123")
|
||||
foreach ( $keys as $k ) {
|
||||
if ( isset( $field[ $k ] ) ) {
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
}
|
||||
}
|
||||
|
||||
// atts2 (disabled="disabled")
|
||||
foreach ( $keys2 as $k ) {
|
||||
if ( ! empty( $field[ $k ] ) ) {
|
||||
$atts[ $k ] = $k;
|
||||
}
|
||||
}
|
||||
|
||||
// remove empty atts
|
||||
$atts = acf_clean_atts( $atts );
|
||||
|
||||
// open
|
||||
$html .= '<div class="acf-range-wrap">';
|
||||
|
||||
// prepend
|
||||
if ( $field['prepend'] !== '' ) {
|
||||
$html .= '<div class="acf-prepend">' . acf_esc_html( $field['prepend'] ) . '</div>';
|
||||
}
|
||||
|
||||
// range
|
||||
$html .= acf_get_text_input( $atts );
|
||||
|
||||
// Calculate input width based on the largest possible input character length.
|
||||
// Also take into account the step size for decimal steps minus - 1.5 chars for leading "0.".
|
||||
$len = max(
|
||||
strlen( strval($field['min']) ),
|
||||
strlen( strval($field['max']) )
|
||||
strlen( strval( $field['min'] ) ),
|
||||
strlen( strval( $field['max'] ) )
|
||||
);
|
||||
if( floatval($atts['step']) < 1 ) {
|
||||
$len += strlen( strval($field['step']) ) - 1.5;
|
||||
if ( floatval( $atts['step'] ) < 1 ) {
|
||||
$len += strlen( strval( $field['step'] ) ) - 1.5;
|
||||
}
|
||||
|
||||
// input
|
||||
$html .= acf_get_text_input(array(
|
||||
'type' => 'number',
|
||||
'id' => $atts['id'] . '-alt',
|
||||
'value' => $atts['value'],
|
||||
'step' => $atts['step'],
|
||||
//'min' => $atts['min'], // removed to avoid browser validation errors
|
||||
//'max' => $atts['max'],
|
||||
'style' => 'width: ' . (1.8 + $len*0.7) . 'em;'
|
||||
));
|
||||
|
||||
|
||||
// input
|
||||
$html .= acf_get_text_input(
|
||||
array(
|
||||
'type' => 'number',
|
||||
'id' => $atts['id'] . '-alt',
|
||||
'value' => $atts['value'],
|
||||
'step' => $atts['step'],
|
||||
// 'min' => $atts['min'], // removed to avoid browser validation errors
|
||||
// 'max' => $atts['max'],
|
||||
'style' => 'width: ' . ( 1.8 + $len * 0.7 ) . 'em;',
|
||||
)
|
||||
);
|
||||
|
||||
// append
|
||||
if ( $field['append'] !== '' ) {
|
||||
$html .= '<div class="acf-append">' . acf_esc_html( $field['append'] ) . '</div>';
|
||||
}
|
||||
|
||||
// close
|
||||
$html .= '</div>';
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Default Value', 'acf' ),
|
||||
'instructions' => __( 'Appears when creating a new post', 'acf' ),
|
||||
'type' => 'number',
|
||||
'name' => 'default_value',
|
||||
)
|
||||
);
|
||||
|
||||
// min
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Minimum Value', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'min',
|
||||
'placeholder' => '0',
|
||||
)
|
||||
);
|
||||
|
||||
// max
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Maximum Value', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'max',
|
||||
'placeholder' => '100',
|
||||
)
|
||||
);
|
||||
|
||||
// step
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Step Size', 'acf' ),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'step',
|
||||
'placeholder' => '1',
|
||||
)
|
||||
);
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Prepend', 'acf' ),
|
||||
'instructions' => __( 'Appears before the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
)
|
||||
);
|
||||
|
||||
// append
|
||||
if( $field['append'] !== '' ) {
|
||||
$html .= '<div class="acf-append">' . acf_esc_html($field['append']) . '</div>';
|
||||
}
|
||||
|
||||
// close
|
||||
$html .= '</div>';
|
||||
|
||||
// return
|
||||
echo $html;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field_settings()
|
||||
*
|
||||
* Create extra options for your field. This is rendered when editing a field.
|
||||
* The value of $field['name'] can be used (like bellow) to save extra data to the $field
|
||||
*
|
||||
* @type action
|
||||
* @since 3.6
|
||||
* @date 23/01/13
|
||||
*
|
||||
* @param $field - an array holding all the field's data
|
||||
*/
|
||||
|
||||
function render_field_settings( $field ) {
|
||||
|
||||
// default_value
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Default Value','acf'),
|
||||
'instructions' => __('Appears when creating a new post','acf'),
|
||||
'type' => 'number',
|
||||
'name' => 'default_value',
|
||||
));
|
||||
|
||||
|
||||
// min
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Minimum Value','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'min',
|
||||
'placeholder' => '0'
|
||||
));
|
||||
|
||||
|
||||
// max
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Maximum Value','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'max',
|
||||
'placeholder' => '100'
|
||||
));
|
||||
|
||||
|
||||
// step
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Step Size','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'number',
|
||||
'name' => 'step',
|
||||
'placeholder' => '1'
|
||||
));
|
||||
|
||||
|
||||
// prepend
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Prepend','acf'),
|
||||
'instructions' => __('Appears before the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'prepend',
|
||||
));
|
||||
|
||||
|
||||
// append
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Append','acf'),
|
||||
'instructions' => __('Appears after the input','acf'),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
acf_render_field_setting(
|
||||
$field,
|
||||
array(
|
||||
'label' => __( 'Append', 'acf' ),
|
||||
'instructions' => __( 'Appears after the input', 'acf' ),
|
||||
'type' => 'text',
|
||||
'name' => 'append',
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_range' );
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf_register_field_type( 'acf_field_range' );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue