Current File : /home/itiffy/rockyjohnsonconcrete.com/wp-content/plugins/advanced-custom-fields/acf.php |
<?php
/*
Plugin Name: Advanced Custom Fields
Plugin URI: http://www.advancedcustomfields.com/
Description: Customise WordPress with powerful, professional and intuitive fields
Version: 4.4.12
Author: Elliot Condon
Author URI: http://www.elliotcondon.com/
License: GPL
Copyright: Elliot Condon
Text Domain: acf
Domain Path: /lang
*/
if( !class_exists('acf') ):
class acf {
/** @var string The plugin version number */
var $version = '4.4.12';
/** @var array The plugin settings array */
var $settings = array();
/*
* Constructor
*
* This function will construct all the neccessary actions, filters and functions for the ACF plugin to work
*
* @type function
* @date 23/06/12
* @since 1.0.0
*
* @param N/A
* @return N/A
*/
function __construct() {
// helpers
add_filter('acf/helpers/get_path', array($this, 'helpers_get_path'), 1, 1);
add_filter('acf/helpers/get_dir', array($this, 'helpers_get_dir'), 1, 1);
// vars
$this->settings = array(
// basic
'name' => __('Advanced Custom Fields', 'acf'),
'version' => $this->version,
// urls
'file' => __FILE__,
'path' => apply_filters('acf/helpers/get_path', __FILE__),
'dir' => apply_filters('acf/helpers/get_dir', __FILE__),
'basename' => plugin_basename( __FILE__ ),
// options
'include_3rd_party' => false
);
// set text domain
load_textdomain('acf', $this->settings['path'] . 'lang/acf-' . get_locale() . '.mo');
// actions
add_action('init', array($this, 'init'), 1);
add_action('acf/pre_save_post', array($this, 'save_post_lock'), 0);
add_action('acf/pre_save_post', array($this, 'save_post_unlock'), 999);
add_action('acf/save_post', array($this, 'save_post_lock'), 0);
add_action('acf/save_post', array($this, 'save_post'), 10);
add_action('acf/save_post', array($this, 'save_post_unlock'), 999);
add_action('acf/create_fields', array($this, 'create_fields'), 1, 2);
// filters
add_filter('acf/get_info', array($this, 'get_info'), 1, 1);
add_filter('acf/parse_types', array($this, 'parse_types'), 1, 1);
add_filter('acf/get_post_types', array($this, 'get_post_types'), 1, 3);
add_filter('acf/get_taxonomies_for_select', array($this, 'get_taxonomies_for_select'), 1, 2);
add_filter('acf/get_image_sizes', array($this, 'get_image_sizes'), 1, 1);
add_filter('acf/get_post_id', array($this, 'get_post_id'), 1, 1);
// includes
$this->include_before_theme();
add_action('after_setup_theme', array($this, 'include_after_theme'), 1);
add_action('after_setup_theme', array($this, 'include_3rd_party'), 1);
}
/*
* helpers_get_path
*
* This function will calculate the path to a file
*
* @type function
* @date 30/01/13
* @since 3.6.0
*
* @param $file (file) a reference to the file
* @return (string)
*/
function helpers_get_path( $file )
{
return trailingslashit(dirname($file));
}
/*
* helpers_get_dir
*
* This function will calculate the directory (URL) to a file
*
* @type function
* @date 30/01/13
* @since 3.6.0
*
* @param $file (file) a reference to the file
* @return (string)
*/
function helpers_get_dir( $file )
{
$dir = trailingslashit(dirname($file));
$count = 0;
// sanitize for Win32 installs
$dir = str_replace('\\' ,'/', $dir);
// if file is in plugins folder
$wp_plugin_dir = str_replace('\\' ,'/', WP_PLUGIN_DIR);
$dir = str_replace($wp_plugin_dir, plugins_url(), $dir, $count);
if( $count < 1 )
{
// if file is in wp-content folder
$wp_content_dir = str_replace('\\' ,'/', WP_CONTENT_DIR);
$dir = str_replace($wp_content_dir, content_url(), $dir, $count);
}
if( $count < 1 )
{
// if file is in ??? folder
$wp_dir = str_replace('\\' ,'/', ABSPATH);
$dir = str_replace($wp_dir, site_url('/'), $dir);
}
return $dir;
}
/*
* acf/get_post_id
*
* A helper function to filter the post_id variable.
*
* @type filter
* @date 27/05/13
*
* @param {mixed} $post_id
* @return {mixed} $post_id
*/
function get_post_id( $post_id ) {
// if not $post_id, load queried object
if( !$post_id ) {
// try for global post (needed for setup_postdata)
$post_id = (int) get_the_ID();
// try for current screen
if( !$post_id ) {
$post_id = get_queried_object();
}
}
// $post_id may be an object
if( is_object($post_id) ) {
// user
if( isset($post_id->roles, $post_id->ID) ) {
$post_id = 'user_' . $post_id->ID;
// term
} elseif( isset($post_id->taxonomy, $post_id->term_id) ) {
$post_id = $post_id->taxonomy . '_' . $post_id->term_id;
// comment
} elseif( isset($post_id->comment_ID) ) {
$post_id = 'comment_' . $post_id->comment_ID;
// post
} elseif( isset($post_id->ID) ) {
$post_id = $post_id->ID;
// default
} else {
$post_id = 0;
}
}
// allow for option == options
if( $post_id === 'option' ) {
$post_id = 'options';
}
/*
* Override for preview
*
* If the $_GET['preview_id'] is set, then the user wants to see the preview data.
* There is also the case of previewing a page with post_id = 1, but using get_field
* to load data from another post_id.
* In this case, we need to make sure that the autosave revision is actually related
* to the $post_id variable. If they match, then the autosave data will be used, otherwise,
* the user wants to load data from a completely different post_id
*/
if( isset($_GET['preview_id']) ) {
$autosave = wp_get_post_autosave( $_GET['preview_id'] );
if( $autosave && $autosave->post_parent == $post_id ) {
$post_id = (int) $autosave->ID;
}
}
// return
return $post_id;
}
/*
* get_info
*
* This function will return a setting from the settings array
*
* @type function
* @date 24/01/13
* @since 3.6.0
*
* @param $i (string) the setting to get
* @return (mixed)
*/
function get_info( $i )
{
// vars
$return = false;
// specific
if( isset($this->settings[ $i ]) )
{
$return = $this->settings[ $i ];
}
// all
if( $i == 'all' )
{
$return = $this->settings;
}
// return
return $return;
}
/*
* parse_types
*
* @description: helper function to set the 'types' of variables
* @since: 2.0.4
* @created: 9/12/12
*/
function parse_types( $value )
{
// vars
$restricted = array(
'label',
'name',
'_name',
'value',
'instructions'
);
// is value another array?
if( is_array($value) )
{
foreach( $value as $k => $v )
{
// bail early for restricted pieces
if( in_array($k, $restricted, true) )
{
continue;
}
// filter piece
$value[ $k ] = apply_filters( 'acf/parse_types', $v );
}
}
else
{
// string
if( is_string($value) )
{
$value = trim( $value );
}
// numbers
if( is_numeric($value) )
{
// check for non numeric characters
if( preg_match('/[^0-9]/', $value) )
{
// leave value if it contains such characters: . + - e
//$value = floatval( $value );
}
else
{
$value = intval( $value );
}
}
}
// return
return $value;
}
/*
* include_before_theme
*
* This function will include core files before the theme's functions.php file has been excecuted.
*
* @type action (plugins_loaded)
* @date 3/09/13
* @since 4.3.0
*
* @param N/A
* @return N/A
*/
function include_before_theme()
{
// incudes
include_once('core/api.php');
include_once('core/controllers/input.php');
include_once('core/controllers/location.php');
include_once('core/controllers/field_group.php');
// admin only includes
if( is_admin() )
{
include_once('core/controllers/post.php');
include_once('core/controllers/revisions.php');
include_once('core/controllers/everything_fields.php');
include_once('core/controllers/field_groups.php');
}
// register fields
include_once('core/fields/_functions.php');
include_once('core/fields/_base.php');
include_once('core/fields/text.php');
include_once('core/fields/textarea.php');
include_once('core/fields/number.php');
include_once('core/fields/email.php');
include_once('core/fields/password.php');
include_once('core/fields/wysiwyg.php');
include_once('core/fields/image.php');
include_once('core/fields/file.php');
include_once('core/fields/select.php');
include_once('core/fields/checkbox.php');
include_once('core/fields/radio.php');
include_once('core/fields/true_false.php');
include_once('core/fields/page_link.php');
include_once('core/fields/post_object.php');
include_once('core/fields/relationship.php');
include_once('core/fields/taxonomy.php');
include_once('core/fields/user.php');
include_once('core/fields/google-map.php');
include_once('core/fields/date_picker/date_picker.php');
include_once('core/fields/color_picker.php');
include_once('core/fields/message.php');
include_once('core/fields/tab.php');
}
/*
* include_3rd_party
*
* This function will include 3rd party add-ons
*
* @type function
* @date 29/01/2014
* @since 5.0.0
*
* @param N/A
* @return N/A
*/
function include_3rd_party() {
// run only once
if( $this->settings['include_3rd_party'] )
{
return false;
}
// update setting
$this->settings['include_3rd_party'] = true;
// include 3rd party fields
do_action('acf/register_fields');
}
/*
* include_after_theme
*
* This function will include core files after the theme's functions.php file has been excecuted.
*
* @type action (after_setup_theme)
* @date 3/09/13
* @since 4.3.0
*
* @param N/A
* @return N/A
*/
function include_after_theme() {
// early access
if( defined('ACF_EARLY_ACCESS') ) {
include_once('core/early-access.php');
}
// bail early if user has defined LITE_MODE as true
if( defined('ACF_LITE') && ACF_LITE )
{
return;
}
// admin only includes
if( is_admin() )
{
include_once('core/controllers/export.php');
include_once('core/controllers/addons.php');
include_once('core/controllers/third_party.php');
include_once('core/controllers/upgrade.php');
}
}
/*
* init
*
* This function is called during the 'init' action and will do things such as:
* create post_type, register scripts, add actions / filters
*
* @type action (init)
* @date 23/06/12
* @since 1.0.0
*
* @param N/A
* @return N/A
*/
function init()
{
// Create ACF post type
$labels = array(
'name' => __( 'Field Groups', 'acf' ),
'singular_name' => __( 'Advanced Custom Fields', 'acf' ),
'add_new' => __( 'Add New' , 'acf' ),
'add_new_item' => __( 'Add New Field Group' , 'acf' ),
'edit_item' => __( 'Edit Field Group' , 'acf' ),
'new_item' => __( 'New Field Group' , 'acf' ),
'view_item' => __('View Field Group', 'acf'),
'search_items' => __('Search Field Groups', 'acf'),
'not_found' => __('No Field Groups found', 'acf'),
'not_found_in_trash' => __('No Field Groups found in Trash', 'acf'),
);
register_post_type('acf', array(
'labels' => $labels,
'public' => false,
'show_ui' => true,
'_builtin' => false,
'capability_type' => 'page',
'hierarchical' => true,
'rewrite' => false,
'query_var' => "acf",
'supports' => array(
'title',
),
'show_in_menu' => false,
));
// min
$min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
// register acf scripts
$scripts = array();
$scripts[] = array(
'handle' => 'acf-field-group',
'src' => $this->settings['dir'] . "js/field-group{$min}.js",
'deps' => array('jquery')
);
$scripts[] = array(
'handle' => 'acf-input',
'src' => $this->settings['dir'] . "js/input{$min}.js",
'deps' => array('jquery', 'jquery-ui-core', 'jquery-ui-datepicker')
);
foreach( $scripts as $script )
{
wp_register_script( $script['handle'], $script['src'], $script['deps'], $this->settings['version'] );
}
// register acf styles
$styles = array(
'acf' => $this->settings['dir'] . 'css/acf.css',
'acf-field-group' => $this->settings['dir'] . 'css/field-group.css',
'acf-global' => $this->settings['dir'] . 'css/global.css',
'acf-input' => $this->settings['dir'] . 'css/input.css',
'acf-datepicker' => $this->settings['dir'] . 'core/fields/date_picker/style.date_picker.css',
);
foreach( $styles as $k => $v )
{
wp_register_style( $k, $v, false, $this->settings['version'] );
}
// bail early if user has defined LITE_MODE as true
if( defined('ACF_LITE') && ACF_LITE )
{
return;
}
// admin only
if( is_admin() )
{
add_action('admin_menu', array($this,'admin_menu'));
add_action('admin_head', array($this,'admin_head'));
add_filter('post_updated_messages', array($this, 'post_updated_messages'));
}
}
/*
* admin_menu
*
* @description:
* @since 1.0.0
* @created: 23/06/12
*/
function admin_menu()
{
add_menu_page(__("Custom Fields",'acf'), __("Custom Fields",'acf'), 'manage_options', 'edit.php?post_type=acf', false, false, '80.025');
}
/*
* post_updated_messages
*
* @description: messages for saving a field group
* @since 1.0.0
* @created: 23/06/12
*/
function post_updated_messages( $messages )
{
global $post, $post_ID;
$messages['acf'] = array(
0 => '', // Unused. Messages start at index 1.
1 => __('Field group updated.', 'acf'),
2 => __('Custom field updated.', 'acf'),
3 => __('Custom field deleted.', 'acf'),
4 => __('Field group updated.', 'acf'),
/* translators: %s: date and time of the revision */
5 => isset($_GET['revision']) ? sprintf( __('Field group restored to revision from %s', 'acf'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
6 => __('Field group published.', 'acf'),
7 => __('Field group saved.', 'acf'),
8 => __('Field group submitted.', 'acf'),
9 => __('Field group scheduled for.', 'acf'),
10 => __('Field group draft updated.', 'acf'),
);
return $messages;
}
/*--------------------------------------------------------------------------------------
*
* admin_head
*
* @author Elliot Condon
* @since 1.0.0
*
*-------------------------------------------------------------------------------------*/
function admin_head()
{
?>
<style type="text/css">
#adminmenu #toplevel_page_edit-post_type-acf a[href="edit.php?post_type=acf&page=acf-upgrade"]{ display: none; }
#adminmenu #toplevel_page_edit-post_type-acf .wp-menu-image { background-position: 1px -33px; }
#adminmenu #toplevel_page_edit-post_type-acf:hover .wp-menu-image,
#adminmenu #toplevel_page_edit-post_type-acf.wp-menu-open .wp-menu-image { background-position: 1px -1px; }
</style>
<?php
}
/*
* get_taxonomies_for_select
*
* @description:
* @since: 3.6
* @created: 27/01/13
*/
function get_taxonomies_for_select( $choices, $simple_value = false )
{
// vars
$post_types = get_post_types();
if($post_types)
{
foreach($post_types as $post_type)
{
$post_type_object = get_post_type_object($post_type);
$taxonomies = get_object_taxonomies($post_type);
if($taxonomies)
{
foreach($taxonomies as $taxonomy)
{
if(!is_taxonomy_hierarchical($taxonomy)) continue;
$terms = get_terms($taxonomy, array('hide_empty' => false));
if($terms)
{
foreach($terms as $term)
{
$value = $taxonomy . ':' . $term->term_id;
if( $simple_value )
{
$value = $term->term_id;
}
$choices[$post_type_object->label . ': ' . $taxonomy][$value] = $term->name;
}
}
}
}
}
}
return $choices;
}
/*
* get_post_types
*
* @description:
* @since: 3.5.5
* @created: 16/12/12
*/
function get_post_types( $post_types, $exclude = array(), $include = array() )
{
// get all custom post types
$post_types = array_merge($post_types, get_post_types());
// core include / exclude
$acf_includes = array_merge( array(), $include );
$acf_excludes = array_merge( array( 'acf', 'revision', 'nav_menu_item' ), $exclude );
// include
foreach( $acf_includes as $p )
{
if( post_type_exists($p) )
{
$post_types[ $p ] = $p;
}
}
// exclude
foreach( $acf_excludes as $p )
{
unset( $post_types[ $p ] );
}
return $post_types;
}
/*
* get_image_sizes
*
* @description: returns an array holding all the image sizes
* @since 3.2.8
* @created: 6/07/12
*/
function get_image_sizes( $sizes )
{
// find all sizes
$all_sizes = get_intermediate_image_sizes();
// define default sizes
$sizes = array_merge($sizes, array(
'thumbnail' => __("Thumbnail",'acf'),
'medium' => __("Medium",'acf'),
'large' => __("Large",'acf'),
'full' => __("Full",'acf')
));
// add extra registered sizes
foreach( $all_sizes as $size )
{
if( !isset($sizes[ $size ]) )
{
$sizes[ $size ] = ucwords( str_replace('-', ' ', $size) );
}
}
// return array
return $sizes;
}
/*
* render_fields_for_input
*
* @description:
* @since 3.1.6
* @created: 23/06/12
*/
function create_fields( $fields, $post_id )
{
if( is_array($fields) ){ foreach( $fields as $field ){
// if they didn't select a type, skip this field
if( !$field || !$field['type'] || $field['type'] == 'null' )
{
continue;
}
// set value
if( !isset($field['value']) )
{
$field['value'] = apply_filters('acf/load_value', false, $post_id, $field);
$field['value'] = apply_filters('acf/format_value', $field['value'], $post_id, $field);
}
// required
$required_class = "";
$required_label = "";
if( $field['required'] )
{
$required_class = ' required';
$required_label = ' <span class="required">*</span>';
}
echo '<div id="acf-' . $field['name'] . '" class="field field_type-' . $field['type'] . ' field_key-' . $field['key'] . $required_class . '" data-field_name="' . $field['name'] . '" data-field_key="' . $field['key'] . '" data-field_type="' . $field['type'] . '">';
echo '<p class="label">';
echo '<label for="' . $field['id'] . '">' . $field['label'] . $required_label . '</label>';
echo $field['instructions'];
echo '</p>';
$field['name'] = 'fields[' . $field['key'] . ']';
do_action('acf/create_field', $field, $post_id);
echo '</div>';
}}
}
/*
* save_post_lock
*
* This action sets a global variable which locks the ACF save functions to this ID.
* This prevents an inifinite loop if a user was to hook into the save and create a new post
*
* @type function
* @date 16/07/13
*
* @param {int} $post_id
* @return {int} $post_id
*/
function save_post_lock( $post_id )
{
$GLOBALS['acf_save_lock'] = $post_id;
return $post_id;
}
/*
* save_post_unlock
*
* This action sets a global variable which unlocks the ACF save functions to this ID.
* This prevents an inifinite loop if a user was to hook into the save and create a new post
*
* @type function
* @date 16/07/13
*
* @param {int} $post_id
* @return {int} $post_id
*/
function save_post_unlock( $post_id )
{
$GLOBALS['acf_save_lock'] = false;
return $post_id;
}
/*
* save_post
*
* @description:
* @since: 3.6
* @created: 28/01/13
*/
function save_post( $post_id )
{
// load from post
if( !isset($_POST['fields']) )
{
return $post_id;
}
// loop through and save
if( !empty($_POST['fields']) )
{
// loop through and save $_POST data
foreach( $_POST['fields'] as $k => $v )
{
// get field
$f = apply_filters('acf/load_field', false, $k );
// update field
do_action('acf/update_value', $v, $post_id, $f );
}
// foreach($fields as $key => $value)
}
// if($fields)
return $post_id;
}
}
/*
* acf
*
* The main function responsible for returning the one true acf Instance to functions everywhere.
* Use this function like you would a global variable, except without needing to declare the global.
*
* Example: <?php $acf = acf(); ?>
*
* @type function
* @date 4/09/13
* @since 4.3.0
*
* @param N/A
* @return (object)
*/
function acf()
{
global $acf;
if( !isset($acf) )
{
$acf = new acf();
}
return $acf;
}
// initialize
acf();
endif; // class_exists check
?>