Added dependency plugins

This commit is contained in:
Moris Zen
2018-06-25 00:00:37 +02:00
parent 720a1c31a4
commit f069f6782f
698 changed files with 289637 additions and 1 deletions

View File

@@ -4,5 +4,11 @@
"repository": "git@gitlab.com:website-saburly/v2-backend.git",
"author": "Saburly",
"license": "UNLICENSED",
"private": true
"private": true,
"scripts": {
"preinstall": "chmod +x install.sh && chmod +x mysql_config.sh && ./install.sh",
"postinstall": "robo wordpress:setup",
"start": "wp server",
"lint": "phpcs -v wordpress/wp-content/themes/saburly-headless/. RoboFile.php"
}
}

View File

@@ -0,0 +1,83 @@
# ACF to WP-API
[![Join the chat at https://gitter.im/times/acf-to-wp-api](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/times/acf-to-wp-api?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Contributors: chrishutchinson, kokarn, ramvi
Tags: acf, api, wp-api
Requires at least: 3.9.0
Tested up to: 4.7.3
Stable tag: 1.4.0
License: MIT
License URI: http://opensource.org/licenses/MIT
Plugs Advanced Custom Fields (ACF) data into the WordPress JSON API (WP-API).
## Description
Puts all ACF fields from posts, pages, custom post types, comments, attachments and taxonomy terms, into the WP-API output under the 'acf' key. Creates a new `/option` endpoint returning options (requires ACF Options Page plugin).
## Installation
1. Unzip and upload the `acf-to-wp-api` directory to `/wp-content/plugins/`.
2. Activate the plugin through the 'Plugins' menu in WordPress
## Frequently Asked Questions
#### How can I log and issue or contribute code?
See the `CONTRIBUTING.md` file.
#### How can I filter posts on a custom field?
See issue #13 for example code to do this.
## Options Endpoints
### `/wp-json/wp/v2/acf/options`
Request a list of all options configured in ACF
### `/wp-json/wp/v2/acf/options/{option-name}`
Request a specific option, by passing in the option name
## Changelog
### 1.4.0
* Compatibility improvements for WordPress 4.7
### 1.3.3
* Compatibility fix for V2.0Beta9
### 1.3.2
* Adds support for custom post types when using v2 of the REST API
### 1.3.1
* Fix to support PHP < 5.4
### 1.3.0
* Add support for v2 of WP-API
* Restructure of much of the code, adding documentation throughout
* Add an additional endpoint for requesting single option values
* Tested with WordPress 4.3.0
### 1.2.1
* Tested with WordPress 4.2.1
### 1.2.0
* Added ACF data to comments (Thanks @ramvi).
### 1.1.0
* Add `/option` endpoint for ACF options add-on (Thanks @kokarn).
### 1.0.1
* Fix for addACFDataTerm.
### 1.0.0
* Initial release.

View File

@@ -0,0 +1,560 @@
<?php
/**
* Plugin Name: ACF to WP API
* Description: Puts all ACF fields from posts, pages, custom post types, attachments and taxonomy terms, into the WP-API output under the 'acf' key
* Author: Chris Hutchinson
* Author URI: http://www.chrishutchinson.me
* Version: 1.4.0
* Plugin URI: https://wordpress.org/plugins/acf-to-wp-api/
*/
class ACFtoWPAPI {
/**
* @var object $plugin All base plugin configuration is stored here
*/
protected $plugin;
/**
* @var string $apiVersion Stores the version number of the REST API
*/
protected $apiVersion;
/**
* Constructor
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @since 1.4.0 Improved API version checking
* @since 1.3.3 Compatibility fix for V2.0Beta9
* @since 1.3.0 Updated to support version 2 of the WP-API
* @since 1.0.0
*/
function __construct() {
// Setup defaults
$this->plugin = new StdClass;
$this->plugin->title = 'ACF to WP API';
$this->plugin->name = 'acf-to-wp-api';
$this->plugin->folder = WP_PLUGIN_DIR . '/' . $this->plugin->name;
$this->plugin->url = WP_PLUGIN_URL . '/' . str_replace(basename( __FILE__), "", plugin_basename(__FILE__));
$this->plugin->version = '1.4.0';
$this->apiVersion = $this->_getAPIVersion();
// Version One
if($this->_isAPIVersionOne()) {
$this->_versionOneSetup();
}
// Version Two
if($this->_isAPIVersionTwo()) {
$this->_versionTwoSetup();
}
}
/**
* Die and dump
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param mixed $data The data to be dumped to the screen
*
* @return void
*
* @since 1.3.0
*/
private function dd($data) {
if( WP_DEBUG ) {
echo '<pre>';
print_r($data);
echo '</pre>';
die();
}
}
/**
* Adds the required filters and hooks for version 1 of the REST API
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return void
*
* @since 1.3.0
*/
private function _versionOneSetup() {
// Filters
add_filter( 'json_prepare_post', array( $this, 'addACFDataPost'), 10, 3 ); // Posts
add_filter( 'json_prepare_term', array( $this, 'addACFDataTerm'), 10, 3 ); // Taxonomy Terms
add_filter( 'json_prepare_user', array( $this, 'addACFDataUser'), 10, 3 ); // Users
add_filter( 'json_prepare_comment', array( $this, 'addACFDataComment'), 10, 3 ); // Comments
// Endpoints
add_filter( 'json_endpoints', array( $this, 'registerRoutes' ), 10, 3 );
}
/**
* Adds the required filters and hooks for version 2 of the REST API
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return void
*
* @since 1.3.0
*/
private function _versionTwoSetup() {
// Actions
add_action( 'rest_api_init', array( $this, 'addACFDataPostV2' ) ); // Posts
add_action( 'rest_api_init', array( $this, 'addACFDataTermV2' ) ); // Taxonomy Terms
add_action( 'rest_api_init', array( $this, 'addACFDataUserV2' ) ); // Users
add_action( 'rest_api_init', array( $this, 'addACFDataCommentV2' ) ); // Comments
add_action( 'rest_api_init', array( $this, 'addACFOptionRouteV2') );
}
/**
* Returns the WP REST API version, assumes version 2
* if can't find any other version
*
* @return string The version number, set by WP REST API
*
* @since 1.3.2
*/
private function _getAPIVersion() {
$version = 2;
if ( defined('REST_API_VERSION') ) {
$version = REST_API_VERSION;
} else {
$version = get_option( 'rest_api_plugin_version', get_option( 'json_api_plugin_version', null ) );
}
return $version;
}
/**
* Gets the version number of the WP REST API
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return int The base version number
*
* @since 1.3.0
*/
private function _getAPIBaseVersion() {
$version = $this->apiVersion;
if( is_null( $version ) ) {
return false;
}
$baseNumber = (int) substr( $version, 0, 1 );
if( $baseNumber > 0 ) {
return $baseNumber;
}
return false;
}
/**
* Check if the current API base version is version 1
*
* @return boolean True if the current API version is 1
*
* @since 1.3.0
*/
private function _isAPIVersionOne() {
if($this->_getAPIBaseVersion() === 1) {
return true;
}
return false;
}
/**
* Check if the current API base version is version 2
*
* @return boolean True if the current API version is 2
*
* @since 1.3.0
*/
private function _isAPIVersionTwo() {
if($this->_getAPIBaseVersion() === 2) {
return true;
}
return false;
}
/**
* Add data to users
*
* @param array $data The current ACF data
* @param int $user The ID of the user
* @param string $context The context the data is being requested in
*
* @since 1.1.0
*/
function addACFDataUser( $data, $user, $context ) {
$data['acf'] = $this->_getData( $user->ID, 'user' );
return $data;
}
/**
* Add data to terms
*
* @param array $data The current ACF data
* @param int $term The ID of the term
* @param string $context The context the data is being requested in
*
* @since 1.1.0
*/
function addACFDataTerm( $data, $term, $context = null ) {
$data['acf'] = get_fields( $term, 'term' );
return $data;
}
/**
* Add data to Posts, Custom Post Types, Pages & Attachments
*
* @param array $data The current ACF data
* @param int $post The ID of the record
* @param string $context The context the data is being requested in
*
* @since 1.1.0
*/
function addACFDataPost( $data, $post, $context ) {
$data['acf'] = $this->_getData( $post['ID'] );
return $data;
}
/**
* Registers the `acf` field against posts
*
* @return void
*
* @since 1.3.2 Adds support for pages and public custom post types
* @since 1.3.0
*/
function addACFDataPostV2() {
// Posts
register_rest_field( 'post',
'acf',
array(
'get_callback' => array( $this, 'addACFDataPostV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
// Pages
register_rest_field( 'page',
'acf',
array(
'get_callback' => array( $this, 'addACFDataPostV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
// Public custom post types
$types = get_post_types(array(
'public' => true,
'_builtin' => false
));
foreach($types as $key => $type) {
register_rest_field( $type,
'acf',
array(
'get_callback' => array( $this, 'addACFDataPostV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
}
/**
* Returns the ACF data to be added to the JSON response posts
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataPostV2()
*
* @since 1.3.0
*/
function addACFDataPostV2cb($object, $fieldName, $request) {
return $this->_getData($object['id']);
}
/**
* Registers the `acf` field against taxonomy terms
*
* @return void
*
* @since 1.3.0
*/
function addACFDataTermV2() {
register_rest_field( 'term',
'acf',
array(
'get_callback' => array( $this, 'addACFDataTermV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Returns the ACF data to be added to the JSON response for taxonomy terms
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataTermV2()
*
* @since 1.3.0
*/
function addACFDataTermV2cb($object, $fieldName, $request) {
return $this->_getData($object['id'], 'term', $object);
}
/**
* Registers the `acf` field against users
*
* @return void
*
* @since 1.3.0
*/
function addACFDataUserV2() {
register_rest_field( 'user',
'acf',
array(
'get_callback' => array( $this, 'addACFDataUserV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Returns the ACF data to be added to the JSON response for users
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataUserV2()
*
* @since 1.3.0
*/
function addACFDataUserV2cb($object, $fieldName, $request) {
return $this->_getData( $object['id'], 'user' );
}
/**
* Registers the `acf` field against comments
*
* @return void
*
* @since 1.3.0
*/
function addACFDataCommentV2() {
register_rest_field( 'comment',
'acf',
array(
'get_callback' => array( $this, 'addACFDataCommentV2cb' ),
'update_callback' => null,
'schema' => null,
)
);
}
/**
* Returns the ACF data to be added to the JSON response for comments
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $object The object to get data for
* @param string $fieldName The name of the field being completed
* @param object $request The WP_REST_REQUEST object
*
* @return array The data for this object type
*
* @see ACFtoWPAPI::addACFDataCommentV2()
*
* @since 1.3.0
*/
function addACFDataCommentV2cb( $object, $fieldName, $request ) {
return $this->_getData( $object['id'], 'comment' );
}
/**
* Returns an array of Advanced Custom Fields data for the given record
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param int $id The ID of the object to get
* @param string $type The type of the object to get
* @param array $object The full object being requested, only required for specific $types
*
* @return array The Advanced Custom Fields data for the supplied record
*
* @since 1.3.0
*/
private function _getData($id, $type = 'post', $object = array()) {
switch($type) {
case 'post':
default:
return get_fields($id);
break;
case 'term':
return get_fields($object['taxonomy'] . '_' . $id);
break;
case 'user':
return get_fields('user_' . $id);
break;
case 'comment':
return get_fields('comment_' . $id);
break;
case 'options':
return get_fields('option');
break;
}
}
/**
* Registers the routes for all and single options
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @return void
*
* @since 1.3.1 Switched to array() notation (over [] notation) to support PHP < 5.4
* @since 1.3.0
*/
function addACFOptionRouteV2() {
register_rest_route( 'wp/v2/acf', '/options', array(
'methods' => array(
'GET'
),
'callback' => array( $this, 'addACFOptionRouteV2cb' )
) );
register_rest_route( 'wp/v2/acf', '/options/(?P<option>.+)', array(
'methods' => array(
'GET'
),
'callback' => array( $this, 'addACFOptionRouteV2cb' )
) );
}
/**
* The callback for the `wp/v2/acf/options` endpoint
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param WP_REST_Request $request The WP_REST_Request object
*
* @return array|string The single requested option, or all options
*
* @see ACFtoWPAPI::addACFOptionRouteV2()
*
* @since 1.3.0
*/
function addACFOptionRouteV2cb( WP_REST_Request $request ) {
if($request['option']) {
return get_field($request['option'], 'option');
}
return get_fields('option');
}
/**
* Returns data for comments (WP API v1)
*
* @author Chris Hutchinson <chris_hutchinson@me.com>
*
* @param array $data The response data to be extended
* @param object $comment The comment being requested
* @param string $context The context the data is being requested in
*
* @return array The extended $data array, with ACF data
*
* @since 1.1.0
*
*/
function addACFDataComment($data, $comment, $context) {
$data['acf'] = $this->_getData('comment_' . $comment->comment_ID);
return $data;
}
/**
* Returns data for options (WP API v1)
*
* @author github.com/kokarn
*
* @return array The options data
*
* @since 1.1.0
*
*/
function getACFOptions() {
return get_fields('options');
}
/**
* Returns a single option based on the supplied name (WP API v1)
*
* @author github.com/asquel
*
* @param string $name The option name being requested
*
* @return mixed The data for the supplied option
*
* @since 1.3.0
*/
function getACFOption($name) {
return get_field($name, 'option');
}
/**
* Registers additional routes (WP API v1)
*
* @author github.com/kokarn
*
* @return array The routes data
*
* @since 1.1.0
*
*/
function registerRoutes( $routes ) {
$routes['/option'] = array(
array( array( $this, 'getACFOptions' ), WP_JSON_Server::READABLE )
);
$routes['/options'] = array(
array( array( $this, 'getACFOptions' ), WP_JSON_Server::READABLE )
);
$routes['/options/(?P<name>[\w-]+)'] = array(
array( array( $this, 'getACFOption' ), WP_JSON_Server::READABLE ),
);
return $routes;
}
}
$ACFtoWPAPI = new ACFtoWPAPI();

View File

@@ -0,0 +1,76 @@
=== ACF to WP-API ===
Contributors: chrishutchinson, kokarn, ramvi
Tags: acf, api, wp-api
Requires at least: 3.9.0
Tested up to: 4.7.3
Stable tag: 1.4.0
License: MIT
License URI: http://opensource.org/licenses/MIT
Plugs Advanced Custom Fields (ACF) data into the WordPress JSON API (WP-API).
== Description ==
Puts all ACF fields from posts, pages, custom post types, comments, attachments and taxonomy terms, into the WP-API output under the 'acf' key. Creates a new `/option` endpoint returning options (requires ACF Options Page plugin).
== Installation ==
1. Unzip and upload the `acf-to-wp-api` directory to `/wp-content/plugins/`.
2. Activate the plugin through the 'Plugins' menu in WordPress
== Frequently Asked Questions ==
= How can I log and issue or contribute code? =
See the `CONTRIBUTING.md` file.
= How can I filter posts on a custom field?
See GitHub issue #13 (http://github.com/times/acf-to-wp-api/issues/13) for example code to do this.
== Screenshots ==
== Changelog ==
= 1.4.0 =
* Compatibility improvements for WordPress 4.7
= 1.3.3 =
* Compatibility fix for V2.0Beta9
= 1.3.2 =
* Adds support for custom post types when using v2 of the REST API
= 1.3.1 =
* Fix to support PHP < 5.4
= 1.3.0 =
* Add support for v2 of WP-API
* Restructure of much of the code, adding documentation throughout
* Add an additional endpoint for requesting single option values
* Tested with WordPress 4.3.0
= 1.2.1 =
* Tested with WordPress 4.2.1
= 1.2.0 =
* Added ACF data to comments (Thanks @ramvi).
= 1.1.0 =
* Add `option` endpoint for ACF options add-on (Thanks @kokarn).
= 1.0.1 =
* Fix for addACFDataTerm.
= 1.0.0 =
* Initial release.

View File

@@ -0,0 +1,666 @@
<?php
/*
Plugin Name: Advanced Custom Fields PRO
Plugin URI: https://www.advancedcustomfields.com/
Description: Customise WordPress with powerful, professional and intuitive fields.
Version: 5.6.7
Author: Elliot Condon
Author URI: http://www.elliotcondon.com/
Copyright: Elliot Condon
Text Domain: acf
Domain Path: /lang
*/
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('acf') ) :
class acf {
/** @var string The plugin version number */
var $version = '5.6.7';
/** @var array The plugin settings array */
var $settings = array();
/*
* __construct
*
* A dummy constructor to ensure ACF is only initialized once
*
* @type function
* @date 23/06/12
* @since 5.0.0
*
* @param N/A
* @return N/A
*/
function __construct() {
/* Do nothing here */
}
/*
* initialize
*
* The real constructor to initialize ACF
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function initialize() {
// vars
$this->settings = array(
// basic
'name' => __('Advanced Custom Fields', 'acf'),
'version' => $this->version,
// urls
'file' => __FILE__,
'basename' => plugin_basename( __FILE__ ),
'path' => plugin_dir_path( __FILE__ ),
'dir' => plugin_dir_url( __FILE__ ),
// options
'show_admin' => true,
'show_updates' => true,
'stripslashes' => false,
'local' => true,
'json' => true,
'save_json' => '',
'load_json' => array(),
'default_language' => '',
'current_language' => '',
'capability' => 'manage_options',
'uploader' => 'wp',
'autoload' => false,
'l10n' => true,
'l10n_textdomain' => '',
'google_api_key' => '',
'google_api_client' => '',
'enqueue_google_maps' => true,
'enqueue_select2' => true,
'enqueue_datepicker' => true,
'enqueue_datetimepicker' => true,
'select2_version' => 4,
'row_index_offset' => 1,
'remove_wp_meta_box' => true
);
// constants
$this->define( 'ACF', true );
$this->define( 'ACF_VERSION', $this->settings['version'] );
$this->define( 'ACF_PATH', $this->settings['path'] );
// api
include_once( ACF_PATH . 'includes/api/api-helpers.php');
acf_include('includes/api/api-input.php');
acf_include('includes/api/api-value.php');
acf_include('includes/api/api-field.php');
acf_include('includes/api/api-field-group.php');
acf_include('includes/api/api-template.php');
// fields
acf_include('includes/fields.php');
acf_include('includes/fields/class-acf-field.php');
// locations
acf_include('includes/locations.php');
acf_include('includes/locations/class-acf-location.php');
// core
acf_include('includes/ajax.php');
acf_include('includes/cache.php');
acf_include('includes/compatibility.php');
acf_include('includes/deprecated.php');
acf_include('includes/input.php');
acf_include('includes/json.php');
acf_include('includes/local.php');
acf_include('includes/loop.php');
acf_include('includes/media.php');
acf_include('includes/revisions.php');
acf_include('includes/third_party.php');
acf_include('includes/updates.php');
acf_include('includes/validation.php');
// forms
acf_include('includes/forms/form-attachment.php');
acf_include('includes/forms/form-comment.php');
acf_include('includes/forms/form-customizer.php');
acf_include('includes/forms/form-front.php');
acf_include('includes/forms/form-nav-menu.php');
acf_include('includes/forms/form-post.php');
acf_include('includes/forms/form-taxonomy.php');
acf_include('includes/forms/form-user.php');
acf_include('includes/forms/form-widget.php');
// admin
if( is_admin() ) {
acf_include('includes/admin/admin.php');
acf_include('includes/admin/admin-field-group.php');
acf_include('includes/admin/admin-field-groups.php');
acf_include('includes/admin/install.php');
acf_include('includes/admin/admin-tools.php');
acf_include('includes/admin/settings-info.php');
// network
if( is_network_admin() ) {
acf_include('includes/admin/install-network.php');
}
}
// pro
acf_include('pro/acf-pro.php');
// actions
add_action('init', array($this, 'init'), 5);
add_action('init', array($this, 'register_post_types'), 5);
add_action('init', array($this, 'register_post_status'), 5);
add_action('init', array($this, 'register_assets'), 5);
// filters
add_filter('posts_where', array($this, 'posts_where'), 10, 2 );
//add_filter('posts_request', array($this, 'posts_request'), 10, 1 );
}
/*
* init
*
* This function will run after all plugins and theme functions have been included
*
* @type action (init)
* @date 28/09/13
* @since 5.0.0
*
* @param N/A
* @return N/A
*/
function init() {
// bail early if too early
// ensures all plugins have a chance to add fields, etc
if( !did_action('plugins_loaded') ) return;
// bail early if already init
if( acf_has_done('init') ) return;
// vars
$major = intval( acf_get_setting('version') );
// redeclare dir
// - allow another plugin to modify dir (maybe force SSL)
acf_update_setting('dir', plugin_dir_url( __FILE__ ));
// textdomain
$this->load_plugin_textdomain();
// include wpml support
if( defined('ICL_SITEPRESS_VERSION') ) {
acf_include('includes/wpml.php');
}
// fields
acf_include('includes/fields/class-acf-field-text.php');
acf_include('includes/fields/class-acf-field-textarea.php');
acf_include('includes/fields/class-acf-field-number.php');
acf_include('includes/fields/class-acf-field-range.php');
acf_include('includes/fields/class-acf-field-email.php');
acf_include('includes/fields/class-acf-field-url.php');
acf_include('includes/fields/class-acf-field-password.php');
acf_include('includes/fields/class-acf-field-image.php');
acf_include('includes/fields/class-acf-field-file.php');
acf_include('includes/fields/class-acf-field-wysiwyg.php');
acf_include('includes/fields/class-acf-field-oembed.php');
acf_include('includes/fields/class-acf-field-select.php');
acf_include('includes/fields/class-acf-field-checkbox.php');
acf_include('includes/fields/class-acf-field-radio.php');
acf_include('includes/fields/class-acf-field-button-group.php');
acf_include('includes/fields/class-acf-field-true_false.php');
acf_include('includes/fields/class-acf-field-link.php');
acf_include('includes/fields/class-acf-field-post_object.php');
acf_include('includes/fields/class-acf-field-page_link.php');
acf_include('includes/fields/class-acf-field-relationship.php');
acf_include('includes/fields/class-acf-field-taxonomy.php');
acf_include('includes/fields/class-acf-field-user.php');
acf_include('includes/fields/class-acf-field-google-map.php');
acf_include('includes/fields/class-acf-field-date_picker.php');
acf_include('includes/fields/class-acf-field-date_time_picker.php');
acf_include('includes/fields/class-acf-field-time_picker.php');
acf_include('includes/fields/class-acf-field-color_picker.php');
acf_include('includes/fields/class-acf-field-message.php');
acf_include('includes/fields/class-acf-field-accordion.php');
acf_include('includes/fields/class-acf-field-tab.php');
acf_include('includes/fields/class-acf-field-group.php');
do_action('acf/include_field_types', $major);
// locations
acf_include('includes/locations/class-acf-location-post-type.php');
acf_include('includes/locations/class-acf-location-post-template.php');
acf_include('includes/locations/class-acf-location-post-status.php');
acf_include('includes/locations/class-acf-location-post-format.php');
acf_include('includes/locations/class-acf-location-post-category.php');
acf_include('includes/locations/class-acf-location-post-taxonomy.php');
acf_include('includes/locations/class-acf-location-post.php');
acf_include('includes/locations/class-acf-location-page-template.php');
acf_include('includes/locations/class-acf-location-page-type.php');
acf_include('includes/locations/class-acf-location-page-parent.php');
acf_include('includes/locations/class-acf-location-page.php');
acf_include('includes/locations/class-acf-location-current-user.php');
acf_include('includes/locations/class-acf-location-current-user-role.php');
acf_include('includes/locations/class-acf-location-user-form.php');
acf_include('includes/locations/class-acf-location-user-role.php');
acf_include('includes/locations/class-acf-location-taxonomy.php');
acf_include('includes/locations/class-acf-location-attachment.php');
acf_include('includes/locations/class-acf-location-comment.php');
acf_include('includes/locations/class-acf-location-widget.php');
acf_include('includes/locations/class-acf-location-nav-menu.php');
acf_include('includes/locations/class-acf-location-nav-menu-item.php');
do_action('acf/include_location_rules', $major);
// local fields
do_action('acf/include_fields', $major);
// action for 3rd party
do_action('acf/init');
}
/*
* load_plugin_textdomain
*
* This function will load the textdomain file
*
* @type function
* @date 3/5/17
* @since 5.5.13
*
* @param n/a
* @return n/a
*/
function load_plugin_textdomain() {
// vars
$domain = 'acf';
$locale = apply_filters( 'plugin_locale', acf_get_locale(), $domain );
$mofile = $domain . '-' . $locale . '.mo';
// load from the languages directory first
load_textdomain( $domain, WP_LANG_DIR . '/plugins/' . $mofile );
// redirect missing translations
$mofile = str_replace('fr_CA', 'fr_FR', $mofile);
// load from plugin lang folder
load_textdomain( $domain, acf_get_path( 'lang/' . $mofile ) );
}
/*
* register_post_types
*
* This function will register post types and statuses
*
* @type function
* @date 22/10/2015
* @since 5.3.2
*
* @param n/a
* @return n/a
*/
function register_post_types() {
// vars
$cap = acf_get_setting('capability');
// register post type 'acf-field-group'
register_post_type('acf-field-group', array(
'labels' => array(
'name' => __( 'Field Groups', 'acf' ),
'singular_name' => __( 'Field Group', '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' ),
),
'public' => false,
'show_ui' => true,
'_builtin' => false,
'capability_type' => 'post',
'capabilities' => array(
'edit_post' => $cap,
'delete_post' => $cap,
'edit_posts' => $cap,
'delete_posts' => $cap,
),
'hierarchical' => true,
'rewrite' => false,
'query_var' => false,
'supports' => array('title'),
'show_in_menu' => false,
));
// register post type 'acf-field'
register_post_type('acf-field', array(
'labels' => array(
'name' => __( 'Fields', 'acf' ),
'singular_name' => __( 'Field', 'acf' ),
'add_new' => __( 'Add New' , 'acf' ),
'add_new_item' => __( 'Add New Field' , 'acf' ),
'edit_item' => __( 'Edit Field' , 'acf' ),
'new_item' => __( 'New Field' , 'acf' ),
'view_item' => __( 'View Field', 'acf' ),
'search_items' => __( 'Search Fields', 'acf' ),
'not_found' => __( 'No Fields found', 'acf' ),
'not_found_in_trash' => __( 'No Fields found in Trash', 'acf' ),
),
'public' => false,
'show_ui' => false,
'_builtin' => false,
'capability_type' => 'post',
'capabilities' => array(
'edit_post' => $cap,
'delete_post' => $cap,
'edit_posts' => $cap,
'delete_posts' => $cap,
),
'hierarchical' => true,
'rewrite' => false,
'query_var' => false,
'supports' => array('title'),
'show_in_menu' => false,
));
}
/*
* register_post_status
*
* This function will register custom post statuses
*
* @type function
* @date 22/10/2015
* @since 5.3.2
*
* @param $post_id (int)
* @return $post_id (int)
*/
function register_post_status() {
// acf-disabled
register_post_status('acf-disabled', array(
'label' => __( 'Inactive', 'acf' ),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', 'acf' ),
));
}
/*
* register_assets
*
* This function will register scripts and styles
*
* @type function
* @date 22/10/2015
* @since 5.3.2
*
* @param n/a
* @return n/a
*/
function register_assets() {
// vars
$version = acf_get_setting('version');
$min = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
// scripts
wp_register_script('acf-input', acf_get_dir("assets/js/acf-input{$min}.js"), array('jquery', 'jquery-ui-core', 'jquery-ui-sortable', 'jquery-ui-resizable'), $version );
wp_register_script('acf-field-group', acf_get_dir("assets/js/acf-field-group{$min}.js"), array('acf-input'), $version );
// styles
wp_register_style('acf-global', acf_get_dir('assets/css/acf-global.css'), array(), $version );
wp_register_style('acf-input', acf_get_dir('assets/css/acf-input.css'), array('acf-global'), $version );
wp_register_style('acf-field-group', acf_get_dir('assets/css/acf-field-group.css'), array('acf-input'), $version );
}
/*
* posts_where
*
* This function will add in some new parameters to the WP_Query args allowing fields to be found via key / name
*
* @type filter
* @date 5/12/2013
* @since 5.0.0
*
* @param $where (string)
* @param $wp_query (object)
* @return $where (string)
*/
function posts_where( $where, $wp_query ) {
// global
global $wpdb;
// acf_field_key
if( $field_key = $wp_query->get('acf_field_key') ) {
$where .= $wpdb->prepare(" AND {$wpdb->posts}.post_name = %s", $field_key );
}
// acf_field_name
if( $field_name = $wp_query->get('acf_field_name') ) {
$where .= $wpdb->prepare(" AND {$wpdb->posts}.post_excerpt = %s", $field_name );
}
// acf_group_key
if( $group_key = $wp_query->get('acf_group_key') ) {
$where .= $wpdb->prepare(" AND {$wpdb->posts}.post_name = %s", $group_key );
}
// return
return $where;
}
/*
* define
*
* This function will safely define a constant
*
* @type function
* @date 3/5/17
* @since 5.5.13
*
* @param $name (string)
* @param $value (mixed)
* @return n/a
*/
function define( $name, $value = true ) {
if( !defined($name) ) define( $name, $value );
}
/*
* get_setting
*
* This function will return a value from the settings array found in the acf object
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param $name (string) the setting name to return
* @param $value (mixed) default value
* @return $value
*/
function get_setting( $name, $value = null ) {
// check settings
if( isset($this->settings[ $name ]) ) {
$value = $this->settings[ $name ];
}
// filter for 3rd party customization
if( substr($name, 0, 1) !== '_' ) {
$value = apply_filters( "acf/settings/{$name}", $value );
}
// return
return $value;
}
/*
* update_setting
*
* This function will update a value into the settings array found in the acf object
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param $name (string)
* @param $value (mixed)
* @return n/a
*/
function update_setting( $name, $value ) {
$this->settings[ $name ] = $value;
return true;
}
}
/*
* 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();
$acf->initialize();
}
return $acf;
}
// initialize
acf();
endif; // class_exists check
?>

View File

@@ -0,0 +1,432 @@
/*--------------------------------------------------------------------------------------------
*
* Vars
*
*--------------------------------------------------------------------------------------------*/
/* colors */
/* acf-field */
/* responsive */
/*--------------------------------------------------------------------------------------------
*
* Mixins
*
*--------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------
*
* Global
*
*---------------------------------------------------------------------------------------------*/
#adv-settings .show-field-keys label {
padding: 0 5px;
}
#acf-field-group-fields > .inside,
#acf-field-group-locations > .inside,
#acf-field-group-options > .inside {
padding: 0;
margin: 0;
}
.acf-field p.description {
font-style: normal;
font-size: 12px;
color: #777777;
}
/*---------------------------------------------------------------------------------------------
*
* Postbox: Publish
*
*---------------------------------------------------------------------------------------------*/
#minor-publishing-actions,
#misc-publishing-actions #visibility {
display: none;
}
#minor-publishing {
border-bottom: 0 none;
}
#misc-pub-section {
border-bottom: 0 none;
}
#misc-publishing-actions .misc-pub-section {
border-bottom-color: #F5F5F5;
}
/*---------------------------------------------------------------------------------------------
*
* Postbox: Fields
*
*---------------------------------------------------------------------------------------------*/
#acf-field-group-fields {
border: 0 none;
box-shadow: none;
/* metabox */
/* links */
/* no fields */
/* table header */
/* show keys */
/* fields */
}
#acf-field-group-fields > .handlediv,
#acf-field-group-fields > .hndle {
display: none;
}
#acf-field-group-fields a {
text-decoration: none;
}
#acf-field-group-fields a:active,
#acf-field-group-fields a:focus {
outline: none;
box-shadow: none;
}
#acf-field-group-fields .no-fields-message {
padding: 15px 15px;
background: #fff;
}
#acf-field-group-fields .li-field-order {
width: 20%;
}
#acf-field-group-fields .li-field-label {
width: 30%;
}
#acf-field-group-fields .li-field-name {
width: 25%;
}
#acf-field-group-fields .li-field-type {
width: 25%;
}
#acf-field-group-fields .li-field-key {
display: none;
}
#acf-field-group-fields.show-field-keys .li-field-label,
#acf-field-group-fields.show-field-keys .li-field-name,
#acf-field-group-fields.show-field-keys .li-field-type,
#acf-field-group-fields.show-field-keys .li-field-key {
width: 20%;
}
#acf-field-group-fields.show-field-keys .li-field-key {
display: block;
}
#acf-field-group-fields .acf-field-list-wrap {
border: #DFDFDF solid 1px;
}
#acf-field-group-fields .acf-field-list {
background: #F9F9F9;
margin-top: -1px;
}
/* field object */
.acf-field-object {
border-top: #F0F0F0 solid 1px;
background: #fff;
/* sortable */
/* meta */
/* handle */
/* open */
/* hover */
/* settings */
/* conditional logic */
}
.acf-field-object.ui-sortable-helper {
border-top-color: #fff;
box-shadow: 0 0 0 1px #DFDFDF, 0 1px 4px rgba(0, 0, 0, 0.1);
}
.acf-field-object.ui-sortable-placeholder {
box-shadow: 0 -1px 0 0 #DFDFDF;
visibility: visible !important;
background: #F9F9F9;
border-top-color: transparent;
min-height: 54px;
}
.acf-field-object.ui-sortable-placeholder:after,
.acf-field-object.ui-sortable-placeholder:before {
visibility: hidden;
}
.acf-field-object > .meta {
display: none;
}
.acf-field-object > .handle a {
-webkit-transition: none;
-moz-transition: none;
-o-transition: none;
transition: none;
}
.acf-field-object > .handle li {
padding-top: 10px;
padding-bottom: 10px;
word-wrap: break-word;
}
.acf-field-object > .handle .acf-icon {
margin: 1px 0 0;
cursor: move;
background: transparent;
float: left;
height: 28px;
line-height: 28px;
width: 28px;
font-size: 13px;
color: #444;
position: relative;
z-index: 1;
}
.acf-field-object > .handle strong {
display: block;
padding-bottom: 6px;
font-size: 14px;
line-height: 14px;
min-height: 14px;
}
.acf-field-object > .handle .row-options {
visibility: hidden;
}
.acf-field-object > .handle .row-options a {
margin-right: 4px;
}
.acf-field-object > .handle .row-options a.delete-field {
color: #a00;
}
.acf-field-object > .handle .row-options a.delete-field:hover {
color: #f00;
}
.acf-field-object.open + .acf-field-object {
border-top-color: #E1E1E1;
}
.acf-field-object.open > .handle {
background: #2a9bd9;
border: #2696d3 solid 1px;
text-shadow: #268FBB 0 1px 0;
color: #fff;
position: relative;
margin: -1px -1px 0 -1px;
}
.acf-field-object.open > .handle a {
color: #fff !important;
}
.acf-field-object.open > .handle a:hover {
text-decoration: underline !important;
}
.acf-field-object.open > .handle .acf-icon {
border-color: #fff;
color: #fff;
}
.acf-field-object.open > .handle .acf-required {
color: #fff;
}
.acf-field-object:hover > .handle .row-options {
visibility: visible;
}
.acf-field-object > .settings {
display: none;
width: 100%;
}
.acf-field-object > .settings > .acf-table {
border: none;
}
.acf-field-object .rule-groups {
margin-top: 20px;
}
/*---------------------------------------------------------------------------------------------
*
* Postbox: Locations
*
*---------------------------------------------------------------------------------------------*/
.rule-groups h4 {
margin: 15px 0 5px;
}
.rule-groups .rule-group {
margin: 0 0 5px;
}
.rule-groups .rule-group h4 {
margin: 0 0 3px;
}
.rule-groups .rule-group td.param {
width: 35%;
}
.rule-groups .rule-group td.operator {
width: 20%;
}
.rule-groups .rule-group td.add {
width: 40px;
}
.rule-groups .rule-group td.remove {
width: 28px;
vertical-align: middle;
visibility: hidden;
}
.rule-groups .rule-group tr:hover td.remove {
visibility: visible;
}
/* Don't allow user to delete the first field group */
.rule-groups .rule-group:first-child tr:first-child td.remove {
visibility: hidden !important;
}
/*---------------------------------------------------------------------------------------------
*
* Options
*
*---------------------------------------------------------------------------------------------*/
#acf-field-group-options tr[data-name="hide_on_screen"] li {
float: left;
width: 33%;
}
@media (max-width: 1100px) {
#acf-field-group-options tr[data-name="hide_on_screen"] li {
width: 50%;
}
}
/*---------------------------------------------------------------------------------------------
*
* Conditional Logic
*
*---------------------------------------------------------------------------------------------*/
table.conditional-logic-rules {
background: transparent;
border: 0 none;
border-radius: 0;
}
table.conditional-logic-rules tbody td {
background: transparent;
border: 0 none !important;
padding: 5px 2px !important;
}
/*---------------------------------------------------------------------------------------------
*
* Field: Tab
*
*---------------------------------------------------------------------------------------------*/
.acf-field-object-tab .acf-field-setting-name,
.acf-field-object-tab .acf-field-setting-instructions,
.acf-field-object-tab .acf-field-setting-required,
.acf-field-object-tab .acf-field-setting-warning,
.acf-field-object-tab .acf-field-setting-wrapper,
.acf-field-object-accordion .acf-field-setting-name,
.acf-field-object-accordion .acf-field-setting-instructions,
.acf-field-object-accordion .acf-field-setting-required,
.acf-field-object-accordion .acf-field-setting-warning,
.acf-field-object-accordion .acf-field-setting-wrapper {
display: none;
}
.acf-field-object-tab .li-field-name,
.acf-field-object-accordion .li-field-name {
visibility: hidden;
}
.acf-field-object + .acf-field-object-tab:before,
.acf-field-object + .acf-field-object-accordion:before {
display: block;
content: "";
height: 5px;
width: 100%;
background: #f9f9f9;
border-bottom: #f0f0f0 solid 1px;
}
.acf-field-object-tab p:first-child,
.acf-field-object-accordion p:first-child {
margin: 0.5em 0;
}
/*---------------------------------------------------------------------------------------------
*
* Field: Accordion
*
*---------------------------------------------------------------------------------------------*/
.acf-field-object-accordion .acf-field-setting-instructions {
display: table-row;
}
/*---------------------------------------------------------------------------------------------
*
* Field: Message
*
*---------------------------------------------------------------------------------------------*/
.acf-field-object-message tr[data-name="name"],
.acf-field-object-message tr[data-name="instructions"],
.acf-field-object-message tr[data-name="required"] {
display: none !important;
}
.acf-field-object-message .li-field-name {
visibility: hidden;
}
.acf-field-object-message textarea {
height: 175px !important;
}
/*---------------------------------------------------------------------------------------------
*
* Field: Separator
*
*---------------------------------------------------------------------------------------------*/
.acf-field-object-separator tr[data-name="name"],
.acf-field-object-separator tr[data-name="instructions"],
.acf-field-object-separator tr[data-name="required"] {
display: none !important;
}
/*---------------------------------------------------------------------------------------------
*
* Field: Date Picker
*
*---------------------------------------------------------------------------------------------*/
.acf-field-object-date-picker .acf-radio-list li,
.acf-field-object-time-picker .acf-radio-list li,
.acf-field-object-date-time-picker .acf-radio-list li {
line-height: 25px;
}
.acf-field-object-date-picker .acf-radio-list span,
.acf-field-object-time-picker .acf-radio-list span,
.acf-field-object-date-time-picker .acf-radio-list span {
display: inline-block;
min-width: 10em;
}
.acf-field-object-date-picker .acf-radio-list input[type="text"],
.acf-field-object-time-picker .acf-radio-list input[type="text"],
.acf-field-object-date-time-picker .acf-radio-list input[type="text"] {
width: 100px;
}
.acf-field-object-date-time-picker .acf-radio-list span {
min-width: 15em;
}
.acf-field-object-date-time-picker .acf-radio-list input[type="text"] {
width: 200px;
}
/*--------------------------------------------------------------------------------------------
*
* Slug
*
*--------------------------------------------------------------------------------------------*/
#slugdiv .inside {
padding: 12px;
margin: 0;
}
#slugdiv input[type="text"] {
width: 100%;
height: 28px;
font-size: 14px;
}
/*--------------------------------------------------------------------------------------------
*
* RTL
*
*--------------------------------------------------------------------------------------------*/
html[dir="rtl"] .acf-field-object.open > .handle {
margin: -1px -1px 0;
}
html[dir="rtl"] .acf-field-object.open > .handle .acf-icon {
float: right;
}
html[dir="rtl"] .acf-field-object.open > .handle .li-field-order {
padding-left: 0 !important;
padding-right: 15px !important;
}
/*---------------------------------------------------------------------------------------------
*
* Device
*
*---------------------------------------------------------------------------------------------*/
@media only screen and (max-width: 850px) {
tr.acf-field,
td.acf-label,
td.acf-input {
display: block !important;
width: auto !important;
border: 0 none !important;
}
tr.acf-field {
border-top: #ededed solid 1px !important;
margin-bottom: 0 !important;
}
td.acf-label {
background: transparent !important;
padding-bottom: 0 !important;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
Font license info
## Entypo
Copyright (C) 2012 by Daniel Bruce
Author: Daniel Bruce
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://www.entypo.com
## Typicons
(c) Stephen Hutchings 2012
Author: Stephen Hutchings
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://typicons.com/
## Font Awesome
Copyright (C) 2016 by Dave Gandy
Author: Dave Gandy
License: SIL ()
Homepage: http://fortawesome.github.com/Font-Awesome/
## Elusive
Copyright (C) 2013 by Aristeides Stathopoulos
Author: Aristeides Stathopoulos
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://aristeides.com/
## Modern Pictograms
Copyright (c) 2012 by John Caserta. All rights reserved.
Author: John Caserta
License: SIL (http://scripts.sil.org/OFL)
Homepage: http://thedesignoffice.org/project/modern-pictograms/

View File

@@ -0,0 +1,75 @@
This webfont is generated by http://fontello.com open source project.
================================================================================
Please, note, that you should obey original font licenses, used to make this
webfont pack. Details available in LICENSE.txt file.
- Usually, it's enough to publish content of LICENSE.txt file somewhere on your
site in "About" section.
- If your project is open-source, usually, it will be ok to make LICENSE.txt
file publicly available in your repository.
- Fonts, used in Fontello, don't require a clickable link on your site.
But any kind of additional authors crediting is welcome.
================================================================================
Comments on archive content
---------------------------
- /font/* - fonts in different formats
- /css/* - different kinds of css, for all situations. Should be ok with
twitter bootstrap. Also, you can skip <i> style and assign icon classes
directly to text elements, if you don't mind about IE7.
- demo.html - demo file, to show your webfont content
- LICENSE.txt - license info about source fonts, used to build your one.
- config.json - keeps your settings. You can import it back into fontello
anytime, to continue your work
Why so many CSS files ?
-----------------------
Because we like to fit all your needs :)
- basic file, <your_font_name>.css - is usually enough, it contains @font-face
and character code definitions
- *-ie7.css - if you need IE7 support, but still don't wish to put char codes
directly into html
- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face
rules, but still wish to benefit from css generation. That can be very
convenient for automated asset build systems. When you need to update font -
no need to manually edit files, just override old version with archive
content. See fontello source code for examples.
- *-embedded.css - basic css file, but with embedded WOFF font, to avoid
CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain.
We strongly recommend to resolve this issue by `Access-Control-Allow-Origin`
server headers. But if you ok with dirty hack - this file is for you. Note,
that data url moved to separate @font-face to avoid problems with <IE9, when
string is too long.
- animate.css - use it to get ideas about spinner rotation animation.
Attention for server setup
--------------------------
You MUST setup server to reply with proper `mime-types` for font files -
otherwise some browsers will fail to show fonts.
Usually, `apache` already has necessary settings, but `nginx` and other
webservers should be tuned. Here is list of mime types for our file extensions:
- `application/vnd.ms-fontobject` - eot
- `application/x-font-woff` - woff
- `application/x-font-ttf` - ttf
- `image/svg+xml` - svg

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata>
<defs>
<font id="acf" horiz-adv-x="1000" >
<font-face font-family="acf" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="plus" unicode="&#xe800;" d="M550 400q30 0 30-50t-30-50l-210 0 0-210q0-30-50-30t-50 30l0 210-210 0q-30 0-30 50t30 50l210 0 0 210q0 30 50 30t50-30l0-210 210 0z" horiz-adv-x="580" />
<glyph glyph-name="minus" unicode="&#xe801;" d="M550 400q30 0 30-50t-30-50l-520 0q-30 0-30 50t30 50l520 0z" horiz-adv-x="580" />
<glyph glyph-name="cancel" unicode="&#xe802;" d="M452 194q18-18 18-43t-18-43q-18-16-43-16t-43 16l-132 152-132-152q-18-16-43-16t-43 16q-16 18-16 43t16 43l138 156-138 158q-16 18-16 43t16 43q18 16 43 16t43-16l132-152 132 152q18 16 43 16t43-16q18-18 18-43t-18-43l-138-158z" horiz-adv-x="470" />
<glyph glyph-name="pencil" unicode="&#xe803;" d="M938 605q22-22 22-55t-22-55l-570-570q-22-21-60-38t-73-17l-235 0 0 234q0 35 17 74t38 60l570 570q23 22 55 22t55-22z m-794-426l65-64 431 433-64 63z m91-205q14 0 33 8-10 10-27 26t-50 50-56 56l-22 22q-9-21-9-32l0-78 52-52 79 0z m74 40l432 432-63 64-433-431z m469 469l67 67-165 165-67-66z" horiz-adv-x="960" />
<glyph glyph-name="location" unicode="&#xe804;" d="M250 750q104 0 177-73t73-177q0-106-62-243t-126-223l-62-84q-10 12-27 35t-60 89-76 130-60 147-27 149q0 104 73 177t177 73z m0-388q56 0 96 40t40 96-40 95-96 39-95-39-39-95 39-96 95-40z" horiz-adv-x="500" />
<glyph glyph-name="down" unicode="&#xe805;" d="M564 422l-234-224q-18-18-40-18t-40 18l-234 224q-16 16-16 41t16 41q38 38 78 0l196-188 196 188q40 38 78 0 16-16 16-41t-16-41z" horiz-adv-x="580" />
<glyph glyph-name="left" unicode="&#xe806;" d="M242 626q14 16 39 16t41-16q38-36 0-80l-186-196 186-194q38-44 0-80-16-16-40-16t-40 16l-226 236q-16 16-16 38 0 24 16 40 206 214 226 236z" horiz-adv-x="341" />
<glyph glyph-name="right" unicode="&#xe807;" d="M98 626l226-236q16-16 16-40 0-22-16-38l-226-236q-16-16-40-16t-40 16q-36 36 0 80l186 194-186 196q-36 44 0 80 16 16 41 16t39-16z" horiz-adv-x="340" />
<glyph glyph-name="up" unicode="&#xe808;" d="M564 280q16-16 16-41t-16-41q-38-38-78 0l-196 188-196-188q-40-38-78 0-16 16-16 41t16 41l234 224q16 16 40 16t40-16z" horiz-adv-x="580" />
<glyph glyph-name="sync" unicode="&#xe809;" d="M843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-36 90-57t105-20q74 0 139 37t104 99q6 10 30 66 4 13 16 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
<glyph glyph-name="globe" unicode="&#xe80a;" d="M480 830q200 0 340-141t140-339q0-200-140-340t-340-140q-198 0-339 140t-141 340q0 198 141 339t339 141z m410-480q0 132-78 239t-202 149q-18-24-16-32 4-38 18-51t30-7l32 12t20 2q22-24 0-47t-45-56-1-77q34-64 96-64 28-2 43-36t17-66q10-80-14-140-22-44 14-76 86 112 86 250z m-466 404q-112-14-199-84t-127-174q6 0 22-2t28-3 26-4 24-8 12-13q4-12-14-45t-18-61q0-30 38-56t38-46q0-28 8-68t8-44q0-12 36-54t52-42q10 0 11 22t-2 54-3 40q0 32 14 74 12 42 59 70t55 46q16 34 9 61t-17 43-34 28-41 17-37 9-22 4q-16 6-42 7t-36-3-27 11-17 29q0 10 15 27t35 37 28 30q8 14 17 21t22 16 27 21q4 4 25 17t27 23z m-72-794q66-20 128-20 128 0 226 68-26 44-118 34-24-2-65-17t-47-17q-74-16-76-16-12-2-26-14t-22-18z" horiz-adv-x="960" />
<glyph glyph-name="picture" unicode="&#xe80b;" d="M0-68l0 836 1000 0 0-836-1000 0z m76 78l848 0 0 680-848 0 0-680z m90 80l0 59 150 195 102-86 193 291 223-228 0-231-668 0z m0 416q0 37 24 62t62 24q33 0 58-24t24-62q0-33-24-57t-58-25q-37 0-62 25t-24 57z" horiz-adv-x="1000" />
<glyph glyph-name="check" unicode="&#xe80c;" d="M249 0q-34 0-56 28l-180 236q-16 24-12 52t26 46 51 14 47-28l118-154 296 474q16 24 43 30t53-8q24-16 30-43t-8-53l-350-560q-20-32-56-32z" horiz-adv-x="667" />
<glyph glyph-name="dot-3" unicode="&#xe80d;" d="M110 460q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-33-77t-77-33-77 33-33 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z" horiz-adv-x="920" />
<glyph glyph-name="arrow-combo" unicode="&#xe80e;" d="M230 850l230-364-460 0z m0-1000l-230 366 460 0z" horiz-adv-x="460" />
<glyph glyph-name="arrow-down" unicode="&#xe80f;" d="M540 587l-269-473-271 473 540 0z" horiz-adv-x="540" />
<glyph glyph-name="arrow-up" unicode="&#xe810;" d="M0 114l269 473 271-473-540 0z" horiz-adv-x="540" />
<glyph glyph-name="search" unicode="&#xe811;" d="M772 78q30-34 6-62l-46-46q-36-32-68 0l-190 190q-74-42-156-42-128 0-223 95t-95 223 90 219 218 91 224-95 96-223q0-88-46-162z m-678 358q0-88 68-156t156-68 151 63 63 153q0 88-68 155t-156 67-151-63-63-151z" horiz-adv-x="789" />
<glyph glyph-name="link-ext" unicode="&#xf08e;" d="M786 332v-178q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h393q7 0 12-5t5-13v-36q0-8-5-13t-12-5h-393q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v178q0 8 5 13t13 5h36q8 0 13-5t5-13z m214 482v-285q0-15-11-25t-25-11-25 11l-98 98-364-364q-5-6-13-6t-12 6l-64 64q-6 5-6 12t6 13l364 364-98 98q-11 11-11 25t11 25 25 11h285q15 0 25-11t11-25z" horiz-adv-x="1000" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,124 @@
{
"name": "acf",
"css_prefix_text": "acf-icon-",
"css_use_suffix": false,
"hinting": true,
"units_per_em": 1000,
"ascent": 850,
"glyphs": [
{
"uid": "a73c5deb486c8d66249811642e5d719a",
"css": "sync",
"code": 59401,
"src": "fontawesome"
},
{
"uid": "7222571caa5c15f83dcfd447c58d68d9",
"css": "search",
"code": 59409,
"src": "entypo"
},
{
"uid": "14017aae737730faeda4a6fd8fb3a5f0",
"css": "check",
"code": 59404,
"src": "entypo"
},
{
"uid": "c709da589c923ba3c2ad48d9fc563e93",
"css": "cancel",
"code": 59394,
"src": "entypo"
},
{
"uid": "70370693ada58ef0a60fa0984fe8d52a",
"css": "plus",
"code": 59392,
"src": "entypo"
},
{
"uid": "1256e3054823e304d7e452a589cf8bb8",
"css": "minus",
"code": 59393,
"src": "entypo"
},
{
"uid": "a42b598e4298f3319b25a2702a02e7ff",
"css": "location",
"code": 59396,
"src": "entypo"
},
{
"uid": "0a3192de65a73ca1501b073ad601f87d",
"css": "arrow-combo",
"code": 59406,
"src": "entypo"
},
{
"uid": "8704cd847a47b64265b8bb110c8b4d62",
"css": "down",
"code": 59397,
"src": "entypo"
},
{
"uid": "c311c48d79488965b0fab7f9cd12b6b5",
"css": "left",
"code": 59398,
"src": "entypo"
},
{
"uid": "749e7d90a9182938180f1d2d8c33584e",
"css": "right",
"code": 59399,
"src": "entypo"
},
{
"uid": "9c7ff134960bb5a82404e4aeaab366d9",
"css": "up",
"code": 59400,
"src": "entypo"
},
{
"uid": "6a12c2b74456ea21cc984e11dec227a1",
"css": "globe",
"code": 59402,
"src": "entypo"
},
{
"uid": "d10920db2e79c997c5e783279291970c",
"css": "dot-3",
"code": 59405,
"src": "entypo"
},
{
"uid": "1e77a2yvsq3owssduo2lcgsiven57iv5",
"css": "pencil",
"code": 59395,
"src": "typicons"
},
{
"uid": "8ax1xqcbzz1hobyd4i7f0unwib1bztip",
"css": "arrow-down",
"code": 59407,
"src": "modernpics"
},
{
"uid": "6ipws8y9gej6vbloufvhi5qux7rluf64",
"css": "arrow-up",
"code": 59408,
"src": "modernpics"
},
{
"uid": "a1be363d4de9be39857893d4134f6215",
"css": "picture",
"code": 59403,
"src": "elusive"
},
{
"uid": "e15f0d620a7897e2035c18c80142f6d9",
"css": "link-ext",
"code": 61582,
"src": "fontawesome"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,650 @@
/*! jQuery UI - v1.11.4 - 2016-05-31
* http://jqueryui.com
* Includes: core.css, datepicker.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=%22Open%20Sans%22%2C%E2%80%8B%20sans-serif&fsDefault=14px&fwDefault=normal&cornerRadius=3&bgColorHeader=%23ffffff&bgTextureHeader=highlight_soft&borderColorHeader=%23ffffff&fcHeader=%23222222&iconColorHeader=%23DDDDDD&bgColorContent=%23ffffff&bgTextureContent=flat&borderColorContent=%23E1E1E1&fcContent=%23444444&iconColorContent=%23444444&bgColorDefault=%23F9F9F9&bgTextureDefault=flat&borderColorDefault=%23F0F0F0&fcDefault=%23444444&iconColorDefault=%23444444&bgColorHover=%2398b7e8&bgTextureHover=flat&borderColorHover=%2398b7e8&fcHover=%23ffffff&iconColorHover=%23ffffff&bgColorActive=%233875d7&bgTextureActive=flat&borderColorActive=%233875d7&fcActive=%23ffffff&iconColorActive=%23ffffff&bgColorHighlight=%23ffffff&bgTextureHighlight=flat&borderColorHighlight=%23aaaaaa&fcHighlight=%23444444&iconColorHighlight=%23444444&bgColorError=%23E14D43&bgTextureError=flat&borderColorError=%23E14D43&fcError=%23ffffff&iconColorError=%23ffffff&bgColorOverlay=%23ffffff&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px&bgImgOpacityHeader=0&bgImgOpacityContent=&bgImgOpacityDefault=0&bgImgOpacityHover=0&bgImgOpacityActive=0&bgImgOpacityHighlight=0&bgImgOpacityError=0
* Copyright jQuery Foundation and other contributors; Licensed MIT */
/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
display: none;
}
.ui-helper-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.ui-helper-reset {
margin: 0;
padding: 0;
border: 0;
outline: 0;
line-height: 1.3;
text-decoration: none;
font-size: 100%;
list-style: none;
}
.ui-helper-clearfix:before,
.ui-helper-clearfix:after {
content: "";
display: table;
border-collapse: collapse;
}
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-clearfix {
min-height: 0; /* support: IE7 */
}
.ui-helper-zfix {
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
opacity: 0;
filter:Alpha(Opacity=0); /* support: IE8 */
}
.ui-front {
z-index: 100;
}
/* Interaction Cues
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
display: block;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ui-datepicker {
width: 17em;
padding: .2em .2em 0;
display: none;
}
.ui-datepicker .ui-datepicker-header {
position: relative;
padding: .2em 0;
}
.ui-datepicker .ui-datepicker-prev,
.ui-datepicker .ui-datepicker-next {
position: absolute;
top: 2px;
width: 1.8em;
height: 1.8em;
}
.ui-datepicker .ui-datepicker-prev-hover,
.ui-datepicker .ui-datepicker-next-hover {
top: 1px;
}
.ui-datepicker .ui-datepicker-prev {
left: 2px;
}
.ui-datepicker .ui-datepicker-next {
right: 2px;
}
.ui-datepicker .ui-datepicker-prev-hover {
left: 1px;
}
.ui-datepicker .ui-datepicker-next-hover {
right: 1px;
}
.ui-datepicker .ui-datepicker-prev span,
.ui-datepicker .ui-datepicker-next span {
display: block;
position: absolute;
left: 50%;
margin-left: -8px;
top: 50%;
margin-top: -8px;
}
.ui-datepicker .ui-datepicker-title {
margin: 0 2.3em;
line-height: 1.8em;
text-align: center;
}
.ui-datepicker .ui-datepicker-title select {
font-size: 1em;
margin: 1px 0;
}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year {
width: 45%;
}
.ui-datepicker table {
width: 100%;
font-size: .9em;
border-collapse: collapse;
margin: 0 0 .4em;
}
.ui-datepicker th {
padding: .7em .3em;
text-align: center;
font-weight: bold;
border: 0;
}
.ui-datepicker td {
border: 0;
padding: 1px;
}
.ui-datepicker td span,
.ui-datepicker td a {
display: block;
padding: .2em;
text-align: right;
text-decoration: none;
}
.ui-datepicker .ui-datepicker-buttonpane {
background-image: none;
margin: .7em 0 0 0;
padding: 0 .2em;
border-left: 0;
border-right: 0;
border-bottom: 0;
}
.ui-datepicker .ui-datepicker-buttonpane button {
float: right;
margin: .5em .2em .4em;
cursor: pointer;
padding: .2em .6em .3em .6em;
width: auto;
overflow: visible;
}
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
float: left;
}
/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi {
width: auto;
}
.ui-datepicker-multi .ui-datepicker-group {
float: left;
}
.ui-datepicker-multi .ui-datepicker-group table {
width: 95%;
margin: 0 auto .4em;
}
.ui-datepicker-multi-2 .ui-datepicker-group {
width: 50%;
}
.ui-datepicker-multi-3 .ui-datepicker-group {
width: 33.3%;
}
.ui-datepicker-multi-4 .ui-datepicker-group {
width: 25%;
}
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
border-left-width: 0;
}
.ui-datepicker-multi .ui-datepicker-buttonpane {
clear: left;
}
.ui-datepicker-row-break {
clear: both;
width: 100%;
font-size: 0;
}
/* RTL support */
.ui-datepicker-rtl {
direction: rtl;
}
.ui-datepicker-rtl .ui-datepicker-prev {
right: 2px;
left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next {
left: 2px;
right: auto;
}
.ui-datepicker-rtl .ui-datepicker-prev:hover {
right: 1px;
left: auto;
}
.ui-datepicker-rtl .ui-datepicker-next:hover {
left: 1px;
right: auto;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane {
clear: right;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
float: left;
}
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
.ui-datepicker-rtl .ui-datepicker-group {
float: right;
}
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
border-right-width: 0;
border-left-width: 1px;
}
/* Component containers
----------------------------------*/
.acf-ui-datepicker .ui-widget {
font-family: inherit;
font-size: 14px;
}
.acf-ui-datepicker .ui-widget .ui-widget {
font-size: 1em;
}
.acf-ui-datepicker .ui-widget input,
.acf-ui-datepicker .ui-widget select,
.acf-ui-datepicker .ui-widget textarea,
.acf-ui-datepicker .ui-widget button {
font-family: inherit;
font-size: 1em;
}
.acf-ui-datepicker .ui-widget-content {
border: 1px solid #E1E1E1;
background: #ffffff;
color: #444444;
}
.acf-ui-datepicker .ui-widget-content a {
color: #444444;
}
.acf-ui-datepicker .ui-widget-header {
border: 1px solid #ffffff;
background: #ffffff url("images/ui-bg_highlight-soft_0_ffffff_1x100.png") 50% 50% repeat-x;
color: #222222;
font-weight: bold;
}
.acf-ui-datepicker .ui-widget-header a {
color: #222222;
}
/* Interaction states
----------------------------------*/
.acf-ui-datepicker .ui-state-default,
.acf-ui-datepicker .ui-widget-content .ui-state-default,
.acf-ui-datepicker .ui-widget-header .ui-state-default {
border: 1px solid #F0F0F0;
background: #F9F9F9;
font-weight: normal;
color: #444444;
}
.acf-ui-datepicker .ui-state-default a,
.acf-ui-datepicker .ui-state-default a:link,
.acf-ui-datepicker .ui-state-default a:visited {
color: #444444;
text-decoration: none;
}
.acf-ui-datepicker .ui-state-hover,
.acf-ui-datepicker .ui-widget-content .ui-state-hover,
.acf-ui-datepicker .ui-widget-header .ui-state-hover,
.acf-ui-datepicker .ui-state-focus,
.acf-ui-datepicker .ui-widget-content .ui-state-focus,
.acf-ui-datepicker .ui-widget-header .ui-state-focus {
border: 1px solid #98b7e8;
background: #98b7e8;
font-weight: normal;
color: #ffffff;
}
.acf-ui-datepicker .ui-state-hover a,
.acf-ui-datepicker .ui-state-hover a:hover,
.acf-ui-datepicker .ui-state-hover a:link,
.acf-ui-datepicker .ui-state-hover a:visited,
.acf-ui-datepicker .ui-state-focus a,
.acf-ui-datepicker .ui-state-focus a:hover,
.acf-ui-datepicker .ui-state-focus a:link,
.acf-ui-datepicker .ui-state-focus a:visited {
color: #ffffff;
text-decoration: none;
}
.acf-ui-datepicker .ui-state-active,
.acf-ui-datepicker .ui-widget-content .ui-state-active,
.acf-ui-datepicker .ui-widget-header .ui-state-active {
border: 1px solid #3875d7;
background: #3875d7;
font-weight: normal;
color: #ffffff;
}
.acf-ui-datepicker .ui-state-active a,
.acf-ui-datepicker .ui-state-active a:link,
.acf-ui-datepicker .ui-state-active a:visited {
color: #ffffff;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.acf-ui-datepicker .ui-state-highlight,
.acf-ui-datepicker .ui-widget-content .ui-state-highlight,
.acf-ui-datepicker .ui-widget-header .ui-state-highlight {
border: 1px solid #aaaaaa;
background: #ffffff;
color: #444444;
}
.acf-ui-datepicker .ui-state-highlight a,
.acf-ui-datepicker .ui-widget-content .ui-state-highlight a,
.acf-ui-datepicker .ui-widget-header .ui-state-highlight a {
color: #444444;
}
.acf-ui-datepicker .ui-state-error,
.acf-ui-datepicker .ui-widget-content .ui-state-error,
.acf-ui-datepicker .ui-widget-header .ui-state-error {
border: 1px solid #E14D43;
background: #E14D43;
color: #ffffff;
}
.acf-ui-datepicker .ui-state-error a,
.acf-ui-datepicker .ui-widget-content .ui-state-error a,
.acf-ui-datepicker .ui-widget-header .ui-state-error a {
color: #ffffff;
}
.acf-ui-datepicker .ui-state-error-text,
.acf-ui-datepicker .ui-widget-content .ui-state-error-text,
.acf-ui-datepicker .ui-widget-header .ui-state-error-text {
color: #ffffff;
}
.acf-ui-datepicker .ui-priority-primary,
.acf-ui-datepicker .ui-widget-content .ui-priority-primary,
.acf-ui-datepicker .ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.acf-ui-datepicker .ui-priority-secondary,
.acf-ui-datepicker .ui-widget-content .ui-priority-secondary,
.acf-ui-datepicker .ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.acf-ui-datepicker .ui-state-disabled,
.acf-ui-datepicker .ui-widget-content .ui-state-disabled,
.acf-ui-datepicker .ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.acf-ui-datepicker .ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.acf-ui-datepicker .ui-icon {
width: 16px;
height: 16px;
}
.acf-ui-datepicker .ui-icon,
.acf-ui-datepicker .ui-widget-content .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.acf-ui-datepicker .ui-widget-header .ui-icon {
background-image: url("images/ui-icons_DDDDDD_256x240.png");
}
.acf-ui-datepicker .ui-state-default .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.acf-ui-datepicker .ui-state-hover .ui-icon,
.acf-ui-datepicker .ui-state-focus .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.acf-ui-datepicker .ui-state-active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.acf-ui-datepicker .ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.acf-ui-datepicker .ui-state-error .ui-icon,
.acf-ui-datepicker .ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
/* positioning */
.acf-ui-datepicker .ui-icon-blank { background-position: 16px 16px; }
.acf-ui-datepicker .ui-icon-carat-1-n { background-position: 0 0; }
.acf-ui-datepicker .ui-icon-carat-1-ne { background-position: -16px 0; }
.acf-ui-datepicker .ui-icon-carat-1-e { background-position: -32px 0; }
.acf-ui-datepicker .ui-icon-carat-1-se { background-position: -48px 0; }
.acf-ui-datepicker .ui-icon-carat-1-s { background-position: -64px 0; }
.acf-ui-datepicker .ui-icon-carat-1-sw { background-position: -80px 0; }
.acf-ui-datepicker .ui-icon-carat-1-w { background-position: -96px 0; }
.acf-ui-datepicker .ui-icon-carat-1-nw { background-position: -112px 0; }
.acf-ui-datepicker .ui-icon-carat-2-n-s { background-position: -128px 0; }
.acf-ui-datepicker .ui-icon-carat-2-e-w { background-position: -144px 0; }
.acf-ui-datepicker .ui-icon-triangle-1-n { background-position: 0 -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-ne { background-position: -16px -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-e { background-position: -32px -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-se { background-position: -48px -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-s { background-position: -64px -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-sw { background-position: -80px -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-w { background-position: -96px -16px; }
.acf-ui-datepicker .ui-icon-triangle-1-nw { background-position: -112px -16px; }
.acf-ui-datepicker .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.acf-ui-datepicker .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.acf-ui-datepicker .ui-icon-arrow-1-n { background-position: 0 -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-ne { background-position: -16px -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-e { background-position: -32px -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-se { background-position: -48px -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-s { background-position: -64px -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-sw { background-position: -80px -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-w { background-position: -96px -32px; }
.acf-ui-datepicker .ui-icon-arrow-1-nw { background-position: -112px -32px; }
.acf-ui-datepicker .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.acf-ui-datepicker .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.acf-ui-datepicker .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.acf-ui-datepicker .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.acf-ui-datepicker .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.acf-ui-datepicker .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.acf-ui-datepicker .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.acf-ui-datepicker .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.acf-ui-datepicker .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.acf-ui-datepicker .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.acf-ui-datepicker .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.acf-ui-datepicker .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.acf-ui-datepicker .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.acf-ui-datepicker .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.acf-ui-datepicker .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.acf-ui-datepicker .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.acf-ui-datepicker .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.acf-ui-datepicker .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.acf-ui-datepicker .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.acf-ui-datepicker .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.acf-ui-datepicker .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.acf-ui-datepicker .ui-icon-arrow-4 { background-position: 0 -80px; }
.acf-ui-datepicker .ui-icon-arrow-4-diag { background-position: -16px -80px; }
.acf-ui-datepicker .ui-icon-extlink { background-position: -32px -80px; }
.acf-ui-datepicker .ui-icon-newwin { background-position: -48px -80px; }
.acf-ui-datepicker .ui-icon-refresh { background-position: -64px -80px; }
.acf-ui-datepicker .ui-icon-shuffle { background-position: -80px -80px; }
.acf-ui-datepicker .ui-icon-transfer-e-w { background-position: -96px -80px; }
.acf-ui-datepicker .ui-icon-transferthick-e-w { background-position: -112px -80px; }
.acf-ui-datepicker .ui-icon-folder-collapsed { background-position: 0 -96px; }
.acf-ui-datepicker .ui-icon-folder-open { background-position: -16px -96px; }
.acf-ui-datepicker .ui-icon-document { background-position: -32px -96px; }
.acf-ui-datepicker .ui-icon-document-b { background-position: -48px -96px; }
.acf-ui-datepicker .ui-icon-note { background-position: -64px -96px; }
.acf-ui-datepicker .ui-icon-mail-closed { background-position: -80px -96px; }
.acf-ui-datepicker .ui-icon-mail-open { background-position: -96px -96px; }
.acf-ui-datepicker .ui-icon-suitcase { background-position: -112px -96px; }
.acf-ui-datepicker .ui-icon-comment { background-position: -128px -96px; }
.acf-ui-datepicker .ui-icon-person { background-position: -144px -96px; }
.acf-ui-datepicker .ui-icon-print { background-position: -160px -96px; }
.acf-ui-datepicker .ui-icon-trash { background-position: -176px -96px; }
.acf-ui-datepicker .ui-icon-locked { background-position: -192px -96px; }
.acf-ui-datepicker .ui-icon-unlocked { background-position: -208px -96px; }
.acf-ui-datepicker .ui-icon-bookmark { background-position: -224px -96px; }
.acf-ui-datepicker .ui-icon-tag { background-position: -240px -96px; }
.acf-ui-datepicker .ui-icon-home { background-position: 0 -112px; }
.acf-ui-datepicker .ui-icon-flag { background-position: -16px -112px; }
.acf-ui-datepicker .ui-icon-calendar { background-position: -32px -112px; }
.acf-ui-datepicker .ui-icon-cart { background-position: -48px -112px; }
.acf-ui-datepicker .ui-icon-pencil { background-position: -64px -112px; }
.acf-ui-datepicker .ui-icon-clock { background-position: -80px -112px; }
.acf-ui-datepicker .ui-icon-disk { background-position: -96px -112px; }
.acf-ui-datepicker .ui-icon-calculator { background-position: -112px -112px; }
.acf-ui-datepicker .ui-icon-zoomin { background-position: -128px -112px; }
.acf-ui-datepicker .ui-icon-zoomout { background-position: -144px -112px; }
.acf-ui-datepicker .ui-icon-search { background-position: -160px -112px; }
.acf-ui-datepicker .ui-icon-wrench { background-position: -176px -112px; }
.acf-ui-datepicker .ui-icon-gear { background-position: -192px -112px; }
.acf-ui-datepicker .ui-icon-heart { background-position: -208px -112px; }
.acf-ui-datepicker .ui-icon-star { background-position: -224px -112px; }
.acf-ui-datepicker .ui-icon-link { background-position: -240px -112px; }
.acf-ui-datepicker .ui-icon-cancel { background-position: 0 -128px; }
.acf-ui-datepicker .ui-icon-plus { background-position: -16px -128px; }
.acf-ui-datepicker .ui-icon-plusthick { background-position: -32px -128px; }
.acf-ui-datepicker .ui-icon-minus { background-position: -48px -128px; }
.acf-ui-datepicker .ui-icon-minusthick { background-position: -64px -128px; }
.acf-ui-datepicker .ui-icon-close { background-position: -80px -128px; }
.acf-ui-datepicker .ui-icon-closethick { background-position: -96px -128px; }
.acf-ui-datepicker .ui-icon-key { background-position: -112px -128px; }
.acf-ui-datepicker .ui-icon-lightbulb { background-position: -128px -128px; }
.acf-ui-datepicker .ui-icon-scissors { background-position: -144px -128px; }
.acf-ui-datepicker .ui-icon-clipboard { background-position: -160px -128px; }
.acf-ui-datepicker .ui-icon-copy { background-position: -176px -128px; }
.acf-ui-datepicker .ui-icon-contact { background-position: -192px -128px; }
.acf-ui-datepicker .ui-icon-image { background-position: -208px -128px; }
.acf-ui-datepicker .ui-icon-video { background-position: -224px -128px; }
.acf-ui-datepicker .ui-icon-script { background-position: -240px -128px; }
.acf-ui-datepicker .ui-icon-alert { background-position: 0 -144px; }
.acf-ui-datepicker .ui-icon-info { background-position: -16px -144px; }
.acf-ui-datepicker .ui-icon-notice { background-position: -32px -144px; }
.acf-ui-datepicker .ui-icon-help { background-position: -48px -144px; }
.acf-ui-datepicker .ui-icon-check { background-position: -64px -144px; }
.acf-ui-datepicker .ui-icon-bullet { background-position: -80px -144px; }
.acf-ui-datepicker .ui-icon-radio-on { background-position: -96px -144px; }
.acf-ui-datepicker .ui-icon-radio-off { background-position: -112px -144px; }
.acf-ui-datepicker .ui-icon-pin-w { background-position: -128px -144px; }
.acf-ui-datepicker .ui-icon-pin-s { background-position: -144px -144px; }
.acf-ui-datepicker .ui-icon-play { background-position: 0 -160px; }
.acf-ui-datepicker .ui-icon-pause { background-position: -16px -160px; }
.acf-ui-datepicker .ui-icon-seek-next { background-position: -32px -160px; }
.acf-ui-datepicker .ui-icon-seek-prev { background-position: -48px -160px; }
.acf-ui-datepicker .ui-icon-seek-end { background-position: -64px -160px; }
.acf-ui-datepicker .ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.acf-ui-datepicker .ui-icon-seek-first { background-position: -80px -160px; }
.acf-ui-datepicker .ui-icon-stop { background-position: -96px -160px; }
.acf-ui-datepicker .ui-icon-eject { background-position: -112px -160px; }
.acf-ui-datepicker .ui-icon-volume-off { background-position: -128px -160px; }
.acf-ui-datepicker .ui-icon-volume-on { background-position: -144px -160px; }
.acf-ui-datepicker .ui-icon-power { background-position: 0 -176px; }
.acf-ui-datepicker .ui-icon-signal-diag { background-position: -16px -176px; }
.acf-ui-datepicker .ui-icon-signal { background-position: -32px -176px; }
.acf-ui-datepicker .ui-icon-battery-0 { background-position: -48px -176px; }
.acf-ui-datepicker .ui-icon-battery-1 { background-position: -64px -176px; }
.acf-ui-datepicker .ui-icon-battery-2 { background-position: -80px -176px; }
.acf-ui-datepicker .ui-icon-battery-3 { background-position: -96px -176px; }
.acf-ui-datepicker .ui-icon-circle-plus { background-position: 0 -192px; }
.acf-ui-datepicker .ui-icon-circle-minus { background-position: -16px -192px; }
.acf-ui-datepicker .ui-icon-circle-close { background-position: -32px -192px; }
.acf-ui-datepicker .ui-icon-circle-triangle-e { background-position: -48px -192px; }
.acf-ui-datepicker .ui-icon-circle-triangle-s { background-position: -64px -192px; }
.acf-ui-datepicker .ui-icon-circle-triangle-w { background-position: -80px -192px; }
.acf-ui-datepicker .ui-icon-circle-triangle-n { background-position: -96px -192px; }
.acf-ui-datepicker .ui-icon-circle-arrow-e { background-position: -112px -192px; }
.acf-ui-datepicker .ui-icon-circle-arrow-s { background-position: -128px -192px; }
.acf-ui-datepicker .ui-icon-circle-arrow-w { background-position: -144px -192px; }
.acf-ui-datepicker .ui-icon-circle-arrow-n { background-position: -160px -192px; }
.acf-ui-datepicker .ui-icon-circle-zoomin { background-position: -176px -192px; }
.acf-ui-datepicker .ui-icon-circle-zoomout { background-position: -192px -192px; }
.acf-ui-datepicker .ui-icon-circle-check { background-position: -208px -192px; }
.acf-ui-datepicker .ui-icon-circlesmall-plus { background-position: 0 -208px; }
.acf-ui-datepicker .ui-icon-circlesmall-minus { background-position: -16px -208px; }
.acf-ui-datepicker .ui-icon-circlesmall-close { background-position: -32px -208px; }
.acf-ui-datepicker .ui-icon-squaresmall-plus { background-position: -48px -208px; }
.acf-ui-datepicker .ui-icon-squaresmall-minus { background-position: -64px -208px; }
.acf-ui-datepicker .ui-icon-squaresmall-close { background-position: -80px -208px; }
.acf-ui-datepicker .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.acf-ui-datepicker .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.acf-ui-datepicker .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.acf-ui-datepicker .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.acf-ui-datepicker .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.acf-ui-datepicker .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.acf-ui-datepicker .ui-corner-all,
.acf-ui-datepicker .ui-corner-top,
.acf-ui-datepicker .ui-corner-left,
.acf-ui-datepicker .ui-corner-tl {
border-top-left-radius: 3;
}
.acf-ui-datepicker .ui-corner-all,
.acf-ui-datepicker .ui-corner-top,
.acf-ui-datepicker .ui-corner-right,
.acf-ui-datepicker .ui-corner-tr {
border-top-right-radius: 3;
}
.acf-ui-datepicker .ui-corner-all,
.acf-ui-datepicker .ui-corner-bottom,
.acf-ui-datepicker .ui-corner-left,
.acf-ui-datepicker .ui-corner-bl {
border-bottom-left-radius: 3;
}
.acf-ui-datepicker .ui-corner-all,
.acf-ui-datepicker .ui-corner-bottom,
.acf-ui-datepicker .ui-corner-right,
.acf-ui-datepicker .ui-corner-br {
border-bottom-right-radius: 3;
}
/* Overlays */
.acf-ui-datepicker .ui-widget-overlay {
background: #ffffff;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.acf-ui-datepicker .ui-widget-shadow {
margin: -8px 0 0 -8px;
padding: 8px;
background: #aaaaaa;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
border-radius: 8px;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,704 @@
/*
Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
*/
.select2-container {
margin: 0;
position: relative;
display: inline-block;
/* inline-block for ie7 */
zoom: 1;
*display: inline;
vertical-align: middle;
}
.select2-container,
.select2-drop,
.select2-search,
.select2-search input {
/*
Force border-box so that % widths fit the parent
container without overlap because of margin/padding.
More Info : http://www.quirksmode.org/css/box.html
*/
-webkit-box-sizing: border-box; /* webkit */
-moz-box-sizing: border-box; /* firefox */
box-sizing: border-box; /* css3 */
}
.select2-container .select2-choice {
display: block;
height: 26px;
padding: 0 0 0 8px;
overflow: hidden;
position: relative;
border: 1px solid #aaa;
white-space: nowrap;
line-height: 26px;
color: #444;
text-decoration: none;
border-radius: 4px;
background-clip: padding-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #fff;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
background-image: linear-gradient(to top, #eee 0%, #fff 50%);
}
html[dir="rtl"] .select2-container .select2-choice {
padding: 0 8px 0 0;
}
.select2-container.select2-drop-above .select2-choice {
border-bottom-color: #aaa;
border-radius: 0 0 4px 4px;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
}
.select2-container.select2-allowclear .select2-choice .select2-chosen {
margin-right: 42px;
}
.select2-container .select2-choice > .select2-chosen {
margin-right: 26px;
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
float: none;
width: auto;
}
html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
margin-left: 26px;
margin-right: 0;
}
.select2-container .select2-choice abbr {
display: none;
width: 12px;
height: 12px;
position: absolute;
right: 24px;
top: 8px;
font-size: 1px;
text-decoration: none;
border: 0;
background: url('select2.png') right top no-repeat;
cursor: pointer;
outline: 0;
}
.select2-container.select2-allowclear .select2-choice abbr {
display: inline-block;
}
.select2-container .select2-choice abbr:hover {
background-position: right -11px;
cursor: pointer;
}
.select2-drop-mask {
border: 0;
margin: 0;
padding: 0;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 9998;
/* styles required for IE to work */
background-color: #fff;
filter: alpha(opacity=0);
}
.select2-drop {
width: 100%;
margin-top: -1px;
position: absolute;
z-index: 9999;
top: 100%;
background: #fff;
color: #000;
border: 1px solid #aaa;
border-top: 0;
border-radius: 0 0 4px 4px;
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
}
.select2-drop.select2-drop-above {
margin-top: 1px;
border-top: 1px solid #aaa;
border-bottom: 0;
border-radius: 4px 4px 0 0;
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
}
.select2-drop-active {
border: 1px solid #5897fb;
border-top: none;
}
.select2-drop.select2-drop-above.select2-drop-active {
border-top: 1px solid #5897fb;
}
.select2-drop-auto-width {
border-top: 1px solid #aaa;
width: auto;
}
.select2-drop-auto-width .select2-search {
padding-top: 4px;
}
.select2-container .select2-choice .select2-arrow {
display: inline-block;
width: 18px;
height: 100%;
position: absolute;
right: 0;
top: 0;
border-left: 1px solid #aaa;
border-radius: 0 4px 4px 0;
background-clip: padding-box;
background: #ccc;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
}
html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
left: 0;
right: auto;
border-left: none;
border-right: 1px solid #aaa;
border-radius: 4px 0 0 4px;
}
.select2-container .select2-choice .select2-arrow b {
display: block;
width: 100%;
height: 100%;
background: url('select2.png') no-repeat 0 1px;
}
html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
background-position: 2px 1px;
}
.select2-search {
display: inline-block;
width: 100%;
min-height: 26px;
margin: 0;
padding-left: 4px;
padding-right: 4px;
position: relative;
z-index: 10000;
white-space: nowrap;
}
.select2-search input {
width: 100%;
height: auto !important;
min-height: 26px;
padding: 4px 20px 4px 5px;
margin: 0;
outline: 0;
font-family: sans-serif;
font-size: 1em;
border: 1px solid #aaa;
border-radius: 0;
-webkit-box-shadow: none;
box-shadow: none;
background: #fff url('select2.png') no-repeat 100% -22px;
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
}
html[dir="rtl"] .select2-search input {
padding: 4px 5px 4px 20px;
background: #fff url('select2.png') no-repeat -37px -22px;
background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
}
.select2-drop.select2-drop-above .select2-search input {
margin-top: 4px;
}
.select2-search input.select2-active {
background: #fff url('select2-spinner.gif') no-repeat 100%;
background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
}
.select2-container-active .select2-choice,
.select2-container-active .select2-choices {
border: 1px solid #5897fb;
outline: none;
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
}
.select2-dropdown-open .select2-choice {
border-bottom-color: transparent;
-webkit-box-shadow: 0 1px 0 #fff inset;
box-shadow: 0 1px 0 #fff inset;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
background-color: #eee;
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
background-image: linear-gradient(to top, #fff 0%, #eee 50%);
}
.select2-dropdown-open.select2-drop-above .select2-choice,
.select2-dropdown-open.select2-drop-above .select2-choices {
border: 1px solid #5897fb;
border-top-color: transparent;
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
}
.select2-dropdown-open .select2-choice .select2-arrow {
background: transparent;
border-left: none;
filter: none;
}
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
border-right: none;
}
.select2-dropdown-open .select2-choice .select2-arrow b {
background-position: -18px 1px;
}
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
background-position: -16px 1px;
}
.select2-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
/* results */
.select2-results {
max-height: 200px;
padding: 0 0 0 4px;
margin: 4px 4px 4px 0;
position: relative;
overflow-x: hidden;
overflow-y: auto;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
html[dir="rtl"] .select2-results {
padding: 0 4px 0 0;
margin: 4px 0 4px 4px;
}
.select2-results ul.select2-result-sub {
margin: 0;
padding-left: 0;
}
.select2-results li {
list-style: none;
display: list-item;
background-image: none;
}
.select2-results li.select2-result-with-children > .select2-result-label {
font-weight: bold;
}
.select2-results .select2-result-label {
padding: 3px 7px 4px;
margin: 0;
cursor: pointer;
min-height: 1em;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.select2-results-dept-1 .select2-result-label { padding-left: 20px }
.select2-results-dept-2 .select2-result-label { padding-left: 40px }
.select2-results-dept-3 .select2-result-label { padding-left: 60px }
.select2-results-dept-4 .select2-result-label { padding-left: 80px }
.select2-results-dept-5 .select2-result-label { padding-left: 100px }
.select2-results-dept-6 .select2-result-label { padding-left: 110px }
.select2-results-dept-7 .select2-result-label { padding-left: 120px }
.select2-results .select2-highlighted {
background: #3875d7;
color: #fff;
}
.select2-results li em {
background: #feffde;
font-style: normal;
}
.select2-results .select2-highlighted em {
background: transparent;
}
.select2-results .select2-highlighted ul {
background: #fff;
color: #000;
}
.select2-results .select2-no-results,
.select2-results .select2-searching,
.select2-results .select2-ajax-error,
.select2-results .select2-selection-limit {
background: #f4f4f4;
display: list-item;
padding-left: 5px;
}
/*
disabled look for disabled choices in the results dropdown
*/
.select2-results .select2-disabled.select2-highlighted {
color: #666;
background: #f4f4f4;
display: list-item;
cursor: default;
}
.select2-results .select2-disabled {
background: #f4f4f4;
display: list-item;
cursor: default;
}
.select2-results .select2-selected {
display: none;
}
.select2-more-results.select2-active {
background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
}
.select2-results .select2-ajax-error {
background: rgba(255, 50, 50, .2);
}
.select2-more-results {
background: #f4f4f4;
display: list-item;
}
/* disabled styles */
.select2-container.select2-container-disabled .select2-choice {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.select2-container.select2-container-disabled .select2-choice .select2-arrow {
background-color: #f4f4f4;
background-image: none;
border-left: 0;
}
.select2-container.select2-container-disabled .select2-choice abbr {
display: none;
}
/* multiselect */
.select2-container-multi .select2-choices {
height: auto !important;
height: 1%;
margin: 0;
padding: 0 5px 0 0;
position: relative;
border: 1px solid #aaa;
cursor: text;
overflow: hidden;
background-color: #fff;
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
}
html[dir="rtl"] .select2-container-multi .select2-choices {
padding: 0 0 0 5px;
}
.select2-locked {
padding: 3px 5px 3px 5px !important;
}
.select2-container-multi .select2-choices {
min-height: 26px;
}
.select2-container-multi.select2-container-active .select2-choices {
border: 1px solid #5897fb;
outline: none;
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
}
.select2-container-multi .select2-choices li {
float: left;
list-style: none;
}
html[dir="rtl"] .select2-container-multi .select2-choices li
{
float: right;
}
.select2-container-multi .select2-choices .select2-search-field {
margin: 0;
padding: 0;
white-space: nowrap;
}
.select2-container-multi .select2-choices .select2-search-field input {
padding: 5px;
margin: 1px 0;
font-family: sans-serif;
font-size: 100%;
color: #666;
outline: 0;
border: 0;
-webkit-box-shadow: none;
box-shadow: none;
background: transparent !important;
}
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
background: #fff url('select2-spinner.gif') no-repeat 100% !important;
}
.select2-default {
color: #999 !important;
}
.select2-container-multi .select2-choices .select2-search-choice {
padding: 3px 5px 3px 18px;
margin: 3px 0 3px 5px;
position: relative;
line-height: 13px;
color: #333;
cursor: default;
border: 1px solid #aaaaaa;
border-radius: 3px;
-webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
background-clip: padding-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-color: #e4e4e4;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
}
html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
{
margin: 3px 5px 3px 0;
padding: 3px 18px 3px 5px;
}
.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
cursor: default;
}
.select2-container-multi .select2-choices .select2-search-choice-focus {
background: #d4d4d4;
}
.select2-search-choice-close {
display: block;
width: 12px;
height: 13px;
position: absolute;
right: 3px;
top: 4px;
font-size: 1px;
outline: none;
background: url('select2.png') right top no-repeat;
}
html[dir="rtl"] .select2-search-choice-close {
right: auto;
left: 3px;
}
.select2-container-multi .select2-search-choice-close {
left: 3px;
}
html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
left: auto;
right: 2px;
}
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
background-position: right -11px;
}
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
background-position: right -11px;
}
/* disabled styles */
.select2-container-multi.select2-container-disabled .select2-choices {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
padding: 3px 5px 3px 5px;
border: 1px solid #ddd;
background-image: none;
background-color: #f4f4f4;
}
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
background: none;
}
/* end multiselect */
.select2-result-selectable .select2-match,
.select2-result-unselectable .select2-match {
text-decoration: underline;
}
.select2-offscreen, .select2-offscreen:focus {
clip: rect(0 0 0 0) !important;
width: 1px !important;
height: 1px !important;
border: 0 !important;
margin: 0 !important;
padding: 0 !important;
overflow: hidden !important;
position: absolute !important;
outline: 0 !important;
left: 0px !important;
top: 0px !important;
}
.select2-display-none {
display: none;
}
.select2-measure-scrollbar {
position: absolute;
top: -10000px;
left: -10000px;
width: 100px;
height: 100px;
overflow: scroll;
}
/* Retina-ize icons */
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
.select2-search input,
.select2-search-choice-close,
.select2-container .select2-choice abbr,
.select2-container .select2-choice .select2-arrow b {
background-image: url('select2x2.png') !important;
background-repeat: no-repeat !important;
background-size: 60px 40px !important;
}
.select2-search input {
background-position: 100% -21px !important;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -0,0 +1,484 @@
.select2-container {
box-sizing: border-box;
display: inline-block;
margin: 0;
position: relative;
vertical-align: middle; }
.select2-container .select2-selection--single {
box-sizing: border-box;
cursor: pointer;
display: block;
height: 28px;
user-select: none;
-webkit-user-select: none; }
.select2-container .select2-selection--single .select2-selection__rendered {
display: block;
padding-left: 8px;
padding-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
.select2-container .select2-selection--single .select2-selection__clear {
position: relative; }
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 8px;
padding-left: 20px; }
.select2-container .select2-selection--multiple {
box-sizing: border-box;
cursor: pointer;
display: block;
min-height: 32px;
user-select: none;
-webkit-user-select: none; }
.select2-container .select2-selection--multiple .select2-selection__rendered {
display: inline-block;
overflow: hidden;
padding-left: 8px;
text-overflow: ellipsis;
white-space: nowrap; }
.select2-container .select2-search--inline {
float: left; }
.select2-container .select2-search--inline .select2-search__field {
box-sizing: border-box;
border: none;
font-size: 100%;
margin-top: 5px;
padding: 0; }
.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none; }
.select2-dropdown {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
box-sizing: border-box;
display: block;
position: absolute;
left: -100000px;
width: 100%;
z-index: 1051; }
.select2-results {
display: block; }
.select2-results__options {
list-style: none;
margin: 0;
padding: 0; }
.select2-results__option {
padding: 6px;
user-select: none;
-webkit-user-select: none; }
.select2-results__option[aria-selected] {
cursor: pointer; }
.select2-container--open .select2-dropdown {
left: 0; }
.select2-container--open .select2-dropdown--above {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--open .select2-dropdown--below {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-search--dropdown {
display: block;
padding: 4px; }
.select2-search--dropdown .select2-search__field {
padding: 4px;
width: 100%;
box-sizing: border-box; }
.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
-webkit-appearance: none; }
.select2-search--dropdown.select2-search--hide {
display: none; }
.select2-close-mask {
border: 0;
margin: 0;
padding: 0;
display: block;
position: fixed;
left: 0;
top: 0;
min-height: 100%;
min-width: 100%;
height: auto;
width: auto;
opacity: 0;
z-index: 99;
background-color: #fff;
filter: alpha(opacity=0); }
.select2-hidden-accessible {
border: 0 !important;
clip: rect(0 0 0 0) !important;
height: 1px !important;
margin: -1px !important;
overflow: hidden !important;
padding: 0 !important;
position: absolute !important;
width: 1px !important; }
.select2-container--default .select2-selection--single {
background-color: #fff;
border: 1px solid #aaa;
border-radius: 4px; }
.select2-container--default .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px; }
.select2-container--default .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold; }
.select2-container--default .select2-selection--single .select2-selection__placeholder {
color: #999; }
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px; }
.select2-container--default .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0; }
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left; }
.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 1px;
right: auto; }
.select2-container--default.select2-container--disabled .select2-selection--single {
background-color: #eee;
cursor: default; }
.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
display: none; }
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px; }
.select2-container--default .select2-selection--multiple {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
cursor: text; }
.select2-container--default .select2-selection--multiple .select2-selection__rendered {
box-sizing: border-box;
list-style: none;
margin: 0;
padding: 0 5px;
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; }
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4;
border: 1px solid #aaa;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
color: #999;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px; }
.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 {
float: right; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 5px;
margin-right: auto; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto; }
.select2-container--default.select2-container--focus .select2-selection--multiple {
border: solid black 1px;
outline: 0; }
.select2-container--default.select2-container--disabled .select2-selection--multiple {
background-color: #eee;
cursor: default; }
.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
display: none; }
.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--default .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa; }
.select2-container--default .select2-search--inline .select2-search__field {
background: transparent;
border: none;
outline: 0;
box-shadow: none;
-webkit-appearance: textfield; }
.select2-container--default .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto; }
.select2-container--default .select2-results__option[role=group] {
padding: 0; }
.select2-container--default .select2-results__option[aria-disabled=true] {
color: #999; }
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: #ddd; }
.select2-container--default .select2-results__option .select2-results__option {
padding-left: 1em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1em;
padding-left: 2em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -2em;
padding-left: 3em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -3em;
padding-left: 4em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -4em;
padding-left: 5em; }
.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -5em;
padding-left: 6em; }
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #5897fb;
color: white; }
.select2-container--default .select2-results__group {
cursor: default;
display: block;
padding: 6px; }
.select2-container--classic .select2-selection--single {
background-color: #f7f7f7;
border: 1px solid #aaa;
border-radius: 4px;
outline: 0;
background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
.select2-container--classic .select2-selection--single:focus {
border: 1px solid #5897fb; }
.select2-container--classic .select2-selection--single .select2-selection__rendered {
color: #444;
line-height: 28px; }
.select2-container--classic .select2-selection--single .select2-selection__clear {
cursor: pointer;
float: right;
font-weight: bold;
margin-right: 10px; }
.select2-container--classic .select2-selection--single .select2-selection__placeholder {
color: #999; }
.select2-container--classic .select2-selection--single .select2-selection__arrow {
background-color: #ddd;
border: none;
border-left: 1px solid #aaa;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
height: 26px;
position: absolute;
top: 1px;
right: 1px;
width: 20px;
background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
.select2-container--classic .select2-selection--single .select2-selection__arrow b {
border-color: #888 transparent transparent transparent;
border-style: solid;
border-width: 5px 4px 0 4px;
height: 0;
left: 50%;
margin-left: -4px;
margin-top: -2px;
position: absolute;
top: 50%;
width: 0; }
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left; }
.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
border: none;
border-right: 1px solid #aaa;
border-radius: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
left: 1px;
right: auto; }
.select2-container--classic.select2-container--open .select2-selection--single {
border: 1px solid #5897fb; }
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
background: transparent;
border: none; }
.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #888 transparent;
border-width: 0 4px 5px 4px; }
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
.select2-container--classic .select2-selection--multiple {
background-color: white;
border: 1px solid #aaa;
border-radius: 4px;
cursor: text;
outline: 0; }
.select2-container--classic .select2-selection--multiple:focus {
border: 1px solid #5897fb; }
.select2-container--classic .select2-selection--multiple .select2-selection__rendered {
list-style: none;
margin: 0;
padding: 0 5px; }
.select2-container--classic .select2-selection--multiple .select2-selection__clear {
display: none; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4;
border: 1px solid #aaa;
border-radius: 4px;
cursor: default;
float: left;
margin-right: 5px;
margin-top: 5px;
padding: 0 5px; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
color: #888;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 2px; }
.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
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 {
margin-left: 5px;
margin-right: auto; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto; }
.select2-container--classic.select2-container--open .select2-selection--multiple {
border: 1px solid #5897fb; }
.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0; }
.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
border-bottom: none;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container--classic .select2-search--dropdown .select2-search__field {
border: 1px solid #aaa;
outline: 0; }
.select2-container--classic .select2-search--inline .select2-search__field {
outline: 0;
box-shadow: none; }
.select2-container--classic .select2-dropdown {
background-color: white;
border: 1px solid transparent; }
.select2-container--classic .select2-dropdown--above {
border-bottom: none; }
.select2-container--classic .select2-dropdown--below {
border-top: none; }
.select2-container--classic .select2-results > .select2-results__options {
max-height: 200px;
overflow-y: auto; }
.select2-container--classic .select2-results__option[role=group] {
padding: 0; }
.select2-container--classic .select2-results__option[aria-disabled=true] {
color: grey; }
.select2-container--classic .select2-results__option--highlighted[aria-selected] {
background-color: #3875d7;
color: white; }
.select2-container--classic .select2-results__group {
cursor: default;
display: block;
padding: 6px; }
.select2-container--classic.select2-container--open .select2-dropdown {
border-color: #5897fb; }

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

View File

@@ -0,0 +1,30 @@
.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }
.ui-timepicker-div dl { text-align: left; }
.ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; }
.ui-timepicker-div dl dd { margin: 0 10px 10px 40%; }
.ui-timepicker-div td { font-size: 90%; }
.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }
.ui-timepicker-div .ui_tpicker_unit_hide{ display: none; }
.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input { background: none; color: inherit; border: none; outline: none; border-bottom: solid 1px #555; width: 95%; }
.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus { border-bottom-color: #aaa; }
.ui-timepicker-rtl{ direction: rtl; }
.ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; }
.ui-timepicker-rtl dl dt{ float: right; clear: right; }
.ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; }
/* Shortened version style */
.ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; }
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,
.ui-timepicker-div.ui-timepicker-oneLine dt { display: none; }
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; }
.ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; }
.ui-timepicker-div.ui-timepicker-oneLine dl dd,
.ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; }
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; }
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,
.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; }
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,
.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; }

View File

@@ -0,0 +1,5 @@
/*! jQuery Timepicker Addon - v1.6.3 - 2016-04-20
* http://trentrichardson.com/examples/timepicker
* Copyright (c) 2016 Trent Richardson; Licensed MIT */
.ui-timepicker-div .ui-widget-header{margin-bottom:8px}.ui-timepicker-div dl{text-align:left}.ui-timepicker-div dl dt{float:left;clear:left;padding:0 0 0 5px}.ui-timepicker-div dl dd{margin:0 10px 10px 40%}.ui-timepicker-div td{font-size:90%}.ui-tpicker-grid-label{background:0 0;border:0;margin:0;padding:0}.ui-timepicker-div .ui_tpicker_unit_hide{display:none}.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input{background:0 0;color:inherit;border:0;outline:0;border-bottom:solid 1px #555;width:95%}.ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus{border-bottom-color:#aaa}.ui-timepicker-rtl{direction:rtl}.ui-timepicker-rtl dl{text-align:right;padding:0 5px 0 0}.ui-timepicker-rtl dl dt{float:right;clear:right}.ui-timepicker-rtl dl dd{margin:0 40% 10px 10px}.ui-timepicker-div.ui-timepicker-oneLine{padding-right:2px}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time,.ui-timepicker-div.ui-timepicker-oneLine dt{display:none}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label{display:block;padding-top:2px}.ui-timepicker-div.ui-timepicker-oneLine dl{text-align:right}.ui-timepicker-div.ui-timepicker-oneLine dl dd,.ui-timepicker-div.ui-timepicker-oneLine dl dd>div{display:inline-block;margin:0}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before{content:':';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before,.ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before{content:'.';display:inline-block}.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide,.ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{display:none}

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 one or more lines are too long

View File

@@ -0,0 +1,868 @@
<?php
/*
* ACF Admin Field Group Class
*
* All the logic for editing a field group
*
* @class acf_admin_field_group
* @package ACF
* @subpackage Admin
*/
if( ! class_exists('acf_admin_field_group') ) :
class acf_admin_field_group {
/*
* __construct
*
* This function will setup the class functionality
*
* @type function
* @date 5/03/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action('current_screen', array($this, 'current_screen'));
add_action('save_post', array($this, 'save_post'), 10, 2);
// ajax
add_action('wp_ajax_acf/field_group/render_field_settings', array($this, 'ajax_render_field_settings'));
add_action('wp_ajax_acf/field_group/render_location_rule', array($this, 'ajax_render_location_rule'));
add_action('wp_ajax_acf/field_group/move_field', array($this, 'ajax_move_field'));
// filters
add_filter('post_updated_messages', array($this, 'post_updated_messages'));
}
/*
* post_updated_messages
*
* This function will customize the message shown when editing a field group
*
* @type action (post_updated_messages)
* @date 30/04/2014
* @since 5.0.0
*
* @param $messages (array)
* @return $messages
*/
function post_updated_messages( $messages ) {
// append to messages
$messages['acf-field-group'] = array(
0 => '', // Unused. Messages start at index 1.
1 => __('Field group updated.', 'acf'),
2 => __('Field group updated.', 'acf'),
3 => __('Field group deleted.', 'acf'),
4 => __('Field group updated.', 'acf'),
5 => false, // field group does not support revisions
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
return $messages;
}
/*
* current_screen
*
* This function is fired when loading the admin page before HTML has been rendered.
*
* @type action (current_screen)
* @date 21/07/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function current_screen() {
// validate screen
if( !acf_is_screen('acf-field-group') ) return;
// disable filters to ensure ACF loads raw data from DB
acf_disable_filters();
// enqueue scripts
acf_enqueue_scripts();
// actions
add_action('acf/input/admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
add_action('acf/input/admin_head', array($this, 'admin_head'));
add_action('acf/input/form_data', array($this, 'form_data'));
add_action('acf/input/admin_footer', array($this, 'admin_footer'));
add_action('acf/input/admin_footer_js', array($this, 'admin_footer_js'));
// filters
add_filter('acf/input/admin_l10n', array($this, 'admin_l10n'));
}
/*
* admin_enqueue_scripts
*
* This action is run after post query but before any admin script / head actions.
* It is a good place to register all actions.
*
* @type action (admin_enqueue_scripts)
* @date 30/06/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_enqueue_scripts() {
// no autosave
wp_dequeue_script('autosave');
// custom scripts
wp_enqueue_style('acf-field-group');
wp_enqueue_script('acf-field-group');
// 3rd party hook
do_action('acf/field_group/admin_enqueue_scripts');
}
/*
* admin_head
*
* This function will setup all functionality for the field group edit page to work
*
* @type action (admin_head)
* @date 23/06/12
* @since 3.1.8
*
* @param $post_id (int)
* @return $post_id (int)
*/
function admin_head() {
// global
global $post, $field_group;
// set global var
$field_group = acf_get_field_group( $post );
// metaboxes
add_meta_box('acf-field-group-fields', __("Fields",'acf'), array($this, 'mb_fields'), 'acf-field-group', 'normal', 'high');
add_meta_box('acf-field-group-locations', __("Location",'acf'), array($this, 'mb_locations'), 'acf-field-group', 'normal', 'high');
add_meta_box('acf-field-group-options', __("Settings",'acf'), array($this, 'mb_options'), 'acf-field-group', 'normal', 'high');
// actions
add_action('post_submitbox_misc_actions', array($this, 'post_submitbox_misc_actions'), 10, 0);
add_action('edit_form_after_title', array($this, 'edit_form_after_title'), 10, 0);
// filters
add_filter('screen_settings', array($this, 'screen_settings'), 10, 1);
// 3rd party hook
do_action('acf/field_group/admin_head');
}
/*
* edit_form_after_title
*
* This action will allow ACF to render metaboxes after the title
*
* @type action
* @date 17/08/13
*
* @param n/a
* @return n/a
*/
function edit_form_after_title() {
// globals
global $post;
// render post data
acf_form_data(array(
'post_id' => $post->ID,
'nonce' => 'field_group',
'ajax' => 0,
'delete_fields' => 0
));
}
/*
* form_data
*
* This function will add extra HTML to the acf form data element
*
* @type function
* @date 31/05/2016
* @since 5.3.8
*
* @param n/a
* @return n/a
*/
function form_data( $args ) {
// do action
do_action('acf/field_group/form_data', $args);
}
/*
* admin_l10n
*
* This function will append extra l10n strings to the acf JS object
*
* @type function
* @date 31/05/2016
* @since 5.3.8
*
* @param $l10n (array)
* @return $l10n
*/
function admin_l10n( $l10n ) {
// merge in new strings
$l10n = array_merge($l10n, array(
'move_to_trash' => __("Move to trash. Are you sure?",'acf'),
'checked' => __("checked",'acf'),
'no_fields' => __("No toggle fields available",'acf'),
'title_is_required' => __("Field group title is required",'acf'),
'copy' => __("copy",'acf'),
'or' => __("or",'acf'),
'fields' => __("Fields",'acf'),
'parent_fields' => __("Parent fields",'acf'),
'sibling_fields' => __("Sibling fields",'acf'),
'move_field' => __("Move Custom Field",'acf'),
'move_field_warning' => __("This field cannot be moved until its changes have been saved",'acf'),
'null' => __("Null",'acf'),
'unload' => __('The changes you made will be lost if you navigate away from this page','acf'),
'field_name_start' => __('The string "field_" may not be used at the start of a field name','acf'),
));
// 3rd party hook
$l10n = apply_filters('acf/field_group/admin_l10n', $l10n);
// return
return $l10n;
}
/*
* admin_footer
*
* description
*
* @type function
* @date 11/01/2016
* @since 5.3.2
*
* @param $post_id (int)
* @return $post_id (int)
*/
function admin_footer() {
// 3rd party hook
do_action('acf/field_group/admin_footer');
}
/*
* admin_footer_js
*
* description
*
* @type function
* @date 31/05/2016
* @since 5.3.8
*
* @param $post_id (int)
* @return $post_id (int)
*/
function admin_footer_js() {
// 3rd party hook
do_action('acf/field_group/admin_footer_js');
}
/*
* screen_settings
*
* description
*
* @type function
* @date 26/01/13
* @since 3.6.0
*
* @param $current (string)
* @return $current
*/
function screen_settings( $html ) {
// vars
$checked = acf_get_user_setting('show_field_keys') ? 'checked="checked"' : '';
// append
$html .= '<div id="acf-append-show-on-screen" class="acf-hidden">';
$html .= '<label for="acf-field-key-hide"><input id="acf-field-key-hide" type="checkbox" value="1" name="show_field_keys" ' . $checked . ' /> ' . __('Field Keys','acf') . '</label>';
$html .= '</div>';
// return
return $html;
}
/*
* post_submitbox_misc_actions
*
* This function will customize the publish metabox
*
* @type function
* @date 17/07/2015
* @since 5.2.9
*
* @param n/a
* @return n/a
*/
function post_submitbox_misc_actions() {
// global
global $field_group;
// vars
$status = $field_group['active'] ? __("Active",'acf') : __("Inactive",'acf');
?>
<script type="text/javascript">
(function($) {
// modify status
$('#post-status-display').html('<?php echo $status; ?>');
// remove edit links
$('#misc-publishing-actions a').remove();
// remove editables (fixes status text changing on submit)
$('#misc-publishing-actions .hide-if-js').remove();
})(jQuery);
</script>
<?php
}
/*
* save_post
*
* This function will save all the field group data
*
* @type function
* @date 23/06/12
* @since 1.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function save_post( $post_id, $post ) {
// do not save if this is an auto save routine
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post_id;
}
// bail early if not acf-field-group
if( $post->post_type !== 'acf-field-group' ) {
return $post_id;
}
// only save once! WordPress save's a revision as well.
if( wp_is_post_revision($post_id) ) {
return $post_id;
}
// verify nonce
if( !acf_verify_nonce('field_group') ) {
return $post_id;
}
// disable filters to ensure ACF loads raw data from DB
acf_disable_filters();
// save fields
if( !empty($_POST['acf_fields']) ) {
foreach( $_POST['acf_fields'] as $field ) {
// vars
$specific = false;
$save = acf_extract_var( $field, 'save' );
// only saved field if has changed
if( $save == 'meta' ) {
$specific = array(
'menu_order',
'post_parent',
);
}
// set field parent
if( empty($field['parent']) ) {
$field['parent'] = $post_id;
}
// save field
acf_update_field( $field, $specific );
}
}
// delete fields
if( $_POST['_acf_delete_fields'] ) {
// clean
$ids = explode('|', $_POST['_acf_delete_fields']);
$ids = array_map( 'intval', $ids );
// loop
foreach( $ids as $id ) {
// bai early if no id
if( !$id ) continue;
// delete
acf_delete_field( $id );
}
}
// add args
$_POST['acf_field_group']['ID'] = $post_id;
$_POST['acf_field_group']['title'] = $_POST['post_title'];
// save field group
acf_update_field_group( $_POST['acf_field_group'] );
// return
return $post_id;
}
/*
* mb_fields
*
* This function will render the HTML for the medtabox 'acf-field-group-fields'
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param N/A
* @return N/A
*/
function mb_fields() {
// global
global $field_group;
// get fields
$view = array(
'fields' => acf_get_fields_by_id( $field_group['ID'] ),
'parent' => 0
);
// load view
acf_get_view('field-group-fields', $view);
}
/*
* mb_options
*
* This function will render the HTML for the medtabox 'acf-field-group-options'
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param N/A
* @return N/A
*/
function mb_options() {
// global
global $field_group;
// field key (leave in for compatibility)
if( !acf_is_field_group_key( $field_group['key']) ) {
$field_group['key'] = uniqid('group_');
}
// view
acf_get_view('field-group-options');
}
/*
* mb_locations
*
* This function will render the HTML for the medtabox 'acf-field-group-locations'
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param N/A
* @return N/A
*/
function mb_locations() {
// global
global $field_group;
// UI needs at lease 1 location rule
if( empty($field_group['location']) ) {
$field_group['location'] = array(
// group 0
array(
// rule 0
array(
'param' => 'post_type',
'operator' => '==',
'value' => 'post',
)
)
);
}
// view
acf_get_view('field-group-locations');
}
/*
* ajax_render_location_rule
*
* This function can be accessed via an AJAX action and will return the result from the render_location_value function
*
* @type function (ajax)
* @date 30/09/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function ajax_render_location_rule() {
// validate
if( !acf_verify_ajax() ) die();
// valid rule
$rule = acf_get_valid_location_rule($_POST['rule']);
// view
acf_get_view( 'html-location-rule', array(
'rule' => $rule
));
// die
die();
}
/*
* ajax_render_field_settings
*
* This function will return HTML containing the field's settings based on it's new type
*
* @type function (ajax)
* @date 30/09/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function ajax_render_field_settings() {
// vars
$options = array(
'nonce' => '',
'parent' => 0,
'field_group' => 0,
'prefix' => '',
'type' => '',
);
// load post options
$options = wp_parse_args($_POST, $options);
// verify nonce
if( !wp_verify_nonce($options['nonce'], 'acf_nonce') ) {
die(0);
}
// required
if( !$options['type'] ) {
die(0);
}
// render options
$field = acf_get_valid_field(array(
'type' => $options['type'],
'name' => 'temp',
'prefix' => $options['prefix'],
'parent' => $options['parent'],
'field_group' => $options['field_group'],
));
// render
do_action("acf/render_field_settings/type={$field['type']}", $field);
// die
die();
}
/*
* ajax_move_field
*
* description
*
* @type function
* @date 20/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function ajax_move_field() {
// disable filters to ensure ACF loads raw data from DB
acf_disable_filters();
$args = acf_parse_args($_POST, array(
'nonce' => '',
'post_id' => 0,
'field_id' => 0,
'field_group_id' => 0
));
// verify nonce
if( !wp_verify_nonce($args['nonce'], 'acf_nonce') ) die();
// confirm?
if( $args['field_id'] && $args['field_group_id'] ) {
// vars
$field = acf_get_field($args['field_id']);
$field_group = acf_get_field_group($args['field_group_id']);
// update parent
$field['parent'] = $field_group['ID'];
// remove conditional logic
$field['conditional_logic'] = 0;
// update field
acf_update_field($field);
// message
$a = '<a href="' . admin_url("post.php?post={$field_group['ID']}&action=edit") . '" target="_blank">' . $field_group['title'] . '</a>';
echo '<p><strong>' . __('Move Complete.', 'acf') . '</strong></p>';
echo '<p>' . sprintf( __('The %s field can now be found in the %s field group', 'acf'), $field['label'], $a ). '</p>';
echo '<a href="#" class="button button-primary acf-close-popup">' . __("Close Window",'acf') . '</a>';
die();
}
// get all field groups
$field_groups = acf_get_field_groups();
$choices = array();
// check
if( !empty($field_groups) ) {
// loop
foreach( $field_groups as $field_group ) {
// bail early if no ID
if( !$field_group['ID'] ) continue;
// bail ealry if is current
if( $field_group['ID'] == $args['post_id'] ) continue;
// append
$choices[ $field_group['ID'] ] = $field_group['title'];
}
}
// render options
$field = acf_get_valid_field(array(
'type' => 'select',
'name' => 'acf_field_group',
'choices' => $choices
));
echo '<p>' . __('Please select the destination for this field', 'acf') . '</p>';
echo '<form id="acf-move-field-form">';
// render
acf_render_field_wrap( $field );
echo '<button type="submit" class="button button-primary">' . __("Move Field",'acf') . '</button>';
echo '</form>';
// die
die();
}
}
// initialize
new acf_admin_field_group();
endif;
?>

View File

@@ -0,0 +1,811 @@
<?php
/*
* ACF Admin Field Groups Class
*
* All the logic for editing a list of field groups
*
* @class acf_admin_field_groups
* @package ACF
* @subpackage Admin
*/
if( ! class_exists('acf_admin_field_groups') ) :
class acf_admin_field_groups {
// vars
var $url = 'edit.php?post_type=acf-field-group',
$sync = array();
/*
* __construct
*
* This function will setup the class functionality
*
* @type function
* @date 5/03/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action('current_screen', array($this, 'current_screen'));
add_action('trashed_post', array($this, 'trashed_post'));
add_action('untrashed_post', array($this, 'untrashed_post'));
add_action('deleted_post', array($this, 'deleted_post'));
}
/*
* current_screen
*
* This function is fired when loading the admin page before HTML has been rendered.
*
* @type action (current_screen)
* @date 21/07/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function current_screen() {
// validate screen
if( !acf_is_screen('edit-acf-field-group') ) {
return;
}
// customize post_status
global $wp_post_statuses;
// modify publish post status
$wp_post_statuses['publish']->label_count = _n_noop( 'Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', 'acf' );
// reorder trash to end
$wp_post_statuses['trash'] = acf_extract_var( $wp_post_statuses, 'trash' );
// check stuff
$this->check_duplicate();
$this->check_sync();
// actions
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
add_action('admin_footer', array($this, 'admin_footer'));
// columns
add_filter('manage_edit-acf-field-group_columns', array($this, 'field_group_columns'), 10, 1);
add_action('manage_acf-field-group_posts_custom_column', array($this, 'field_group_columns_html'), 10, 2);
}
/*
* admin_enqueue_scripts
*
* This function will add the already registered css
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_enqueue_scripts() {
wp_enqueue_script('acf-input');
}
/*
* check_duplicate
*
* This function will check for any $_GET data to duplicate
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function check_duplicate() {
// message
if( $ids = acf_maybe_get_GET('acfduplicatecomplete') ) {
// explode
$ids = explode(',', $ids);
$total = count($ids);
if( $total == 1 ) {
acf_add_admin_notice( sprintf(__('Field group duplicated. %s', 'acf'), '<a href="' . get_edit_post_link($ids[0]) . '">' . get_the_title($ids[0]) . '</a>') );
} else {
acf_add_admin_notice( sprintf(_n( '%s field group duplicated.', '%s field groups duplicated.', $total, 'acf' ), $total) );
}
}
// vars
$ids = array();
// check single
if( $id = acf_maybe_get_GET('acfduplicate') ) {
$ids[] = $id;
// check multiple
} elseif( acf_maybe_get_GET('action2') === 'acfduplicate' ) {
$ids = acf_maybe_get_GET('post');
}
// sync
if( !empty($ids) ) {
// validate
check_admin_referer('bulk-posts');
// vars
$new_ids = array();
// loop
foreach( $ids as $id ) {
// duplicate
$field_group = acf_duplicate_field_group( $id );
// increase counter
$new_ids[] = $field_group['ID'];
}
// redirect
wp_redirect( admin_url( $this->url . '&acfduplicatecomplete=' . implode(',', $new_ids)) );
exit;
}
}
/*
* check_sync
*
* This function will check for any $_GET data to sync
*
* @type function
* @date 9/12/2014
* @since 5.1.5
*
* @param n/a
* @return n/a
*/
function check_sync() {
// message
if( $ids = acf_maybe_get_GET('acfsynccomplete') ) {
// explode
$ids = explode(',', $ids);
$total = count($ids);
if( $total == 1 ) {
acf_add_admin_notice( sprintf(__('Field group synchronised. %s', 'acf'), '<a href="' . get_edit_post_link($ids[0]) . '">' . get_the_title($ids[0]) . '</a>') );
} else {
acf_add_admin_notice( sprintf(_n( '%s field group synchronised.', '%s field groups synchronised.', $total, 'acf' ), $total) );
}
}
// vars
$groups = acf_get_field_groups();
// bail early if no field groups
if( empty($groups) ) return;
// find JSON field groups which have not yet been imported
foreach( $groups as $group ) {
// vars
$local = acf_maybe_get($group, 'local', false);
$modified = acf_maybe_get($group, 'modified', 0);
$private = acf_maybe_get($group, 'private', false);
// ignore DB / PHP / private field groups
if( $local !== 'json' || $private ) {
// do nothing
} elseif( !$group['ID'] ) {
$this->sync[ $group['key'] ] = $group;
} elseif( $modified && $modified > get_post_modified_time('U', true, $group['ID'], true) ) {
$this->sync[ $group['key'] ] = $group;
}
}
// bail if no sync needed
if( empty($this->sync) ) return;
// maybe sync
$sync_keys = array();
// check single
if( $key = acf_maybe_get_GET('acfsync') ) {
$sync_keys[] = $key;
// check multiple
} elseif( acf_maybe_get_GET('action2') === 'acfsync' ) {
$sync_keys = acf_maybe_get_GET('post');
}
// sync
if( !empty($sync_keys) ) {
// validate
check_admin_referer('bulk-posts');
// disable filters to ensure ACF loads raw data from DB
acf_disable_filters();
acf_enable_filter('local');
// disable JSON
// - this prevents a new JSON file being created and causing a 'change' to theme files - solves git anoyance
acf_update_setting('json', false);
// vars
$new_ids = array();
// loop
foreach( $sync_keys as $key ) {
// append fields
if( acf_have_local_fields($key) ) {
$this->sync[ $key ]['fields'] = acf_get_local_fields( $key );
}
// import
$field_group = acf_import_field_group( $this->sync[ $key ] );
// append
$new_ids[] = $field_group['ID'];
}
// redirect
wp_redirect( admin_url( $this->url . '&acfsynccomplete=' . implode(',', $new_ids)) );
exit;
}
// filters
add_filter('views_edit-acf-field-group', array($this, 'list_table_views'));
}
/*
* list_table_views
*
* This function will add an extra link for JSON in the field group list table
*
* @type function
* @date 3/12/2014
* @since 5.1.5
*
* @param $views (array)
* @return $views
*/
function list_table_views( $views ) {
// vars
$class = '';
$total = count($this->sync);
// active
if( acf_maybe_get_GET('post_status') === 'sync' ) {
// actions
add_action('admin_footer', array($this, 'sync_admin_footer'), 5);
// set active class
$class = ' class="current"';
// global
global $wp_list_table;
// update pagination
$wp_list_table->set_pagination_args( array(
'total_items' => $total,
'total_pages' => 1,
'per_page' => $total
));
}
// add view
$views['json'] = '<a' . $class . ' href="' . admin_url($this->url . '&post_status=sync') . '">' . __('Sync available', 'acf') . ' <span class="count">(' . $total . ')</span></a>';
// return
return $views;
}
/*
* trashed_post
*
* This function is run when a post object is sent to the trash
*
* @type action (trashed_post)
* @date 8/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return n/a
*/
function trashed_post( $post_id ) {
// validate post type
if( get_post_type($post_id) != 'acf-field-group' ) {
return;
}
// trash field group
acf_trash_field_group( $post_id );
}
/*
* untrashed_post
*
* This function is run when a post object is restored from the trash
*
* @type action (untrashed_post)
* @date 8/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return n/a
*/
function untrashed_post( $post_id ) {
// validate post type
if( get_post_type($post_id) != 'acf-field-group' ) {
return;
}
// trash field group
acf_untrash_field_group( $post_id );
}
/*
* deleted_post
*
* This function is run when a post object is deleted from the trash
*
* @type action (deleted_post)
* @date 8/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return n/a
*/
function deleted_post( $post_id ) {
// validate post type
if( get_post_type($post_id) != 'acf-field-group' ) {
return;
}
// trash field group
acf_delete_field_group( $post_id );
}
/*
* field_group_columns
*
* This function will customize the columns for the field group table
*
* @type filter (manage_edit-acf-field-group_columns)
* @date 28/09/13
* @since 5.0.0
*
* @param $columns (array)
* @return $columns (array)
*/
function field_group_columns( $columns ) {
return array(
'cb' => '<input type="checkbox" />',
'title' => __('Title', 'acf'),
'acf-fg-description' => __('Description', 'acf'),
'acf-fg-status' => '<i class="acf-icon -dot-3 small acf-js-tooltip" title="' . esc_attr__('Status', 'acf') . '"></i>',
'acf-fg-count' => __('Fields', 'acf'),
);
}
/*
* field_group_columns_html
*
* This function will render the HTML for each table cell
*
* @type action (manage_acf-field-group_posts_custom_column)
* @date 28/09/13
* @since 5.0.0
*
* @param $column (string)
* @param $post_id (int)
* @return n/a
*/
function field_group_columns_html( $column, $post_id ) {
// vars
$field_group = acf_get_field_group( $post_id );
// render
$this->render_column( $column, $field_group );
}
function render_column( $column, $field_group ) {
// description
if( $column == 'acf-fg-description' ) {
if( $field_group['description'] ) {
echo '<span class="acf-description">' . acf_esc_html($field_group['description']) . '</span>';
}
// status
} elseif( $column == 'acf-fg-status' ) {
if( isset($this->sync[ $field_group['key'] ]) ) {
echo '<i class="acf-icon -sync grey small acf-js-tooltip" title="' . esc_attr__('Sync available', 'acf') .'"></i> ';
}
if( $field_group['active'] ) {
//echo '<i class="acf-icon -check small acf-js-tooltip" title="' . esc_attr__('Active', 'acf') .'"></i> ';
} else {
echo '<i class="acf-icon -minus yellow small acf-js-tooltip" title="' . esc_attr__('Inactive', 'acf') . '"></i> ';
}
// fields
} elseif( $column == 'acf-fg-count' ) {
echo esc_html( acf_get_field_count( $field_group ) );
}
}
/*
* admin_footer
*
* This function will render extra HTML onto the page
*
* @type action (admin_footer)
* @date 23/06/12
* @since 3.1.8
*
* @param n/a
* @return n/a
*/
function admin_footer() {
// vars
$url_home = 'https://www.advancedcustomfields.com';
$url_support = 'https://support.advancedcustomfields.com';
$icon = '<i aria-hidden="true" class="dashicons dashicons-external"></i>';
?>
<script type="text/html" id="tmpl-acf-column-2">
<div class="acf-column-2">
<div class="acf-box">
<div class="inner">
<h2><?php echo acf_get_setting('name'); ?></h2>
<p><?php _e('Customise WordPress with powerful, professional and intuitive fields.','acf'); ?></p>
<h3><?php _e("Changelog",'acf'); ?></h3>
<p><?php
$acf_changelog = admin_url('edit.php?post_type=acf-field-group&page=acf-settings-info&tab=changelog');
$acf_version = acf_get_setting('version');
printf( __('See what\'s new in <a href="%s">version %s</a>.','acf'), esc_url($acf_changelog), $acf_version );
?></p>
<h3><?php _e("Resources",'acf'); ?></h3>
<ul>
<li><a href="<?php echo esc_url( $url_home ); ?>" target="_blank"><?php echo $icon; ?> <?php _e("Website",'acf'); ?></a></li>
<li><a href="<?php echo esc_url( $url_home . '/resources/' ); ?>" target="_blank"><?php echo $icon; ?> <?php _e("Documentation",'acf'); ?></a></li>
<li><a href="<?php echo esc_url( $url_support ); ?>" target="_blank"><?php echo $icon; ?> <?php _e("Support",'acf'); ?></a></li>
<?php if( !acf_get_setting('pro') ): ?>
<li><a href="<?php echo esc_url( $url_home . '/pro/' ); ?>" target="_blank"><?php echo $icon; ?> <?php _e("Pro",'acf'); ?></a></li>
<?php endif; ?>
</ul>
</div>
<div class="footer">
<p><?php printf( __('Thank you for creating with <a href="%s">ACF</a>.','acf'), esc_url($url_home) ); ?></p>
</div>
</div>
</div>
</script>
<script type="text/javascript">
(function($){
// wrap
$('#wpbody .wrap').attr('id', 'acf-field-group-wrap');
// wrap form
$('#posts-filter').wrap('<div class="acf-columns-2" />');
// add column main
$('#posts-filter').addClass('acf-column-1');
// add column side
$('#posts-filter').after( $('#tmpl-acf-column-2').html() );
// modify row actions
$('#the-list tr').each(function(){
// vars
var $tr = $(this),
id = $tr.attr('id'),
description = $tr.find('.column-acf-fg-description').html();
// replace Quick Edit with Duplicate (sync page has no id attribute)
if( id ) {
// vars
var post_id = id.replace('post-', '');
var url = '<?php echo esc_url( admin_url( $this->url . '&acfduplicate=__post_id__&_wpnonce=' . wp_create_nonce('bulk-posts') ) ); ?>';
var $span = $('<span class="acf-duplicate-field-group"><a title="<?php _e('Duplicate this item', 'acf'); ?>" href="' + url.replace('__post_id__', post_id) + '"><?php _e('Duplicate', 'acf'); ?></a> | </span>');
// replace
$tr.find('.column-title .row-actions .inline').replaceWith( $span );
}
// add description to title
$tr.find('.column-title .row-title').after( description );
});
// modify bulk actions
$('#bulk-action-selector-bottom option[value="edit"]').attr('value','acfduplicate').text('<?php _e( 'Duplicate', 'acf' ); ?>');
// clean up table
$('#adv-settings label[for="acf-fg-description-hide"]').remove();
// mobile compatibility
var status = $('.acf-icon.-dot-3').first().attr('title');
$('td.column-acf-fg-status').attr('data-colname', status);
// no field groups found
$('#the-list tr.no-items td').attr('colspan', 4);
// search
$('.subsubsub').append(' | <li><a href="#" class="acf-toggle-search"><?php _e('Search', 'acf'); ?></a></li>');
// events
$(document).on('click', '.acf-toggle-search', function( e ){
// prevent default
e.preventDefault();
// toggle
$('.search-box').slideToggle();
});
})(jQuery);
</script>
<?php
}
/*
* sync_admin_footer
*
* This function will render extra HTML onto the page
*
* @type action (admin_footer)
* @date 23/06/12
* @since 3.1.8
*
* @param n/a
* @return n/a
*/
function sync_admin_footer() {
// vars
$i = -1;
$columns = array(
'acf-fg-description',
'acf-fg-status',
'acf-fg-count'
);
$nonce = wp_create_nonce('bulk-posts');
?>
<script type="text/html" id="tmpl-acf-json-tbody">
<?php foreach( $this->sync as $field_group ):
// vars
$i++;
$key = $field_group['key'];
$title = $field_group['title'];
$url = admin_url( $this->url . '&post_status=sync&acfsync=' . $key . '&_wpnonce=' . $nonce );
?>
<tr <?php if($i%2 == 0): ?>class="alternate"<?php endif; ?>>
<th class="check-column" scope="row">
<label for="cb-select-<?php echo esc_attr($key); ?>" class="screen-reader-text"><?php echo esc_html(sprintf(__('Select %s', 'acf'), $title)); ?></label>
<input type="checkbox" value="<?php echo esc_attr($key); ?>" name="post[]" id="cb-select-<?php echo esc_attr($key); ?>">
</th>
<td class="post-title page-title column-title">
<strong>
<span class="row-title"><?php echo esc_html($title); ?></span><span class="acf-description"><?php echo esc_html($key); ?>.json</span>
</strong>
<div class="row-actions">
<span class="import"><a title="<?php echo esc_attr( __('Synchronise field group', 'acf') ); ?>" href="<?php echo esc_url($url); ?>"><?php _e( 'Sync', 'acf' ); ?></a></span>
</div>
</td>
<?php foreach( $columns as $column ): ?>
<td class="column-<?php echo esc_attr($column); ?>"><?php $this->render_column( $column, $field_group ); ?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</script>
<script type="text/html" id="tmpl-acf-bulk-actions">
<?php // source: bulk_actions() wp-admin/includes/class-wp-list-table.php ?>
<select name="action2" id="bulk-action-selector-bottom"></select>
<?php submit_button( __( 'Apply' ), 'action', '', false, array( 'id' => "doaction2" ) ); ?>
</script>
<script type="text/javascript">
(function($){
// update table HTML
$('#the-list').html( $('#tmpl-acf-json-tbody').html() );
// bulk may not exist if no field groups in DB
if( !$('#bulk-action-selector-bottom').exists() ) {
$('.tablenav.bottom .actions.alignleft').html( $('#tmpl-acf-bulk-actions').html() );
}
// set only options
$('#bulk-action-selector-bottom').html('<option value="-1"><?php _e('Bulk Actions'); ?></option><option value="acfsync"><?php _e('Sync', 'acf'); ?></option>');
})(jQuery);
</script>
<?php
}
}
new acf_admin_field_groups();
endif;
?>

View File

@@ -0,0 +1,354 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
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();
}
}
}
/**
* 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, $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
}
}
// initialize
acf()->admin_tools = new acf_admin_tools();
endif; // class_exists check
/*
* acf_register_admin_tool
*
* alias of acf()->admin_tools->register_tool()
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_register_admin_tool( $class ) {
return acf()->admin_tools->register_tool( $class );
}
/*
* 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
*
* @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');
}
/*
* acf_get_admin_tool_url
*
* This function will return the admin URL to the tools page
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_get_admin_tool_url( $tool = '' ) {
return acf_get_admin_tools_url() . '&tool='.$tool;
}
?>

View File

@@ -0,0 +1,235 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('acf_admin') ) :
class acf_admin {
// vars
var $notices = array();
/*
* __construct
*
* Initialize filters, action, variables and includes
*
* @type function
* @date 23/06/12
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action('admin_menu', array($this, 'admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'), 0);
add_action('admin_notices', array($this, 'admin_notices'));
}
/*
* add_notice
*
* This function will add the notice data to a setting in the acf object for the admin_notices action to use
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param $text (string)
* @param $class (string)
* @param wrap (string)
* @return n/a
*/
function add_notice( $text = '', $class = '', $wrap = 'p' ) {
// append
$this->notices[] = array(
'text' => $text,
'class' => 'updated ' . $class,
'wrap' => $wrap
);
}
/*
* get_notices
*
* This function will return an array of admin notices
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param n/a
* @return (array)
*/
function get_notices() {
// bail early if no notices
if( empty($this->notices) ) return false;
// return
return $this->notices;
}
/*
* 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;
// vars
$slug = 'edit.php?post_type=acf-field-group';
$cap = acf_get_setting('capability');
// add parent
add_menu_page(__("Custom Fields",'acf'), __("Custom Fields",'acf'), $cap, $slug, false, 'dashicons-welcome-widgets-menus', '80.025');
// add children
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' );
}
/*
* admin_enqueue_scripts
*
* This function will add the already registered css
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_enqueue_scripts() {
wp_enqueue_style( 'acf-global' );
}
/*
* admin_notices
*
* This function will render any admin notices
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_notices() {
// vars
$notices = $this->get_notices();
// bail early if no notices
if( !$notices ) return;
// loop
foreach( $notices as $notice ) {
$open = '';
$close = '';
if( $notice['wrap'] ) {
$open = "<{$notice['wrap']}>";
$close = "</{$notice['wrap']}>";
}
?>
<div class="notice is-dismissible <?php echo esc_attr($notice['class']); ?> acf-notice"><?php echo $open . $notice['text'] . $close; ?></div>
<?php
}
}
}
// initialize
acf()->admin = new acf_admin();
endif; // class_exists check
/*
* acf_add_admin_notice
*
* This function will add the notice data to a setting in the acf object for the admin_notices action to use
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param $text (string)
* @param $class (string)
* @return (int) message ID (array position)
*/
function acf_add_admin_notice( $text, $class = '', $wrap = 'p' ) {
return acf()->admin->add_notice($text, $class, $wrap);
}
/*
* acf_get_admin_notices
*
* This function will return an array containing any admin notices
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param n/a
* @return (array)
*/
function acf_get_admin_notices() {
return acf()->admin->get_notices();
}
?>

View File

@@ -0,0 +1,283 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('acf_admin_install_network') ) :
class acf_admin_install_network {
/*
* __construct
*
* A good place to add actions / filters
*
* @type function
* @date 11/08/13
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action('network_admin_menu', array($this,'network_admin_menu'), 20);
}
/*
* network_admin_menu
*
* This function will chck for available updates and add actions if needed
*
* @type function
* @date 2/04/2015
* @since 5.1.5
*
* @param n/a
* @return n/a
*/
function network_admin_menu() {
// vars
$prompt = false;
// loop through sites and find updates
$sites = acf_get_sites();
if( $sites ) {
foreach( $sites as $site ) {
// switch blog
switch_to_blog( $site['blog_id'] );
// get site updates
$updates = acf_get_db_updates();
// restore
restore_current_blog();
if( $updates ) {
$prompt = true;
break;
}
}
}
// bail if no prompt
if( !$prompt ) return;
// actions
add_action('network_admin_notices', array($this, 'network_admin_notices'), 1);
// add page
$page = add_submenu_page('index.php', __('Upgrade Database','acf'), __('Upgrade Database','acf'), acf_get_setting('capability'), 'acf-upgrade-network', array($this,'network_html'));
// actions
add_action('load-' . $page, array($this,'network_load'));
}
/*
* load
*
* This function will look at the $_POST data and run any functions if needed
*
* @type function
* @date 7/01/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function network_load() {
// hide notice on this page
remove_action('network_admin_notices', array($this, 'network_admin_notices'), 1);
// load acf scripts
acf_enqueue_scripts();
}
/*
* network_admin_notices
*
* This function will render the update notice
*
* @type function
* @date 2/04/2015
* @since 5.1.5
*
* @param n/a
* @return n/a
*/
function network_admin_notices() {
// view
$view = array(
'button_text' => __("Review sites & upgrade", 'acf'),
'button_url' => network_admin_url('index.php?page=acf-upgrade-network'),
'confirm' => false
);
// load view
acf_get_view('install-notice', $view);
}
/*
* network_html
*
* This function will render the HTML for the network upgrade page
*
* @type function
* @date 19/02/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function network_html() {
// vars
$plugin_version = acf_get_setting('version');
// loop through sites and find updates
$sites = acf_get_sites();
if( $sites ) {
foreach( $sites as $i => $site ) {
// switch blog
switch_to_blog( $site['blog_id'] );
// extra info
$site['name'] = get_bloginfo('name');
$site['url'] = home_url();
// get site updates
$site['updates'] = acf_get_db_updates();
// get site version
$site['acf_version'] = get_option('acf_version');
// no value equals new instal
if( !$site['acf_version'] ) {
$site['acf_version'] = $plugin_version;
}
// update
$sites[ $i ] = $site;
// restore
restore_current_blog();
}
}
// view
$view = array(
'sites' => $sites,
'plugin_version' => $plugin_version
);
// load view
acf_get_view('install-network', $view);
}
}
// initialize
new acf_admin_install_network();
endif; // class_exists check
/*
* acf_get_sites
*
* This function will return an array of site data
*
* @type function
* @date 29/08/2016
* @since 5.4.0
*
* @param n/a
* @return (array)
*/
function acf_get_sites() {
// vars
$sites = array();
// WP >= 4.6
if( function_exists('get_sites') ) {
$_sites = get_sites(array(
'number' => 0
));
foreach( $_sites as $_site ) {
$_site = get_site( $_site );
$sites[] = $_site->to_array();
}
// WP < 4.6
} else {
$sites = wp_get_sites(array(
'limit' => 0
));
}
// return
return $sites;
}
?>

View File

@@ -0,0 +1,499 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
/*
* acf_update_500
*
* These functions will update the DB for ACF v5.0.0
*
* @type function
* @date 10/09/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_update_500() {
// action for 3rd party
do_action('acf/update_500');
// field groups
acf_update_500_field_groups();
// version
acf_update_db_version('5.0.0');
}
function acf_update_500_field_groups() {
// vars
$ofgs = get_posts(array(
'numberposts' => -1,
'post_type' => 'acf',
'orderby' => 'menu_order title',
'order' => 'asc',
'suppress_filters' => true,
));
// check
if( !$ofgs ) return;
// loop
foreach( $ofgs as $ofg ){
acf_update_500_field_group( $ofg );
}
}
function acf_update_500_field_group( $ofg ) {
// global
global $wpdb;
// create new field group
$nfg = array(
'ID' => 0,
'title' => $ofg->post_title,
'menu_order' => $ofg->menu_order,
);
// location rules
$groups = array();
// get all rules
$rules = get_post_meta($ofg->ID, 'rule', false);
if( is_array($rules) ) {
$group_no = 0;
foreach( $rules as $rule ) {
// if field group was duplicated, it may now be a serialized string!
$rule = maybe_unserialize($rule);
// does this rule have a group?
// + groups were added in 4.0.4
if( !isset($rule['group_no']) ) {
$rule['group_no'] = $group_no;
// sperate groups?
if( get_post_meta($ofg->ID, 'allorany', true) == 'any' ) {
$group_no++;
}
}
// extract vars
$group = acf_extract_var( $rule, 'group_no' );
$order = acf_extract_var( $rule, 'order_no' );
// add to group
$groups[ $group ][ $order ] = $rule;
// sort rules
ksort( $groups[ $group ] );
}
// sort groups
ksort( $groups );
}
$nfg['location'] = $groups;
// settings
if( $position = get_post_meta($ofg->ID, 'position', true) ) {
$nfg['position'] = $position;
}
if( $layout = get_post_meta($ofg->ID, 'layout', true) ) {
$nfg['layout'] = $layout;
}
if( $hide_on_screen = get_post_meta($ofg->ID, 'hide_on_screen', true) ) {
$nfg['hide_on_screen'] = maybe_unserialize($hide_on_screen);
}
// Note: acf_update_field_group will call the acf_get_valid_field_group function and apply 'compatibility' changes
// save field group
$nfg = acf_update_field_group( $nfg );
// action for 3rd party
do_action('acf/update_500_field_group', $nfg, $ofg);
// trash?
if( $ofg->post_status == 'trash' ) {
acf_trash_field_group( $nfg['ID'] );
}
// get field from postmeta
$rows = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE post_id = %d AND meta_key LIKE %s", $ofg->ID, 'field_%'), ARRAY_A);
// check
if( $rows ) {
// loop
foreach( $rows as $row ) {
// bail early if key already migrated (potential duplicates in DB)
if( acf_has_done('update_500_field_group_' . $ofg->ID . '_' . $row['meta_key']) ) continue;
// vars
$field = $row['meta_value'];
$field = maybe_unserialize( $field );
$field = maybe_unserialize( $field ); // run again for WPML
// add parent
$field['parent'] = $nfg['ID'];
// migrate field
$field = acf_update_500_field( $field );
}
}
// return
return $nfg;
}
function acf_update_500_field( $field ) {
// orig
$orig = $field;
// order_no is now menu_order
$field['menu_order'] = acf_extract_var( $field, 'order_no' );
// correct very old field keys
if( substr($field['key'], 0, 6) !== 'field_' ) {
$field['key'] = 'field_' . str_replace('field', '', $field['key']);
}
// get valid field
$field = acf_get_valid_field( $field );
// save field
$field = acf_update_field( $field );
// sub fields
if( $field['type'] == 'repeater' ) {
// get sub fields
$sub_fields = acf_extract_var( $orig, 'sub_fields' );
// save sub fields
if( !empty($sub_fields) ) {
$keys = array_keys($sub_fields);
foreach( $keys as $key ) {
$sub_field = acf_extract_var($sub_fields, $key);
$sub_field['parent'] = $field['ID'];
acf_update_500_field( $sub_field );
}
}
} elseif( $field['type'] == 'flexible_content' ) {
// get layouts
$layouts = acf_extract_var( $orig, 'layouts' );
// update layouts
$field['layouts'] = array();
// save sub fields
if( !empty($layouts) ) {
foreach( $layouts as $layout ) {
// vars
$layout_key = uniqid();
// append layotu key
$layout['key'] = $layout_key;
// extract sub fields
$sub_fields = acf_extract_var($layout, 'sub_fields');
// save sub fields
if( !empty($sub_fields) ) {
$keys = array_keys($sub_fields);
foreach( $keys as $key ) {
$sub_field = acf_extract_var($sub_fields, $key);
$sub_field['parent'] = $field['ID'];
$sub_field['parent_layout'] = $layout_key;
acf_update_500_field( $sub_field );
}
// foreach
}
// if
// append layout
$field['layouts'][] = $layout;
}
// foreach
}
// if
// save field again with less sub field data
$field = acf_update_field( $field );
}
// action for 3rd party
do_action('acf/update_500_field', $field);
// return
return $field;
}
/*
* acf_update_550
*
* These functions will update the DB for ACF v5.5.0
*
* @type function
* @date 10/09/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_update_550() { //acf_log('acf_update_550');
// action for 3rd party
do_action('acf/update_550');
// termmeta
acf_update_550_termmeta();
// version
acf_update_db_version('5.5.0');
}
/*
* acf_update_550_termmeta
*
* This function will migrate all term meta
*
* @type function
* @date 3/09/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_update_550_termmeta() { //acf_log('acf_update_550_termmeta');
// bail early if no table
if( !acf_isset_termmeta() ) {
update_option('acf_update_550_termmeta', 1); // no longer used
//echo __('Term meta upgrade not possible (termmeta table does not exist)', 'acf');
return;
}
// vars
$taxonomies = get_taxonomies(false, 'objects');
// bail early if no taxonomies
if( !$taxonomies ) return;
// loop
foreach( $taxonomies as $taxonomy ) {
acf_update_550_taxonomy( $taxonomy->name );
}
// delete trigger
delete_option('acf_update_550_termmeta');
// action for 3rd party
do_action('acf/update_550_termmeta');
}
/*
* acf_update_550_taxonomy
*
* This function will migrate term meta for a specific taxonomy
*
* @type function
* @date 3/09/2016
* @since 5.4.0
*
* @param $taxonomy (string)
* @return n/a
*/
function acf_update_550_taxonomy( $taxonomy ) { //acf_log('acf_update_550_taxonomy', $taxonomy);
// global
global $wpdb;
// vars
$search = $taxonomy . '_%';
$_search = '_' . $search;
// escape '_'
// http://stackoverflow.com/questions/2300285/how-do-i-escape-in-sql-server
$search = str_replace('_', '\_', $search);
$_search = str_replace('_', '\_', $_search);
// search
// results show faster query times using 2 LIKE vs 2 wildcards
$rows = $wpdb->get_results($wpdb->prepare(
"SELECT *
FROM $wpdb->options
WHERE option_name LIKE %s
OR option_name LIKE %s",
$search,
$_search
), ARRAY_A);
// bail early if no rows
if( empty($rows) ) return;
// vars
$search = $taxonomy . '_';
$_search = '_' . $search;
// loop
foreach( $rows as $row ) {
// use regex to find (_)taxonomy_(term_id)_(field_name)
$matches = null;
$regexp = '/^(_?)' . $taxonomy . '_(\d+)_(.+)/';
// bail early if no match
if( !preg_match($regexp, $row['option_name'], $matches) ) continue;
/*
Array
(
[0] => category_3_color
[1] =>
[2] => 3
[3] => color
)
*/
// vars
$term_id = $matches[2];
$name = $matches[1] . $matches[3];
$value = $row['option_value'];
// update
update_metadata( 'term', $term_id, $name, $value );
}
// action for 3rd party
do_action('acf/update_550_taxonomy', $taxonomy);
}
?>

View File

@@ -0,0 +1,431 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('acf_admin_install') ) :
class acf_admin_install {
// vars
var $db_updates = array(
'5.0.0' => 'acf_update_500',
'5.5.0' => 'acf_update_550'
);
/*
* __construct
*
* This function will setup the class functionality
*
* @type function
* @date 5/03/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action('admin_menu', array($this,'admin_menu'), 20);
add_action('wp_upgrade', array($this,'wp_upgrade'), 10, 2);
// ajax
add_action('wp_ajax_acf/admin/db_update', array($this, 'ajax_db_update'));
}
/*
* admin_menu
*
* This function will chck for available updates and add actions if needed
*
* @type function
* @date 19/02/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_menu() {
// vars
$updates = acf_get_db_updates();
// bail early if no updates available
if( !$updates ) return;
// actions
add_action('admin_notices', array($this, 'admin_notices'), 1);
// add page
$page = add_submenu_page('index.php', __('Upgrade Database','acf'), __('Upgrade Database','acf'), acf_get_setting('capability'), 'acf-upgrade', array($this,'html') );
// actions
add_action('load-' . $page, array($this,'load'));
}
/*
* load
*
* This function will look at the $_POST data and run any functions if needed
*
* @type function
* @date 7/01/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function load() {
// hide upgrade
remove_action('admin_notices', array($this, 'admin_notices'), 1);
// load acf scripts
acf_enqueue_scripts();
}
/*
* admin_notices
*
* This function will render the DB Upgrade notice
*
* @type function
* @date 17/10/13
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function admin_notices() {
// view
$view = array(
'button_text' => __("Upgrade Database", 'acf'),
'button_url' => admin_url('index.php?page=acf-upgrade'),
'confirm' => true
);
// load view
acf_get_view('install-notice', $view);
}
/*
* html
*
* description
*
* @type function
* @date 19/02/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function html() {
// view
$view = array(
'updates' => acf_get_db_updates(),
'plugin_version' => acf_get_setting('version')
);
// load view
acf_get_view('install', $view);
}
/*
* ajax_db_update
*
* description
*
* @type function
* @date 24/10/13
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function ajax_db_update() {
// options
$options = wp_parse_args( $_POST, array(
'nonce' => '',
'blog_id' => '',
));
// validate
if( !wp_verify_nonce($options['nonce'], 'acf_db_update') ) {
wp_send_json_error(array(
'message' => __('Error validating request', 'acf')
));
}
// switch blog
if( $options['blog_id'] ) {
switch_to_blog( $options['blog_id'] );
}
// vars
$updates = acf_get_db_updates();
$message = '';
// bail early if no updates
if( empty($updates) ) {
wp_send_json_error(array(
'message' => __('No updates available.', 'acf')
));
}
// install updates
foreach( $updates as $version => $callback ) {
$message .= $this->run_update( $callback );
}
// updates complete
acf_update_db_version();
// return
wp_send_json_success(array(
'message' => $message
));
}
/*
* run_db_update
*
* This function will perform a db upgrade
*
* @type function
* @date 10/09/2016
* @since 5.4.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function run_update( $callback = '' ) {
// include update functions
acf_include('includes/admin/install-updates.php');
// bail early if not found
if( !function_exists($callback) ) return false;
// load any errors / feedback from update
ob_start();
// include
call_user_func($callback);
// get feedback
$message = ob_get_clean();
// return
return $message;
}
/*
* wp_upgrade
*
* This function will run when the WP database is updated
*
* @type function
* @date 10/09/2016
* @since 5.4.0
*
* @param $wp_db_version (string) The new $wp_db_version
* @return $wp_current_db_version (string) The old (current) $wp_db_version
*/
function wp_upgrade( $wp_db_version, $wp_current_db_version ) {
// vars
$acf_db_version = acf_get_db_version();
// termmeta was added in WP 4.4 (34370)
// if website has already updated to ACF 5.5.0, termmeta will not have yet been migrated
if( $wp_db_version >= 34370 && $wp_current_db_version < 34370 && acf_version_compare($acf_db_version, '>=', '5.5.0') ) {
$this->run_update('acf_update_550_termmeta');
}
}
}
// initialize
acf()->admin->install = new acf_admin_install();
endif; // class_exists check
/*
* acf_get_db_version
*
* This function will return the current ACF DB version
*
* @type function
* @date 10/09/2016
* @since 5.4.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_get_db_version() {
return get_option('acf_version');
}
/*
* acf_update_db_version
*
* This function will update the current ACF DB version
*
* @type function
* @date 10/09/2016
* @since 5.4.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_update_db_version( $version = '' ) {
// default to latest
if( !$version ) {
$version = acf_get_setting('version');
}
// update
update_option('acf_version', $version );
}
/*
* acf_get_db_updates
*
* This function will return available db updates
*
* @type function
* @date 12/05/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_get_db_updates() {
// vars
$available = array();
$db_updates = acf()->admin->install->db_updates;
$acf_version = acf_get_setting('version');
$db_version = acf_get_db_version();
// bail early if is fresh install
if( !$db_version ) {
acf_update_db_version($acf_version);
return false;
}
// bail early if is up to date
if( acf_version_compare($db_version, '>=', $acf_version)) return false;
// loop
foreach( $db_updates as $version => $callback ) {
// ignore if update is for a future version (may exist for testing)
if( acf_version_compare( $version, '>', $acf_version ) ) continue;
// ignore if update has already been run
if( acf_version_compare( $version, '<=', $db_version ) ) continue;
// append
$available[ $version ] = $callback;
}
// bail early if no updates available
// - also update DB to current version
if( empty($available) ) {
acf_update_db_version($acf_version);
return false;
}
// return
return $available;
}
?>

View File

@@ -0,0 +1,123 @@
<?php
class acf_settings_addons {
var $view;
/*
* __construct
*
* Initialize filters, action, variables and includes
*
* @type function
* @date 23/06/12
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action( 'admin_menu', array( $this, 'admin_menu' ) );
}
/*
* 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', __('Add-ons','acf'), __('Add-ons','acf'), acf_get_setting('capability'),'acf-settings-addons', array($this,'html') );
// actions
add_action('load-' . $page, array($this,'load'));
}
/*
* load
*
* description
*
* @type function
* @date 7/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function load() {
// vars
$this->view = array(
'json' => array(),
);
// load json
$request = wp_remote_post( 'https://assets.advancedcustomfields.com/add-ons/add-ons.json' );
// validate
if( is_wp_error($request) || wp_remote_retrieve_response_code($request) != 200)
{
acf_add_admin_notice(__('<b>Error</b>. Could not load add-ons list', 'acf'), 'error');
}
else
{
$this->view['json'] = json_decode( $request['body'], true );
}
}
/*
* html
*
* description
*
* @type function
* @date 7/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function html() {
// load view
acf_get_view('settings-addons', $this->view);
}
}
// initialize
new acf_settings_addons();
?>

View File

@@ -0,0 +1,102 @@
<?php
class acf_settings_info {
/*
* __construct
*
* Initialize filters, action, variables and includes
*
* @type function
* @date 23/06/12
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// actions
add_action('admin_menu', array($this, 'admin_menu'));
}
/*
* 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
add_submenu_page('edit.php?post_type=acf-field-group', __('Info','acf'), __('Info','acf'), acf_get_setting('capability'),'acf-settings-info', array($this,'html'));
}
/*
* html
*
* description
*
* @type function
* @date 7/01/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function html() {
// vars
$view = array(
'version' => acf_get_setting('version'),
'have_pro' => acf_get_setting('pro'),
'tabs' => array(
'new' => __("What's New", 'acf'),
'changelog' => __("Changelog", 'acf')
),
'active' => 'new'
);
// set active tab
$tab = acf_maybe_get_GET('tab');
if( $tab && isset($view['tabs'][ $tab ]) ) {
$view['active'] = $tab;
}
// load view
acf_get_view('settings-info', $view);
}
}
// initialize
new acf_settings_info();
?>

View File

@@ -0,0 +1,592 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('ACF_Admin_Tool_Export') ) :
class ACF_Admin_Tool_Export extends ACF_Admin_Tool {
/** @var string View context */
var $view = '';
/** @var array Export data */
var $json = '';
/**
* 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 = 'export';
$this->title = __("Export Field Groups", 'acf');
// active
if( $this->is_active() ) {
$this->title .= ' - ' . __('Generate PHP', 'acf');
}
}
/**
* 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() {
// vars
$action = acf_maybe_get_POST('action');
// download
if( $action === 'download' ) {
$this->submit_download();
// generate
} elseif( $action === 'generate' ) {
$this->submit_generate();
}
}
/**
* submit_download
*
* description
*
* @date 17/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function submit_download() {
// vars
$json = $this->get_selected();
// validate
if( $json === false ) {
return acf_add_admin_notice( __("No field groups selected", 'acf') , 'error');
}
// headers
$file_name = 'acf-export-' . date('Y-m-d') . '.json';
header( "Content-Description: File Transfer" );
header( "Content-Disposition: attachment; filename={$file_name}" );
header( "Content-Type: application/json; charset=utf-8" );
// return
echo acf_json_encode( $json );
die;
}
/**
* submit_generate
*
* description
*
* @date 17/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function submit_generate() {
// vars
$keys = $this->get_selected_keys();
// validate
if( !$keys ) {
return acf_add_admin_notice( __("No field groups selected", 'acf') , 'error');
}
// url
$url = add_query_arg( 'keys', implode('+', $keys), $this->get_url() );
// redirect
wp_redirect( $url );
exit;
}
/**
* load
*
* description
*
* @date 21/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function load() {
// active
if( $this->is_active() ) {
// get selected keys
$selected = $this->get_selected_keys();
// add notice
if( $selected ) {
$count = count($selected);
$message = sprintf( _n( 'Exported 1 field group.', 'Exported %s field groups.', $count, 'acf' ), $count );
acf_add_admin_notice( $message );
}
}
}
/**
* html
*
* This function will output the metabox HTML
*
* @date 10/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html() {
// single (generate PHP)
if( $this->is_active() ) {
$this->html_single();
// archive
} else {
$this->html_archive();
}
}
/**
* html_field_selection
*
* description
*
* @date 24/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html_field_selection() {
// vars
$choices = array();
$selected = $this->get_selected_keys();
$field_groups = acf_get_field_groups();
// loop
if( $field_groups ) {
foreach( $field_groups as $field_group ) {
$choices[ $field_group['key'] ] = esc_html( $field_group['title'] );
}
}
// render
acf_render_field_wrap(array(
'label' => __('Select Field Groups', 'acf'),
'type' => 'checkbox',
'name' => 'keys',
'prefix' => false,
'value' => $selected,
'toggle' => true,
'choices' => $choices,
));
}
/**
* html_panel_selection
*
* description
*
* @date 21/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html_panel_selection() {
?>
<div class="acf-panel acf-panel-selection">
<h3 class="acf-panel-title"><?php _e('Select Field Groups', 'acf') ?> <i class="dashicons dashicons-arrow-right"></i></h3>
<div class="acf-panel-inside">
<?php $this->html_field_selection(); ?>
</div>
</div>
<?php
}
/**
* html_panel_settings
*
* description
*
* @date 21/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html_panel_settings() {
?>
<div class="acf-panel acf-panel-settings">
<h3 class="acf-panel-title"><?php _e('Settings', 'acf') ?> <i class="dashicons dashicons-arrow-right"></i></h3>
<div class="acf-panel-inside">
<?php
/*
acf_render_field_wrap(array(
'label' => __('Empty settings', 'acf'),
'type' => 'select',
'name' => 'minimal',
'prefix' => false,
'value' => '',
'choices' => array(
'all' => 'Include all settings',
'minimal' => 'Ignore empty settings'
)
));
*/
?>
</div>
</div>
<?php
}
/**
* html_archive
*
* description
*
* @date 20/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html_archive() {
?>
<p><?php _e('Select the field groups you would like to export and then select your export method. Use the download button to export to a .json file which you can then import to another ACF installation. Use the generate button to export to PHP code which you can place in your theme.', 'acf'); ?></p>
<div class="acf-fields">
<?php $this->html_field_selection(); ?>
</div>
<p class="acf-submit">
<button type="submit" name="action" class="button button-primary" value="download"><?php _e('Export File', 'acf'); ?></button>
<button type="submit" name="action" class="button" value="generate"><?php _e('Generate PHP', 'acf'); ?></button>
</p>
<?php
}
/**
* html_single
*
* description
*
* @date 20/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html_single() {
?>
<div class="acf-postbox-columns">
<div class="acf-postbox-main">
<?php $this->html_generate(); ?>
</div>
<div class="acf-postbox-side">
<?php $this->html_panel_selection(); ?>
<p class="acf-submit">
<button type="submit" name="action" class="button button-primary" value="generate"><?php _e('Generate PHP', 'acf'); ?></button>
</p>
</div>
</div>
<?php
}
/**
* html_generate
*
* description
*
* @date 17/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function html_generate() {
// prevent default translation and fake __() within string
acf_update_setting('l10n_var_export', true);
// vars
$json = $this->get_selected();
$str_replace = array(
" " => "\t",
"'!!__(!!\'" => "__('",
"!!\', !!\'" => "', '",
"!!\')!!'" => "')",
"array (" => "array("
);
$preg_replace = array(
'/([\t\r\n]+?)array/' => 'array',
'/[0-9]+ => array/' => 'array'
);
?>
<p><?php _e("The following code can be used to register a local version of the selected field group(s). A local field group can provide many benefits such as faster load times, version control & dynamic fields/settings. Simply copy and paste the following code to your theme's functions.php file or include it within an external file.", 'acf'); ?></p>
<textarea id="acf-export-textarea" readonly="true"><?php
echo "if( function_exists('acf_add_local_field_group') ):" . "\r\n" . "\r\n";
foreach( $json as $field_group ) {
// code
$code = var_export($field_group, true);
// change double spaces to tabs
$code = str_replace( array_keys($str_replace), array_values($str_replace), $code );
// correctly formats "=> array("
$code = preg_replace( array_keys($preg_replace), array_values($preg_replace), $code );
// esc_textarea
$code = esc_textarea( $code );
// echo
echo "acf_add_local_field_group({$code});" . "\r\n" . "\r\n";
}
echo "endif;";
?></textarea>
<p class="acf-submit">
<a class="button" id="acf-export-copy"><?php _e( 'Copy to clipboard', 'acf' ); ?></a>
</p>
<script type="text/javascript">
(function($){
// vars
var $a = $('#acf-export-copy');
var $textarea = $('#acf-export-textarea');
// remove $a if 'copy' is not supported
if( !document.queryCommandSupported('copy') ) {
return $a.remove();
}
// event
$a.on('click', function( e ){
// prevent default
e.preventDefault();
// select
$textarea.get(0).select();
// try
try {
// copy
var copy = document.execCommand('copy');
if( !copy ) return;
// tooltip
acf.tooltip.temp('Copied', $a);
} catch (err) {
// do nothing
}
});
})(jQuery);
</script>
<?php
}
/**
* get_selected_keys
*
* This function will return an array of field group keys that have been selected
*
* @date 20/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
function get_selected_keys() {
// check $_POST
if( $keys = acf_maybe_get_POST('keys') ) {
return (array) $keys;
}
// check $_GET
if( $keys = acf_maybe_get_GET('keys') ) {
$keys = str_replace(' ', '+', $keys);
return explode('+', $keys);
}
// return
return false;
}
/**
* get_selected
*
* This function will return the JSON data for given $_POST args
*
* @date 17/10/17
* @since 5.6.3
*
* @param n/a
* @return array
*/
function get_selected() {
// vars
$selected = $this->get_selected_keys();
$json = array();
// bail early if no keys
if( !$selected ) return false;
// construct JSON
foreach( $selected as $key ) {
// load field group
$field_group = acf_get_field_group( $key );
// validate field group
if( empty($field_group) ) continue;
// load fields
$field_group['fields'] = acf_get_fields( $field_group );
// prepare for export
$field_group = acf_prepare_field_group_for_export( $field_group );
// add to json array
$json[] = $field_group;
}
// return
return $json;
}
}
// initialize
acf_register_admin_tool( 'acf_admin_tool_export' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,277 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
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() {
// vars
$choices = array();
$field_groups = acf_get_field_groups();
// loop
if( $field_groups ) {
foreach( $field_groups as $field_group ) {
$choices[ $field_group['key'] ] = esc_html( $field_group['title'] );
}
}
// 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',
));
?>
</div>
<p class="acf-submit">
<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() {
// validate
if( empty($_FILES['acf_import_file']['size']) ) {
acf_add_admin_notice( __("No file selected", 'acf') , 'error');
return;
}
// vars
$file = $_FILES['acf_import_file'];
// validate error
if( $file['error'] ) {
acf_add_admin_notice(__('Error uploading file. Please try again', 'acf'), 'error');
return;
}
// validate type
if( pathinfo($file['name'], PATHINFO_EXTENSION) !== 'json' ) {
acf_add_admin_notice(__('Incorrect file type', 'acf'), 'error');
return;
}
// read file
$json = file_get_contents( $file['tmp_name'] );
// decode json
$json = json_decode($json, true);
// validate json
if( empty($json) ) {
acf_add_admin_notice(__('Import file empty', 'acf'), 'error');
return;
}
// if importing an auto-json, wrap field group in array
if( isset($json['key']) ) {
$json = array( $json );
}
// vars
$ids = array();
$keys = array();
$imported = array();
// populate keys
foreach( $json as $field_group ) {
// append key
$keys[] = $field_group['key'];
}
// look for existing ids
foreach( $keys as $key ) {
// attempt find ID
$field_group = _acf_get_field_group_by_key( $key );
// bail early if no field group
if( !$field_group ) continue;
// append
$ids[ $key ] = $field_group['ID'];
}
// enable local
acf_enable_local();
// reset local (JSON class has already included .json field groups which may conflict)
acf_reset_local();
// add local field groups
foreach( $json as $field_group ) {
// add field group
acf_add_local_field_group( $field_group );
}
// loop over keys
foreach( $keys as $key ) {
// vars
$field_group = acf_get_local_field_group( $key );
// attempt get id
$id = acf_maybe_get( $ids, $key );
if( $id ) {
$field_group['ID'] = $id;
}
// append fields
if( acf_have_local_fields($key) ) {
$field_group['fields'] = acf_get_local_fields( $key );
}
// import
$field_group = acf_import_field_group( $field_group );
// append message
$imported[] = array(
'ID' => $field_group['ID'],
'title' => $field_group['title'],
'updated' => $id ? 1 : 0
);
}
// messages
if( !empty($imported) ) {
// vars
$links = array();
$count = count($imported);
$message = sprintf(_n( 'Imported 1 field group', 'Imported %s field groups', $count, 'acf' ), $count) . '.';
// populate links
foreach( $imported as $import ) {
$links[] = '<a href="' . admin_url("post.php?post={$import['ID']}&action=edit") . '" target="_blank">' . $import['title'] . '</a>';
}
// append links
$message .= ' ' . implode(', ', $links);
// add notice
acf_add_admin_notice( $message );
}
}
}
// initialize
acf_register_admin_tool( 'acf_admin_tool_import' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,195 @@
<?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() {
}
}
endif; // class_exists check
?>

View File

@@ -0,0 +1,161 @@
<?php
// vars
$disabled = false;
// empty
if( empty($field['conditional_logic']) ) {
$disabled = true;
$field['conditional_logic'] = array(
// group 0
array(
// rule 0
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>
</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' => 'conditional-toggle',
));
?>
<div class="rule-groups" <?php if($disabled): ?>style="display:none;"<?php endif; ?>>
<?php foreach( $field['conditional_logic'] as $group_id => $group ):
// validate
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');
?>
<div class="rule-group" data-id="<?php echo $group_id; ?>">
<h4><?php echo $h4; ?></h4>
<table class="acf-table -clear">
<tbody>
<?php foreach( $group as $rule_id => $rule ):
// valid rule
$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}]";
?>
<tr class="rule" data-id="<?php echo $rule_id; ?>">
<td class="param">
<?php
$choices = array();
$choices[ $rule['field'] ] = $rule['field'];
// create field
acf_render_field(array(
'type' => 'select',
'prefix' => $prefix,
'name' => 'field',
'value' => $rule['field'],
'choices' => $choices,
'class' => 'conditional-rule-param',
'disabled' => $disabled,
));
?>
</td>
<td class="operator">
<?php
$choices = array(
'==' => __("is equal to",'acf'),
'!=' => __("is not equal to",'acf'),
);
// create field
acf_render_field(array(
'type' => 'select',
'prefix' => $prefix,
'name' => 'operator',
'value' => $rule['operator'],
'choices' => $choices,
'class' => 'conditional-rule-operator',
'disabled' => $disabled,
));
?>
</td>
<td class="value">
<?php
$choices = array();
$choices[ $rule['value'] ] = $rule['value'];
// create field
acf_render_field(array(
'type' => 'select',
'prefix' => $prefix,
'name' => 'value',
'value' => $rule['value'],
'choices' => $choices,
'class' => 'conditional-rule-value',
'disabled' => $disabled,
));
?>
</td>
<td class="add">
<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>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endforeach; ?>
<h4><?php _e("or",'acf'); ?></h4>
<a href="#" class="button add-conditional-group"><?php _e("Add rule group",'acf'); ?></a>
</div>
</td>
</tr>

View File

@@ -0,0 +1,186 @@
<?php
// add prefix
$field['prefix'] = "acf_fields[{$field['ID']}]";
// vars
$atts = array(
'class' => "acf-field-object acf-field-object-{$field['type']}",
'data-id' => $field['ID'],
'data-key' => $field['key'],
'data-type' => $field['type'],
);
$meta = array(
'ID' => $field['ID'],
'key' => $field['key'],
'parent' => $field['parent'],
'menu_order' => $field['menu_order'],
'save' => '',
);
// class
$atts['class'] = str_replace('_', '-', $atts['class']);
?>
<div <?php echo acf_esc_attr( $atts ); ?>>
<div class="meta">
<?php foreach( $meta as $k => $v ):
acf_hidden_input(array( 'class' => "input-{$k}", 'name' => "{$field['prefix']}[{$k}]", 'value' => $v ));
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>
</li>
<li class="li-field-label">
<strong>
<a class="edit-field" title="<?php _e("Edit field",'acf'); ?>" href="#"><?php echo acf_get_field_label($field); ?></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>
</div>
</li>
<li class="li-field-name"><?php echo $field['name']; ?></li>
<li class="li-field-key"><?php echo $field['key']; ?></li>
<li class="li-field-type"><?php echo acf_get_field_type_label($field['type']); ?></li>
</ul>
</div>
<div class="settings">
<table class="acf-table">
<tbody>
<?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);
// 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);
// type
acf_render_field_setting($field, array(
'label' => __('Field Type','acf'),
'instructions' => '',
'type' => 'select',
'name' => 'type',
'choices' => acf_get_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);
// required
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);
// type specific settings
do_action("acf/render_field_settings/type={$field['type']}", $field);
// conditional logic
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');
?>
<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>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@@ -0,0 +1,52 @@
<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>
</ul>
<div class="acf-field-list">
<div class="no-fields-message" <?php if( $fields ){ echo 'style="display:none;"'; } ?>>
<?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 ));
endforeach;
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>
</li>
</ul>
<?php if( !$parent ):
// get clone
$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 )); ?>
</script>
<?php endif;?>
</div>

View File

@@ -0,0 +1,45 @@
<?php
// global
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>
</div>
<div class="acf-input">
<div class="rule-groups">
<?php foreach( $field_group['location'] as $i => $group ):
// bail ealry if no group
if( empty($group) ) return;
// view
acf_get_view('html-location-group', array(
'group' => $group,
'group_id' => "group_{$i}"
));
endforeach; ?>
<h4><?php _e("or",'acf'); ?></h4>
<a href="#" class="button add-location-group"><?php _e("Add rule group",'acf'); ?></a>
</div>
</div>
</div>
<script type="text/javascript">
if( typeof acf !== 'undefined' ) {
acf.postbox.render({
'id': 'acf-field-group-locations',
'label': 'left'
});
}
</script>

View File

@@ -0,0 +1,150 @@
<?php
// 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'),
));
// 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'),
)
));
// 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'
));
// 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'),
)
));
// 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'),
)
));
// 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'],
));
// hide on screen
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' => 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'),
)
));
// 3rd party settings
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']; ?>" />
</div>
<script type="text/javascript">
if( typeof acf !== 'undefined' ) {
acf.postbox.render({
'id': 'acf-field-group-options',
'label': 'left'
});
}
</script>

View File

@@ -0,0 +1,27 @@
<?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
*/
$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(); ?>">Back to all tools</a><?php endif; ?></h1>
<div class="acf-meta-box-wrap -<?php echo $class; ?>">
<?php do_meta_boxes( $screen_id, 'normal', '' ); ?>
</div>
</div>

View File

@@ -0,0 +1,27 @@
<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>
<table class="acf-table -clear">
<tbody>
<?php foreach( $group as $i => $rule ):
// append id
$rule['id'] = "rule_{$i}";
$rule['group'] = $group_id;
// valid rule
$rule = acf_get_valid_location_rule($rule);
// view
acf_get_view('html-location-rule', array(
'rule' => $rule
));
endforeach; ?>
</tbody>
</table>
</div>

View File

@@ -0,0 +1,85 @@
<tr data-id="<?php echo $rule['id']; ?>">
<td class="param">
<?php
// vars
$choices = acf_get_location_rule_types();
// array
if( is_array($choices) ) {
acf_render_field(array(
'type' => 'select',
'name' => 'param',
'prefix' => $rule['prefix'],
'value' => $rule['param'],
'choices' => $choices,
'class' => 'refresh-location-rule'
));
}
?>
</td>
<td class="operator">
<?php
// vars
$choices = acf_get_location_rule_operators( $rule );
// array
if( is_array($choices) ) {
acf_render_field(array(
'type' => 'select',
'name' => 'operator',
'prefix' => $rule['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' => $rule['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>
</td>
<td class="remove">
<a href="#" class="acf-icon -minus remove-location-rule"></a>
</td>
</tr>

View File

@@ -0,0 +1,235 @@
<?php
// vars
$button = __('Upgrade Sites');
?>
<div id="acf-upgrade-wrap" class="wrap">
<h1><?php _e("Advanced Custom Fields Database Upgrade",'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'), '"' . $button . '"'); ?></p>
<p><input type="submit" name="upgrade" value="<?php echo $button; ?>" class="button" id="upgrade-sites"></p>
<table class="wp-list-table widefat">
<thead>
<tr>
<td class="manage-column check-column" scope="col"><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></th>
<th><?php _e("Description", 'acf'); ?></th>
</tr>
</thead>
<tfoot>
<tr>
<td class="manage-column check-column" scope="col"><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></th>
<th><?php _e("Description", 'acf'); ?></th>
</tr>
</tfoot>
<tbody id="the-list">
<?php foreach( $sites as $i => $site ): ?>
<tr<?php if( $i % 2 == 0 ): ?> class="alternate"<?php endif; ?>>
<th class="check-column" scope="row">
<?php if( $site['updates'] ): ?>
<input type="checkbox" value="<?php echo $site['blog_id']; ?>" name="checked[]">
<?php endif; ?>
</th>
<td>
<strong><?php echo $site['name']; ?></strong><br /><?php echo $site['url']; ?>
</td>
<td>
<?php if( $site['updates'] ): ?>
<span class="response"><?php printf(__('Site requires database upgrade from %s to %s', 'acf'), $site['acf_version'], $plugin_version); ?></span>
<?php else: ?>
<?php _e("Site is up to date", 'acf'); ?>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<p><input type="submit" name="upgrade" value="<?php echo $button; ?>" 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>
<style type="text/css">
/* hide show */
.show-on-complete {
display: none;
}
</style>
<script type="text/javascript">
(function($) {
var upgrader = {
$buttons: null,
$inputs: null,
i: 0,
init : function(){
// reference
var self = this;
// vars
this.$buttons = $('#upgrade-sites, #upgrade-sites-2');
// events
this.$buttons.on('click', function( e ){
// prevent default
e.preventDefault();
// confirm
var answer = 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'); ?>");
// bail early if no confirm
if( !answer ) {
return;
}
// populate inputs
self.$inputs = $('#the-list input:checked');
// upgrade
self.upgrade();
});
// return
return this;
},
upgrade: function(){
// reference
var self = this;
// bail early if no sites
if( !this.$inputs.length ) {
return;
}
// complete
if( this.i >= this.$inputs.length ) {
this.complete();
return;
}
// disable buttons
this.$buttons.attr('disabled', 'disabled');
// vars
var $input = this.$inputs.eq( this.i ),
$tr = $input.closest('tr'),
text = '<?php _e('Upgrade complete', 'acf'); ?>';
// add loading
$tr.find('.response').html('<i class="acf-loading"></i></span> <?php printf(__('Upgrading data to version %s', 'acf'), $plugin_version); ?>');
// get results
var xhr = $.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
dataType: 'json',
type: 'post',
data: {
action: 'acf/admin/db_update',
nonce: '<?php echo wp_create_nonce('acf_db_update'); ?>',
blog_id: $input.val(),
},
success: function( json ){
// remove input
$input.prop('checked', false);
$input.remove();
// vars
var message = acf.get_ajax_message(json);
// bail early if no message text
if( !message.text ) {
return;
}
// update text
text = '<pre>' + message.text + '</pre>';
},
complete: function(){
$tr.find('.response').html( text );
// upgrade next site
self.next();
}
});
},
next: function(){
this.i++;
this.upgrade();
},
complete: function(){
// enable buttons
this.$buttons.removeAttr('disabled');
// show message
$('.show-on-complete').show();
}
}.init();
})(jQuery);
</script>
</div>

View File

@@ -0,0 +1,57 @@
<?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');
}
?>
<div id="acf-upgrade-notice">
<div class="inner">
<div class="acf-icon logo">
<i class="acf-sprite-logo"></i>
</div>
<div class="content">
<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("Before you start using the new awesome features, please update your database to the newest version.", 'acf'); ?></p>
<?php if( !empty($plugins) ): ?>
<p><?php printf(__("Please also ensure any premium add-ons (%s) have first been updated to the latest version.", 'acf'), implode(', ', $plugins) ); ?></p>
<?php endif; ?>
<p><a id="acf-notice-action" href="<?php echo $button_url; ?>" class="button button-primary"><?php echo $button_text; ?></a></p>
<?php if( $confirm ): ?>
<script type="text/javascript">
(function($) {
$("#acf-notice-action").on("click", function(){
var answer = 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 answer;
});
})(jQuery);
</script>
<?php endif; ?>
</div>
<div class="clear"></div>
</div>
</div>

View File

@@ -0,0 +1,109 @@
<div id="acf-upgrade-wrap" class="wrap">
<h1><?php _e("Advanced Custom Fields Database Upgrade",'acf'); ?></h1>
<?php if( $updates ): ?>
<p><?php _e('Reading upgrade tasks...', 'acf'); ?></p>
<p class="show-on-ajax"><i class="acf-loading"></i> <?php printf(__('Upgrading data to version %s', 'acf'), $plugin_version); ?></p>
<p class="show-on-complete"><?php echo sprintf( __('Database Upgrade complete. <a href="%s">See what\'s new</a>', 'acf' ), admin_url('edit.php?post_type=acf-field-group&page=acf-settings-info') ); ?></p>
<style type="text/css">
/* hide show */
.show-on-ajax,
.show-on-complete {
display: none;
}
</style>
<script type="text/javascript">
(function($) {
var upgrader = {
init: function(){
// reference
var self = this;
// allow user to read message for 1 second
setTimeout(function(){
self.upgrade();
}, 1000);
// return
return this;
},
upgrade: function(){
// reference
var self = this;
// show message
$('.show-on-ajax').show();
// get results
var xhr = $.ajax({
url: '<?php echo admin_url('admin-ajax.php'); ?>',
dataType: 'json',
type: 'post',
data: {
action: 'acf/admin/db_update',
nonce: '<?php echo wp_create_nonce('acf_db_update'); ?>'
},
success: function( json ){
// vars
var message = acf.get_ajax_message(json);
// bail early if no message text
if( !message.text ) {
return;
}
// show message
$('.show-on-ajax').html( message.text );
},
complete: function( json ){
// remove spinner
$('.acf-loading').hide();
// show complete
$('.show-on-complete').show();
}
});
}
}.init();
})(jQuery);
</script>
<?php else: ?>
<p><?php _e('No updates available.', 'acf'); ?></p>
<?php endif; ?>
</div>

View File

@@ -0,0 +1,54 @@
<div class="wrap acf-settings-wrap">
<h1><?php _e("Add-ons",'acf'); ?></h1>
<div class="add-ons-list">
<?php if( !empty($json) ): ?>
<?php foreach( $json as $addon ):
$addon = wp_parse_args($addon, array(
"title" => "",
"slug" => "",
"description" => "",
"thumbnail" => "",
"url" => "",
"btn" => __("Download & Install",'acf'),
"btn_color" => ""
));
?>
<div class="acf-box add-on add-on-<?php echo $addon['slug']; ?>">
<div class="thumbnail">
<a target="_blank" href="<?php echo $addon['url']; ?>">
<img src="<?php echo $addon['thumbnail']; ?>" />
</a>
</div>
<div class="inner">
<h3><a target="_blank" href="<?php echo $addon['url']; ?>"><?php echo $addon['title']; ?></a></h3>
<p><?php echo $addon['description']; ?></p>
</div>
<div class="footer">
<?php if( apply_filters("acf/is_add_on_active/slug={$addon['slug']}", false ) ): ?>
<a class="button" disabled="disabled"><?php _e("Installed",'acf'); ?></a>
<?php else: ?>
<a class="button <?php echo $addon['btn_color']; ?>" target="_blank" href="<?php echo $addon['url']; ?>" ><?php _e($addon['btn']); ?></a>
<?php endif; ?>
<?php if( !empty($addon['footer']) ): ?>
<p><?php echo $addon['footer']; ?></p>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>

View File

@@ -0,0 +1,183 @@
<div class="wrap about-wrap acf-wrap">
<h1><?php _e("Welcome to Advanced Custom Fields",'acf'); ?> <?php echo $version; ?></h1>
<div class="about-text"><?php printf(__("Thank you for updating! ACF %s is bigger and better than ever before. We hope you like it.", 'acf'), $version); ?></div>
<div class="acf-icon logo">
<i class="acf-sprite-logo"></i>
</div>
<h2 class="nav-tab-wrapper">
<?php foreach( $tabs as $tab_slug => $tab_title ): ?>
<a class="nav-tab<?php if( $active == $tab_slug ): ?> nav-tab-active<?php endif; ?>" href="<?php echo admin_url("edit.php?post_type=acf-field-group&page=acf-settings-info&tab={$tab_slug}"); ?>"><?php echo $tab_title; ?></a>
<?php endforeach; ?>
</h2>
<?php if( $active == 'new' ): ?>
<h2 class="about-headline-callout"><?php _e("A smoother custom field experience", 'acf'); ?></h2>
<div class="feature-section acf-three-col">
<div>
<img src="https://assets.advancedcustomfields.com/info/5.0.0/select2.png">
<h3><?php _e("Improved Usability", 'acf'); ?></h3>
<p><?php _e("Including the popular Select2 library has improved both usability and speed across a number of field types including post object, page link, taxonomy and select.", 'acf'); ?></p>
</div>
<div>
<img src="https://assets.advancedcustomfields.com/info/5.0.0/design.png">
<h3><?php _e("Improved Design", 'acf'); ?></h3>
<p><?php _e("Many fields have undergone a visual refresh to make ACF look better than ever! Noticeable changes are seen on the gallery, relationship and oEmbed (new) fields!", 'acf'); ?></p>
</div>
<div>
<img src="https://assets.advancedcustomfields.com/info/5.0.0/sub-fields.png">
<h3><?php _e("Improved Data", 'acf'); ?></h3>
<p><?php _e("Redesigning the data architecture has allowed sub fields to live independently from their parents. This allows you to drag and drop fields in and out of parent fields!", 'acf'); ?></p>
</div>
</div>
<hr />
<h2 class="about-headline-callout"><?php _e("Goodbye Add-ons. Hello PRO", 'acf'); ?></h2>
<div class="feature-section acf-three-col">
<div>
<h3><?php _e("Introducing ACF PRO", 'acf'); ?></h3>
<p><?php _e("We're changing the way premium functionality is delivered in an exciting way!", 'acf'); ?></p>
<p><?php printf(__('All 4 premium add-ons have been combined into a new <a href="%s">Pro version of ACF</a>. With both personal and developer licenses available, premium functionality is more affordable and accessible than ever before!', 'acf'), esc_url('https://www.advancedcustomfields.com/pro')); ?></p>
</div>
<div>
<h3><?php _e("Powerful Features", 'acf'); ?></h3>
<p><?php _e("ACF PRO contains powerful features such as repeatable data, flexible content layouts, a beautiful gallery field and the ability to create extra admin options pages!", 'acf'); ?></p>
<p><?php printf(__('Read more about <a href="%s">ACF PRO features</a>.', 'acf'), esc_url('https://www.advancedcustomfields.com/pro')); ?></p>
</div>
<div>
<h3><?php _e("Easy Upgrading", 'acf'); ?></h3>
<p><?php printf(__('To help make upgrading easy, <a href="%s">login to your store account</a> and claim a free copy of ACF PRO!', 'acf'), esc_url('https://www.advancedcustomfields.com/my-account/')); ?></p>
<p><?php printf(__('We also wrote an <a href="%s">upgrade guide</a> to answer any questions, but if you do have one, please contact our support team via the <a href="%s">help desk</a>', 'acf'), esc_url('https://www.advancedcustomfields.com/resources/updates/upgrading-v4-v5/'), esc_url('https://support.advancedcustomfields.com')); ?>
</div>
</div>
<hr />
<h2 class="about-headline-callout"><?php _e("Under the Hood", 'acf'); ?></h2>
<div class="feature-section acf-three-col">
<div>
<h4><?php _e("Smarter field settings", 'acf'); ?></h4>
<p><?php _e("ACF now saves its field settings as individual post objects", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("More AJAX", 'acf'); ?></h4>
<p><?php _e("More fields use AJAX powered search to speed up page loading", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("Local JSON", 'acf'); ?></h4>
<p><?php _e("New auto export to JSON feature improves speed", 'acf'); ?></p>
</div>
<br />
<div>
<h4><?php _e("Better version control", 'acf'); ?></h4>
<p><?php _e("New auto export to JSON feature allows field settings to be version controlled", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("Swapped XML for JSON", 'acf'); ?></h4>
<p><?php _e("Import / Export now uses JSON in favour of XML", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("New Forms", 'acf'); ?></h4>
<p><?php _e("Fields can now be mapped to comments, widgets and all user forms!", 'acf'); ?></p>
</div>
<br />
<div>
<h4><?php _e("New Field", 'acf'); ?></h4>
<p><?php _e("A new field for embedding content has been added", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("New Gallery", 'acf'); ?></h4>
<p><?php _e("The gallery field has undergone a much needed facelift", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("New Settings", 'acf'); ?></h4>
<p><?php _e("Field group settings have been added for label placement and instruction placement", 'acf'); ?></p>
</div>
<br />
<div>
<h4><?php _e("Better Front End Forms", 'acf'); ?></h4>
<p><?php _e("acf_form() can now create a new post on submission", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("Better Validation", 'acf'); ?></h4>
<p><?php _e("Form validation is now done via PHP + AJAX in favour of only JS", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("Relationship Field", 'acf'); ?></h4>
<p><?php _e("New Relationship field setting for 'Filters' (Search, Post Type, Taxonomy)", 'acf'); ?></p>
</div>
<br />
<div>
<h4><?php _e("Moving Fields", 'acf'); ?></h4>
<p><?php _e("New field group functionality allows you to move a field between groups & parents", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("Page Link", 'acf'); ?></h4>
<p><?php _e("New archives group in page_link field selection", 'acf'); ?></p>
</div>
<div>
<h4><?php _e("Better Options Pages", 'acf'); ?></h4>
<p><?php _e("New functions for options page allow creation of both parent and child menu pages", 'acf'); ?></p>
</div>
</div>
<?php elseif( $active == 'changelog' ): ?>
<p class="about-description"><?php printf(__("We think you'll love the changes in %s.", 'acf'), $version); ?></p>
<?php
$items = file_get_contents( acf_get_path('readme.txt') );
$items = explode('= ' . $version . ' =', $items);
$items = end( $items );
$items = current( explode("\n\n", $items) );
$items = array_filter( array_map('trim', explode("*", $items)) );
?>
<ul class="changelog">
<?php foreach( $items as $item ):
$item = explode('http', $item);
?>
<li><?php echo $item[0]; ?><?php if( isset($item[1]) ): ?><a href="http<?php echo $item[1]; ?>" target="_blank">[...]</a><?php endif; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>

View File

@@ -0,0 +1,86 @@
<?php
/*
* ACF AJAX Class
*
* All the logic for misc AJAX functionality
*
* @class acf_ajax
* @package ACF
* @subpackage Core
*/
if( ! class_exists('acf_ajax') ) :
class acf_ajax {
/*
* __construct
*
* This function will setup the class functionality
*
* @type function
* @date 5/03/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function __construct() {
// acf/update_user_setting
add_action( 'wp_ajax_acf/update_user_setting', array($this, 'update_user_setting') );
add_action( 'wp_ajax_nopriv_acf/update_user_setting', array($this, 'update_user_setting') );
}
/*
* update_user_setting
*
* This function will update a user setting
*
* @type function
* @date 15/07/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function update_user_setting() {
// options
$options = wp_parse_args( $_POST, array(
'name' => '',
'value' => '',
'nonce' => '',
));
// validate
if( ! wp_verify_nonce($options['nonce'], 'acf_nonce') || empty($options['name']) ) {
die('0');
}
// upadte setting
acf_update_user_setting( $options['name'], $options['value'] );
// return
die('1');
}
}
new acf_ajax();
endif;
?>

View File

@@ -0,0 +1,615 @@
<?php
/*
* acf_esc_html
*
* This function will encode <script> tags for safe output
*
* @type function
* @date 25/6/17
* @since 5.6.0
*
* @param string (string)
* @return (string)
*/
function acf_esc_html( $string = '' ) {
// cast
$string = (string) $string;
// replace
$string = str_replace('<script', htmlspecialchars('<script'), $string);
$string = str_replace('</script', htmlspecialchars('</script'), $string);
// return
return $string;
}
/**
* acf_clean_atts
*
* This function will remove empty attributes
*
* @date 3/10/17
* @since 5.6.3
*
* @param array $atts
* @return array
*/
function acf_clean_atts( $atts = array() ) {
// loop
foreach( $atts as $k => $v ) {
if( $v === '' ) unset( $atts[ $k ] );
}
// return
return $atts;
}
/**
* acf_get_atts
*
* This function will return an array of HTML attributes
*
* @date 2/10/17
* @since 5.6.3
*
* @param n/a
* @return n/a
*/
/*
function acf_get_atts( $array, $keys ) {
// vars
$atts = array();
// append attributes
foreach( $keys as $k ) {
if( isset($array[ $k ]) ) $atts[ $k ] = $array[ $k ];
}
// modify special attributes
foreach( array('readonly', 'disabled', 'required') as $k ) {
$atts[ $k ] = $atts[ $k ] ? $k : '';
}
// clean up blank attributes
foreach( $atts as $k => $v ) {
if( $v === '' ) unset( $atts[ $k ] );
}
// return
return $atts;
}
*/
/*
* acf_esc_atts
*
* This function will escape an array of attributes and return as HTML
*
* @type function
* @date 27/6/17
* @since 5.6.0
*
* @param $atts (array)
* @return (string)
*/
function acf_esc_atts( $atts = array() ) {
// vars
$html = '';
// loop
foreach( $atts as $k => $v ) {
// string
if( is_string($v) ) {
// don't trim value
if( $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);
}
// append
$html .= esc_attr( $k ) . '="' . esc_attr( $v ) . '" ';
}
// return
return trim( $html );
}
/*
* acf_esc_atts_e
*
* This function will echo acf_esc_atts
*
* @type function
* @date 27/6/17
* @since 5.6.0
*
* @param $atts (array)
* @return n/a
*/
function acf_esc_atts_e( $atts = array() ) {
echo acf_esc_atts( $atts );
}
/*
* acf_get_text_input
*
* This function will return HTML for a text input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_text_input( $atts = array() ) {
$atts['type'] = isset($atts['type']) ? $atts['type'] : 'text';
return '<input ' . acf_esc_atts( $atts ) . ' />';
}
/*
* acf_text_input
*
* This function will output HTML for a text input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_text_input( $atts = array() ) {
echo acf_get_text_input( $atts );
}
/*
* acf_get_hidden_input
*
* This function will return HTML for a hidden input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_hidden_input( $atts = array() ) {
$atts['type'] = 'hidden';
return acf_get_text_input( $atts );
}
/*
* acf_hidden_input
*
* This function will output HTML for a generic input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_hidden_input( $atts = array() ) {
echo acf_get_hidden_input( $atts ) . "\n";
}
/*
* acf_get_textarea_input
*
* This function will return HTML for a textarea input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_textarea_input( $atts = array() ) {
$value = acf_extract_var( $atts, 'value', '' );
return '<textarea ' . acf_esc_atts( $atts ) . '>' . esc_textarea( $value ) . '</textarea>';
}
/*
* acf_textarea_input
*
* This function will output HTML for a textarea input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_textarea_input( $atts = array() ) {
echo acf_get_textarea_input( $atts );
}
/*
* acf_get_checkbox_input
*
* This function will return HTML for a checkbox input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_checkbox_input( $atts = array() ) {
$label = acf_extract_var( $atts, 'label', '' );
$checked = acf_maybe_get( $atts, 'checked', '' );
$atts['type'] = acf_maybe_get( $atts, 'type', 'checkbox' );
return '<label' . ($checked ? ' class="selected"' : '') . '><input ' . acf_esc_attr( $atts ) . '/>' . acf_esc_html( $label ) . '</label>';
}
/*
* acf_checkbox_input
*
* This function will output HTML for a checkbox input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_checkbox_input( $atts = array() ) {
echo acf_get_checkbox_input( $atts );
}
/*
* acf_get_radio_input
*
* This function will return HTML for a radio input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_radio_input( $atts = array() ) {
$atts['type'] = 'radio';
return acf_get_checkbox_input( $atts );
}
/*
* acf_radio_input
*
* This function will output HTML for a radio input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_radio_input( $atts = array() ) {
echo acf_get_radio_input( $atts );
}
/*
* acf_get_select_input
*
* This function will return HTML for a select input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_select_input( $atts = array() ) {
// vars
$value = (array) acf_extract_var( $atts, 'value' );
$choices = (array) acf_extract_var( $atts, 'choices' );
// html
$html = '';
$html .= '<select ' . acf_esc_atts( $atts ) . '>' . "\n";
$html .= acf_walk_select_input( $choices, $value );
$html .= '</select>' . "\n";
// return
return $html;
}
/*
* acf_walk_select_input
*
* This function will return the HTML for a select input's choices
*
* @type function
* @date 27/6/17
* @since 5.6.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_walk_select_input( $choices = array(), $values = array(), $depth = 0 ) {
// bail ealry if no choices
if( empty($choices) ) return '';
// vars
$html = '';
// sanitize values for 'selected' matching
if( $depth == 0 ) {
$values = array_map('esc_attr', $values);
}
// loop
foreach( $choices as $value => $label ) {
// optgroup
if( is_array($label) ){
$html .= '<optgroup label="' . esc_attr($value) . '">' . "\n";
$html .= acf_walk_select_input( $label, $values, $depth+1 );
$html .= '</optgroup>';
// option
} else {
// vars
$atts = array( 'value' => $value );
$pos = array_search( esc_attr($value), $values );
// selected
if( $pos !== false ) {
$atts['selected'] = 'selected';
$atts['data-i'] = $pos;
}
// append
$html .= '<option ' . acf_esc_attr($atts) . '>' . esc_html($label) . '</option>' . "\n";
}
}
// return
return $html;
}
/*
* acf_select_input
*
* This function will output HTML for a select input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_select_input( $atts = array() ) {
echo acf_get_select_input( $atts );
}
/*
function acf_test_esc_html( $string = '' ) {
$s = '';
$time_start = microtime(true);
$s .= wp_kses_post( $string );
$s .= ' = ('. (microtime(true) - $time_start) .')';
$s .= '-----';
$time_start = microtime(true);
$s .= str_replace(array('<script', '</script'), array(htmlspecialchars('<script'), htmlspecialchars('</script')), $string);
$s .= ' = ('. (microtime(true) - $time_start) .')';
$time_start = microtime(true);
if( strpos($string, '<script') ) {
$s .= str_replace(array('<script', '</script'), array(htmlspecialchars('<script'), htmlspecialchars('</script')), $string);
}
$s .= ' = ('. (microtime(true) - $time_start) .')';
return $s;
}
*/
/*
* acf_get_file_input
*
* This function will return HTML for a file input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return (string)
*/
function acf_get_file_input( $atts = array() ) {
$atts['type'] = 'file';
return acf_get_text_input( $atts );
}
/*
* acf_file_input
*
* This function will output HTML for a file input
*
* @type function
* @date 3/02/2014
* @since 5.0.0
*
* @param $atts
* @return n/a
*/
function acf_file_input( $atts = array() ) {
echo acf_get_file_input( $atts );
}
/*
* acf_esc_attr
*
* Deprecated since 5.6.0
*
* @type function
* @date 1/10/13
* @since 5.0.0
*
* @param $atts (array)
* @return n/a
*/
function acf_esc_attr( $atts ) {
return acf_esc_atts( $atts );
}
/*
* acf_esc_attr_e
*
* Deprecated since 5.6.0
*
* @type function
* @date 1/10/13
* @since 5.0.0
*
* @param $atts (array)
* @return n/a
*/
function acf_esc_attr_e( $atts ) {
acf_esc_atts_e( $atts );
}
?>

View File

@@ -0,0 +1,524 @@
<?php
/*
* acf_get_metadata
*
* This function will get a value from the DB
*
* @type function
* @date 16/10/2015
* @since 5.2.3
*
* @param $post_id (mixed)
* @param $name (string)
* @param $hidden (boolean)
* @return $return (mixed)
*/
function acf_get_metadata( $post_id = 0, $name = '', $hidden = false ) {
// vars
$value = null;
$prefix = $hidden ? '_' : '';
// get post_id info
$info = acf_get_post_id_info($post_id);
// bail early if no $post_id (acf_form - new_post)
if( !$info['id'] ) return $value;
// option
if( $info['type'] === 'option' ) {
$name = $prefix . $post_id . '_' . $name;
$value = get_option( $name, null );
// meta
} else {
$name = $prefix . $name;
$meta = get_metadata( $info['type'], $info['id'], $name, false );
if( isset($meta[0]) ) {
$value = $meta[0];
}
}
// return
return $value;
}
/*
* acf_update_metadata
*
* This function will update a value from the DB
*
* @type function
* @date 16/10/2015
* @since 5.2.3
*
* @param $post_id (mixed)
* @param $name (string)
* @param $value (mixed)
* @param $hidden (boolean)
* @return $return (boolean)
*/
function acf_update_metadata( $post_id = 0, $name = '', $value = '', $hidden = false ) {
// vars
$return = false;
$prefix = $hidden ? '_' : '';
// get post_id info
$info = acf_get_post_id_info($post_id);
// bail early if no $post_id (acf_form - new_post)
if( !$info['id'] ) return $return;
// option
if( $info['type'] === 'option' ) {
$name = $prefix . $post_id . '_' . $name;
$return = acf_update_option( $name, $value );
// meta
} else {
$name = $prefix . $name;
$return = update_metadata( $info['type'], $info['id'], $name, $value );
}
// return
return $return;
}
/*
* acf_delete_metadata
*
* This function will delete a value from the DB
*
* @type function
* @date 16/10/2015
* @since 5.2.3
*
* @param $post_id (mixed)
* @param $name (string)
* @param $hidden (boolean)
* @return $return (boolean)
*/
function acf_delete_metadata( $post_id = 0, $name = '', $hidden = false ) {
// vars
$return = false;
$prefix = $hidden ? '_' : '';
// get post_id info
$info = acf_get_post_id_info($post_id);
// bail early if no $post_id (acf_form - new_post)
if( !$info['id'] ) return $return;
// option
if( $info['type'] === 'option' ) {
$name = $prefix . $post_id . '_' . $name;
$return = delete_option( $name );
// meta
} else {
$name = $prefix . $name;
$return = delete_metadata( $info['type'], $info['id'], $name );
}
// return
return $return;
}
/*
* acf_update_option
*
* This function is a wrapper for the WP update_option but provides logic for a 'no' autoload
*
* @type function
* @date 4/01/2014
* @since 5.0.0
*
* @param $option (string)
* @param $value (mixed)
* @param autoload (mixed)
* @return (boolean)
*/
function acf_update_option( $option = '', $value = '', $autoload = null ) {
// vars
$deprecated = '';
$return = false;
// autoload
if( $autoload === null ){
$autoload = acf_get_setting('autoload') ? 'yes' : 'no';
}
// for some reason, update_option does not use stripslashes_deep.
// update_metadata -> https://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/meta.php#L82: line 101 (does use stripslashes_deep)
// update_option -> https://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/option.php#L0: line 215 (does not use stripslashes_deep)
$value = stripslashes_deep($value);
// add or update
if( get_option($option) !== false ) {
$return = update_option( $option, $value );
} else {
$return = add_option( $option, $value, $deprecated, $autoload );
}
// return
return $return;
}
/*
* acf_get_value
*
* This function will load in a field's value
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param $post_id (int)
* @param $field (array)
* @return (mixed)
*/
function acf_get_value( $post_id = 0, $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;
//}
// vars
$cache_key = "get_value/post_id={$post_id}/name={$field['name']}";
// return early if cache is found
if( acf_isset_cache($cache_key) ) {
return acf_get_cache($cache_key);
}
// load value
$value = acf_get_metadata( $post_id, $field['name'] );
// if value was duplicated, it may now be a serialized string!
$value = maybe_unserialize( $value );
// no value? try default_value
if( $value === null && isset($field['default_value']) ) {
$value = $field['default_value'];
}
// filter for 3rd party customization
$value = apply_filters( "acf/load_value", $value, $post_id, $field );
$value = apply_filters( "acf/load_value/type={$field['type']}", $value, $post_id, $field );
$value = apply_filters( "acf/load_value/name={$field['_name']}", $value, $post_id, $field );
$value = apply_filters( "acf/load_value/key={$field['key']}", $value, $post_id, $field );
// update cache
acf_set_cache($cache_key, $value);
// return
return $value;
}
/*
* acf_format_value
*
* This function will format the value for front end use
*
* @type function
* @date 3/07/2014
* @since 5.0.0
*
* @param $value (mixed)
* @param $post_id (mixed)
* @param $field (array)
* @return $value
*/
function acf_format_value( $value, $post_id, $field ) {
// vars
$cache_key = "format_value/post_id={$post_id}/name={$field['name']}";
// return early if cache is found
if( acf_isset_cache($cache_key) ) {
return acf_get_cache($cache_key);
}
// apply filters
$value = apply_filters( "acf/format_value", $value, $post_id, $field );
$value = apply_filters( "acf/format_value/type={$field['type']}", $value, $post_id, $field );
$value = apply_filters( "acf/format_value/name={$field['_name']}", $value, $post_id, $field );
$value = apply_filters( "acf/format_value/key={$field['key']}", $value, $post_id, $field );
// update cache
acf_set_cache($cache_key, $value);
// return
return $value;
}
/*
* acf_update_value
*
* updates a value into the db
*
* @type action
* @date 23/01/13
*
* @param $value (mixed)
* @param $post_id (mixed)
* @param $field (array)
* @return (boolean)
*/
function acf_update_value( $value = null, $post_id = 0, $field ) {
// strip slashes
if( acf_get_setting('stripslashes') ) {
$value = stripslashes_deep($value);
}
// filter for 3rd party customization
$value = apply_filters( "acf/update_value", $value, $post_id, $field );
$value = apply_filters( "acf/update_value/type={$field['type']}", $value, $post_id, $field );
$value = apply_filters( "acf/update_value/name={$field['_name']}", $value, $post_id, $field );
$value = apply_filters( "acf/update_value/key={$field['key']}", $value, $post_id, $field );
// allow null to delete
if( $value === null ) {
return acf_delete_value( $post_id, $field );
}
// update value
$return = acf_update_metadata( $post_id, $field['name'], $value );
// update reference
acf_update_metadata( $post_id, $field['name'], $field['key'], true );
// clear cache
acf_delete_cache("get_value/post_id={$post_id}/name={$field['name']}");
acf_delete_cache("format_value/post_id={$post_id}/name={$field['name']}");
// return
return $return;
}
/*
* acf_delete_value
*
* This function will delete a value from the database
*
* @type function
* @date 28/09/13
* @since 5.0.0
*
* @param $post_id (mixed)
* @param $field (array)
* @return (boolean)
*/
function acf_delete_value( $post_id = 0, $field ) {
// action for 3rd party customization
do_action("acf/delete_value", $post_id, $field['name'], $field);
do_action("acf/delete_value/type={$field['type']}", $post_id, $field['name'], $field);
do_action("acf/delete_value/name={$field['_name']}", $post_id, $field['name'], $field);
do_action("acf/delete_value/key={$field['key']}", $post_id, $field['name'], $field);
// delete value
$return = acf_delete_metadata( $post_id, $field['name'] );
// delete reference
acf_delete_metadata( $post_id, $field['name'], true );
// clear cache
acf_delete_cache("get_value/post_id={$post_id}/name={$field['name']}");
acf_delete_cache("format_value/post_id={$post_id}/name={$field['name']}");
// return
return $return;
}
/*
* acf_copy_postmeta
*
* This function will copy postmeta from one post to another.
* Very useful for saving and restoring revisions
*
* @type function
* @date 25/06/2016
* @since 5.3.8
*
* @param $from_post_id (int)
* @param $to_post_id (int)
* @return n/a
*/
function acf_copy_postmeta( $from_post_id, $to_post_id ) {
// get all postmeta
$meta = get_post_meta( $from_post_id );
// bail early if no meta
if( !$meta ) return;
// loop
foreach( $meta as $name => $value ) {
// attempt to find key value
$key = acf_maybe_get( $meta, '_'.$name );
// bail ealry if no key
if( !$key ) continue;
// update vars
$value = $value[0];
$key = $key[0];
// bail early if $key is a not a field_key
if( !acf_is_field_key($key) ) continue;
// get_post_meta will return array before running maybe_unserialize
$value = maybe_unserialize( $value );
// add in slashes
// - update_post_meta will unslash the value, so we must first slash it to avoid losing backslashes
// - https://codex.wordpress.org/Function_Reference/update_post_meta#Character_Escaping
if( is_string($value) ) {
$value = wp_slash($value);
}
// update value
acf_update_metadata( $to_post_id, $name, $value );
acf_update_metadata( $to_post_id, $name, $key, true );
}
}
/*
* acf_preview_value
*
* This function will return a human freindly 'preview' for a given field value
*
* @type function
* @date 24/10/16
* @since 5.5.0
*
* @param $value (mixed)
* @param $post_id (mixed)
* @param $field (array)
* @return (string)
*/
function acf_preview_value( $value, $post_id, $field ) {
// apply filters
$value = apply_filters( "acf/preview_value", $value, $post_id, $field );
$value = apply_filters( "acf/preview_value/type={$field['type']}", $value, $post_id, $field );
$value = apply_filters( "acf/preview_value/name={$field['_name']}", $value, $post_id, $field );
$value = apply_filters( "acf/preview_value/key={$field['key']}", $value, $post_id, $field );
// return
return $value;
}
?>

View File

@@ -0,0 +1,445 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('acf_cache') ) :
class acf_cache {
// vars
var $reference = array(),
$active = true;
/*
* __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() {
// prevent ACF from persistent cache
wp_cache_add_non_persistent_groups('acf');
}
/*
* is_active
*
* This function will return true if caching is enabled
*
* @type function
* @date 26/6/17
* @since 5.6.0
*
* @param n/a
* @return (bool)
*/
function is_active() {
return $this->active;
}
/*
* enable
*
* This function will enable ACF caching
*
* @type function
* @date 26/6/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function enable() {
$this->active = true;
}
/*
* disable
*
* This function will disable ACF caching
*
* @type function
* @date 26/6/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function disable() {
$this->active = false;
}
/*
* get_key
*
* This function will check for references and modify the key
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param $key (string)
* @return $key
*/
function get_key( $key = '' ) {
// check for reference
if( isset($this->reference[ $key ]) ) {
$key = $this->reference[ $key ];
}
// return
return $key;
}
/*
* isset_cache
*
* This function will return true if a cached data exists for the given key
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param $key (string)
* @return (boolean)
*/
function isset_cache( $key = '' ) {
// bail early if not active
if( !$this->is_active() ) return false;
// vars
$key = $this->get_key($key);
$found = false;
// get cache
$cache = wp_cache_get($key, 'acf', false, $found);
// return
return $found;
}
/*
* get_cache
*
* This function will return cached data for a given key
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param $key (string)
* @return (mixed)
*/
function get_cache( $key = '' ) {
// bail early if not active
if( !$this->is_active() ) return false;
// vars
$key = $this->get_key($key);
$found = false;
// get cache
$cache = wp_cache_get($key, 'acf', false, $found);
// return
return $cache;
}
/*
* set_cache
*
* This function will set cached data for a given key
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param $key (string)
* @param $data (mixed)
* @return n/a
*/
function set_cache( $key = '', $data = '' ) {
// bail early if not active
if( !$this->is_active() ) return false;
// set
wp_cache_set($key, $data, 'acf');
// return
return $key;
}
/*
* set_cache_reference
*
* This function will set a reference to cached data for a given key
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param $key (string)
* @param $reference (string)
* @return n/a
*/
function set_cache_reference( $key = '', $reference = '' ) {
// bail early if not active
if( !$this->is_active() ) return false;
// add
$this->reference[ $key ] = $reference;
// resturn
return $key;
}
/*
* delete_cache
*
* This function will delete cached data for a given key
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param $key (string)
* @return n/a
*/
function delete_cache( $key = '' ) {
// bail early if not active
if( !$this->is_active() ) return false;
// delete
return wp_cache_delete( $key, 'acf' );
}
}
// initialize
acf()->cache = new acf_cache();
endif; // class_exists check
/*
* acf_is_cache_active
*
* alias of acf()->cache->is_active()
*
* @type function
* @date 26/6/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_is_cache_active() {
return acf()->cache->is_active();
}
/*
* acf_disable_cache
*
* alias of acf()->cache->disable()
*
* @type function
* @date 26/6/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_disable_cache() {
return acf()->cache->disable();
}
/*
* acf_enable_cache
*
* alias of acf()->cache->enable()
*
* @type function
* @date 26/6/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_enable_cache() {
return acf()->cache->enable();
}
/*
* acf_isset_cache
*
* alias of acf()->cache->isset_cache()
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_isset_cache( $key = '' ) {
return acf()->cache->isset_cache( $key );
}
/*
* acf_get_cache
*
* alias of acf()->cache->get_cache()
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_get_cache( $key = '' ) {
return acf()->cache->get_cache( $key );
}
/*
* acf_set_cache
*
* alias of acf()->cache->set_cache()
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_set_cache( $key = '', $data ) {
return acf()->cache->set_cache( $key, $data );
}
/*
* acf_set_cache_reference
*
* alias of acf()->cache->set_cache_reference()
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_set_cache_reference( $key = '', $reference = '' ) {
return acf()->cache->set_cache_reference( $key, $reference );
}
/*
* acf_delete_cache
*
* alias of acf()->cache->delete_cache()
*
* @type function
* @date 30/06/2016
* @since 5.4.0
*
* @param n/a
* @return n/a
*/
function acf_delete_cache( $key = '' ) {
return acf()->cache->delete_cache( $key );
}
?>

View File

@@ -0,0 +1,591 @@
<?php
class acf_compatibility {
/*
* __construct
*
* description
*
* @type function
* @date 30/04/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function __construct() {
// fields
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);
// field groups
add_filter('acf/validate_field_group', array($this, 'validate_field_group'), 20, 1);
}
/*
* validate_field
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $field
*/
function validate_field( $field ) {
// conditional logic has changed
if( isset($field['conditional_logic']['status']) ) {
// extract logic
$logic = acf_extract_var( $field, 'conditional_logic' );
// disabled
if( !empty($logic['status']) ) {
// reset
$field['conditional_logic'] = array();
// vars
$group = 0;
$all_or_any = $logic['allorany'];
// loop over rules
if( !empty($logic['rules']) ) {
foreach( $logic['rules'] as $rule ) {
// sperate groups?
if( $all_or_any == 'any' ) {
$group++;
}
// add to group
$field['conditional_logic'][ $group ][] = $rule;
}
}
// reset keys
$field['conditional_logic'] = array_values($field['conditional_logic']);
} else {
$field['conditional_logic'] = 0;
}
}
// return
return $field;
}
/*
* validate_relationship_field
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $field
*/
function validate_relationship_field( $field ) {
// force array
$field['post_type'] = acf_get_array($field['post_type']);
$field['taxonomy'] = acf_get_array($field['taxonomy']);
// 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();
}
// save_format is now return_format
if( !empty($field['result_elements']) ) {
$field['elements'] = acf_extract_var( $field, 'result_elements' );
}
// return
return $field;
}
/*
* validate_textarea_field
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $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_image_field
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $field
*/
function validate_image_field( $field ) {
// save_format is now return_format
if( !empty($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
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $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
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $field
*/
function validate_date_picker_field( $field ) {
// v4 used date_format
if( !empty($field['date_format']) ) {
// extract vars
$date_format = acf_extract_var( $field, 'date_format' );
$display_format = acf_extract_var( $field, 'display_format' );
// convert from js to php
//$date_format = acf_convert_date_to_php( $date_format );
$display_format = acf_convert_date_to_php( $display_format );
// bail early if already matches 'Ymd'
if( $date_format === 'yymmdd' ) return $field;
// append settings
$field['display_format'] = $display_format;
$field['save_format'] = $date_format;
}
// return
return $field;
}
/*
* validate_taxonomy_field
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $field
*/
function validate_taxonomy_field( $field ) {
// 5.2.7
if( isset($field['load_save_terms']) ) {
$field['save_terms'] = $field['load_save_terms'];
}
// return
return $field;
}
/*
* validate_date_time_picker_field
*
* This function will provide compatibility with existing 3rd party fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $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
*
* This function will provide compatibility with ACF4 fields
*
* @type function
* @date 23/04/2014
* @since 5.0.0
*
* @param $field (array)
* @return $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( !empty($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;
// add missing 'key' (v5.0.0)
if( empty($field_group['key']) ) {
// update version
$version = 4;
// add missing key
$field_group['key'] = empty($field_group['id']) ? uniqid('group_') : 'group_' . $field_group['id'];
}
// extract options (v5.0.0)
if( !empty($field_group['options']) ) {
$options = acf_extract_var($field_group, 'options');
$field_group = array_merge($field_group, $options);
}
// location rules changed to groups (v5.0.0)
if( !empty($field_group['location']['rules']) ) {
// extract location
$location = acf_extract_var( $field_group, 'location' );
// reset location
$field_group['location'] = array();
// vars
$group = 0;
$all_or_any = $location['allorany'];
// loop over rules
if( !empty($location['rules']) ) {
foreach( $location['rules'] as $rule ) {
// sperate groups?
if( $all_or_any == 'any' ) $group++;
// add to group
$field_group['location'][ $group ][] = $rule;
}
}
// reset keys
$field_group['location'] = array_values($field_group['location']);
}
// some location rules have changed (v5.0.0)
if( !empty($field_group['location']) ) {
// param changes
$replace = array(
'taxonomy' => 'post_taxonomy',
'ef_media' => 'attachment',
'ef_taxonomy' => 'taxonomy',
'ef_user' => 'user_role',
'user_type' => 'current_user_role' // 5.2.0
);
// remove conflicting param
if( $version == 5 ) {
unset($replace['taxonomy']);
}
// loop over location groups
foreach( $field_group['location'] as $i => $group ) {
// bail early if group is empty
if( empty($group) ) continue;
// loop over group rules
foreach( $group as $ii => $rule ) {
// migrate param
if( isset($replace[ $rule['param'] ]) ) {
$rule['param'] = $replace[ $rule['param'] ];
}
// update
$group[ $ii ] = $rule;
}
// update
$field_group['location'][ $i ] = $group;
}
}
// change layout to style (v5.0.0)
if( !empty($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;
}
}
new acf_compatibility();
?>

View File

@@ -0,0 +1,185 @@
<?php
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
if( ! class_exists('acf_deprecated') ) :
class acf_deprecated {
/*
* __construct
*
* This function will setup the class functionality
*
* @type function
* @date 30/1/17
* @since 5.5.6
*
* @param n/a
* @return n/a
*/
function __construct() {
// settings
add_filter('acf/settings/show_admin', array($this, 'acf_settings_show_admin'), 5, 1); // 5.0.0
add_filter('acf/settings/l10n_textdomain', array($this, 'acf_settings_l10n_textdomain'), 5, 1); // 5.3.3
add_filter('acf/settings/l10n_field', array($this, 'acf_settings_l10n_field'), 5, 1); // 5.3.3
add_filter('acf/settings/l10n_field_group', array($this, 'acf_settings_l10n_field'), 5, 1); // 5.3.3
// filters
add_filter('acf/validate_field', array($this, 'acf_validate_field'), 10, 1); // 5.5.6
add_filter('acf/validate_field_group', array($this, 'acf_validate_field_group'), 10, 1); // 5.5.6
add_filter('acf/validate_post_id', array($this, 'acf_validate_post_id'), 10, 2); // 5.5.6
}
/*
* acf_settings_show_admin
*
* This function will add compatibility for previously named hooks
*
* @type function
* @date 19/05/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function acf_settings_show_admin( $setting ) {
// 5.0.0 - removed ACF_LITE
return ( defined('ACF_LITE') && ACF_LITE ) ? false : $setting;
}
/*
* acf_settings_l10n_textdomain
*
* This function will add compatibility for previously named hooks
*
* @type function
* @date 19/05/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function acf_settings_l10n_textdomain( $setting ) {
// 5.3.3 - changed filter name
return acf_get_setting( 'export_textdomain', $setting );
}
/*
* acf_settings_l10n_field
*
* This function will add compatibility for previously named hooks
*
* @type function
* @date 19/05/2014
* @since 5.0.0
*
* @param n/a
* @return n/a
*/
function acf_settings_l10n_field( $setting ) {
// 5.3.3 - changed filter name
return acf_get_setting( 'export_translate', $setting );
}
/*
* acf_validate_field
*
* This function will add compatibility for previously named hooks
*
* @type function
* @date 30/1/17
* @since 5.5.6
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_validate_field( $field ) {
// 5.5.6 - changed filter name
$field = apply_filters( "acf/get_valid_field", $field );
$field = apply_filters( "acf/get_valid_field/type={$field['type']}", $field );
// return
return $field;
}
/*
* acf_validate_field_group
*
* This function will add compatibility for previously named hooks
*
* @type function
* @date 30/1/17
* @since 5.5.6
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_validate_field_group( $field_group ) {
// 5.5.6 - changed filter name
$field_group = apply_filters('acf/get_valid_field_group', $field_group);
// return
return $field_group;
}
/*
* acf_validate_post_id
*
* This function will add compatibility for previously named hooks
*
* @type function
* @date 6/2/17
* @since 5.5.6
*
* @param $post_id (int)
* @return $post_id (int)
*/
function acf_validate_post_id( $post_id, $_post_id ) {
// 5.5.6 - changed filter name
$post_id = apply_filters('acf/get_valid_post_id', $post_id, $_post_id);
// return
return $post_id;
}
}
// initialize
acf()->deprecated = new acf_deprecated();
endif; // class_exists check
?>

View File

@@ -0,0 +1,366 @@
<?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 store a field type class
*
* @type function
* @date 6/07/2016
* @since 5.4.0
*
* @param $class (string)
* @return n/a
*/
function register_field_type( $class ) {
if( $class instanceOf acf_field ) {
$this->types[ $class->name ] = $class;
} else {
$instance = new $class();
$this->types[ $instance->name ] = $instance;
}
}
/*
* get_field_type
*
* This function will return a field type class
*
* @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 avbove 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 type infos
*
* @type function
* @date 6/07/2016
* @since 5.4.0
*
* @param $name (string)
* @return (mixed)
*/
function get_field_types() {
// vars
$groups = array();
$l10n = array(
'basic' => __('Basic', 'acf'),
'content' => __('Content', 'acf'),
'choice' => __('Choice', 'acf'),
'relational' => __('Relational', 'acf'),
'jquery' => __('jQuery', 'acf'),
'layout' => __('Layout', 'acf'),
);
// loop
foreach( $this->types as $type ) {
// bail ealry if not public
if( !$type->public ) continue;
// translate
$cat = $type->category;
$cat = isset( $l10n[$cat] ) ? $l10n[$cat] : $cat;
// append
$groups[ $cat ][ $type->name ] = $type->label;
}
// filter
$groups = apply_filters('acf/get_field_types', $groups);
// return
return $groups;
}
}
// initialize
acf()->fields = new acf_fields();
endif; // class_exists check
/*
* acf_register_field_type
*
* alias of acf()->fields->register_field_type()
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_register_field_type( $class ) {
return acf()->fields->register_field_type( $class );
}
/*
* acf_get_field_type
*
* alias of acf()->fields->get_field_type()
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_get_field_type( $name ) {
return acf()->fields->get_field_type( $name );
}
/*
* acf_register_field_type_info
*
* alias of acf()->fields->register_field_type_info()
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_register_field_type_info( $info ) {
return acf()->fields->register_field_type_info( $info );
}
/*
* acf_get_field_types
*
* alias of acf()->fields->get_field_types()
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_get_field_types() {
return acf()->fields->get_field_types();
}
/*
* acf_is_field_type
*
* alias of acf()->fields->is_field_type()
*
* @type function
* @date 31/5/17
* @since 5.6.0
*
* @param n/a
* @return n/a
*/
function acf_is_field_type( $name = '' ) {
return acf()->fields->is_field_type( $name );
}
/*
* acf_get_field_type_prop
*
* This function will return a field type's property
*
* @type function
* @date 1/10/13
* @since 5.0.0
*
* @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;
}
/*
* acf_get_field_type_label
*
* This function will return the label of a field type
*
* @type function
* @date 1/10/13
* @since 5.0.0
*
* @param n/a
* @return (array)
*/
function acf_get_field_type_label( $name = '' ) {
$type = acf_get_field_type( $name );
return $type ? $type->label : '<span class="acf-tooltip-js" title="'.__('Field type does not exist', 'acf').'">'.__('Unknown', 'acf').'</span>';
}
/*
* acf_field_type_exists (deprecated)
*
* deprecated in favour of acf_is_field_type()
*
* @type function
* @date 1/10/13
* @since 5.0.0
*
* @param $type (string)
* @return (boolean)
*/
function acf_field_type_exists( $type = '' ) {
return acf_is_field_type( $type );
}
/*
* acf_get_grouped_field_types (deprecated)
*
* deprecated in favour of acf_get_field_types()
*
* @type function
* @date 1/10/13
* @since 5.0.0
*
* @param n/a
* @return (array)
*/
function acf_get_grouped_field_types() {
return acf_get_field_types();
}
?>

View File

@@ -0,0 +1,167 @@
<?php
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;
}
}
// initialize
acf_register_field_type( 'acf_field__accordion' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,292 @@
<?php
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
);
}
// 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']);
}
// 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 );
}
}
// initialize
acf_register_field_type( 'acf_field_button_group' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,567 @@
<?php
if( ! class_exists('acf_field_checkbox') ) :
class acf_field_checkbox 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 = 'checkbox';
$this->label = __("Checkbox",'acf');
$this->category = 'choice';
$this->defaults = array(
'layout' => 'vertical',
'choices' => array(),
'default_value' => '',
'allow_custom' => 0,
'save_custom' => 0,
'toggle' => 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 ) {
// reset vars
$this->_values = array();
$this->_all_checked = true;
// ensure array
$field['value'] = acf_get_array($field['value']);
$field['choices'] = acf_get_array($field['choices']);
// hiden input
acf_hidden_input( array('name' => $field['name']) );
// vars
$li = '';
$ul = array(
'class' => 'acf-checkbox-list',
);
// append to class
$ul['class'] .= ' ' . ($field['layout'] == 'horizontal' ? 'acf-hl' : 'acf-bl');
$ul['class'] .= ' ' . $field['class'];
// checkbox saves an array
$field['name'] .= '[]';
// choices
if( !empty($field['choices']) ) {
// choices
$li .= $this->render_field_choices( $field );
// toggle
if( $field['toggle'] ) {
$li = $this->render_field_toggle( $field ) . $li;
}
}
// custom
if( $field['allow_custom'] ) {
$li .= $this->render_field_custom( $field );
}
// return
echo '<ul ' . acf_esc_attr( $ul ) . '>' . "\n" . $li . '</ul>' . "\n";
}
/*
* render_field_choices
*
* description
*
* @type function
* @date 15/7/17
* @since 5.6.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function render_field_choices( $field ) {
// walk
return $this->walk( $field['choices'], $field );
}
/*
* render_field_toggle
*
* description
*
* @type function
* @date 15/7/17
* @since 5.6.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function render_field_toggle( $field ) {
// vars
$atts = array(
'type' => 'checkbox',
'class' => 'acf-checkbox-toggle',
'label' => __("Toggle All", 'acf')
);
// custom label
if( is_string($field['toggle']) ) {
$atts['label'] = $field['toggle'];
}
// checked
if( $this->_all_checked ) {
$atts['checked'] = 'checked';
}
// return
return '<li>' . acf_get_checkbox_input($atts) . '</li>' . "\n";
}
/*
* render_field_custom
*
* description
*
* @type function
* @date 15/7/17
* @since 5.6.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function render_field_custom( $field ) {
// vars
$html = '';
// loop
foreach( $field['value'] as $value ) {
// ignore if already eixsts
if( isset($field['choices'][ $value ]) ) continue;
// vars
$esc_value = esc_attr($value);
$text_input = array(
'name' => $field['name'],
'value' => $value,
);
// bail ealry if choice already exists
if( in_array( $esc_value, $this->_values ) ) continue;
// append
$html .= '<li><input class="acf-checkbox-custom" type="checkbox" checked="checked" />' . acf_get_text_input($text_input) . '</li>' . "\n";
}
// append button
$html .= '<li><a href="#" class="button acf-add-checkbox">' . esc_attr__('Add new choice', 'acf') . '</a></li>' . "\n";
// return
return $html;
}
function walk( $choices = array(), $args = array(), $depth = 0 ) {
// bail ealry if no choices
if( empty($choices) ) return '';
// defaults
$args = wp_parse_args($args, array(
'id' => '',
'type' => 'checkbox',
'name' => '',
'value' => array(),
'disabled' => array(),
));
// vars
$html = '';
// sanitize values for 'selected' matching
if( $depth == 0 ) {
$args['value'] = array_map('esc_attr', $args['value']);
$args['disabled'] = array_map('esc_attr', $args['disabled']);
}
// loop
foreach( $choices as $value => $label ) {
// open
$html .= '<li>';
// optgroup
if( is_array($label) ){
$html .= '<ul>' . "\n";
$html .= $this->walk( $label, $args, $depth+1 );
$html .= '</ul>';
// option
} else {
// vars
$esc_value = esc_attr($value);
$atts = array(
'id' => $args['id'] . '-' . str_replace(' ', '-', $value),
'type' => $args['type'],
'name' => $args['name'],
'value' => $value,
'label' => $label,
);
// selected
if( in_array( $esc_value, $args['value'] ) ) {
$atts['checked'] = 'checked';
} else {
$this->_all_checked = false;
}
// disabled
if( in_array( $esc_value, $args['disabled'] ) ) {
$atts['disabled'] = 'disabled';
}
// store value added
$this->_values[] = $esc_value;
// append
$html .= acf_get_checkbox_input($atts);
}
// close
$html .= '</li>' . "\n";
}
// return
return $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 ) {
// encode choices (convert from array)
$field['choices'] = acf_encode_choices($field['choices']);
$field['default_value'] = acf_encode_choices($field['default_value'], false);
// 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',
));
// other_choice
acf_render_field_setting( $field, array(
'label' => __('Allow Custom','acf'),
'instructions' => '',
'name' => 'allow_custom',
'type' => 'true_false',
'ui' => 1,
'message' => __("Allow 'custom' values to be added", 'acf'),
));
// save_other_choice
acf_render_field_setting( $field, array(
'label' => __('Save Custom','acf'),
'instructions' => '',
'name' => 'save_custom',
'type' => 'true_false',
'ui' => 1,
'message' => __("Save 'custom' values to the field's choices", 'acf')
));
// default_value
acf_render_field_setting( $field, array(
'label' => __('Default Value','acf'),
'instructions' => __('Enter each default value on a new line','acf'),
'type' => 'textarea',
'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')
)
));
// layout
acf_render_field_setting( $field, array(
'label' => __('Toggle','acf'),
'instructions' => __('Prepend an extra checkbox to toggle all choices','acf'),
'name' => 'toggle',
'type' => 'true_false',
'ui' => 1,
));
// 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 ) {
return acf_get_field_type('select')->update_field( $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
*
* @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 is empty
if( empty($value) ) return $value;
// select -> update_value()
$value = acf_get_field_type('select')->update_value( $value, $post_id, $field );
// save_other_choice
if( $field['save_custom'] ) {
// 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;
// loop
foreach( $value as $v ) {
// ignore if already eixsts
if( isset($field['choices'][ $v ]) ) continue;
// unslash (fixes serialize single quote issue)
$v = wp_unslash($v);
// sanitize (remove tags)
$v = sanitize_text_field($v);
// append
$field['choices'][ $v ] = $v;
}
// save
acf_update_field( $field );
}
// 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_checkbox' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,148 @@
<?php
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() {
// globals
global $wp_scripts;
// register if not already (on front end)
// http://wordpress.stackexchange.com/questions/82718/how-do-i-implement-the-wordpress-iris-picker-into-my-plugin-on-the-front-end
if( !isset($wp_scripts->registered['iris']) ) {
// styles
wp_register_style('wp-color-picker', admin_url('css/color-picker.css'), array(), '', true);
// scripts
wp_register_script('iris', admin_url('js/iris.min.js'), array('jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch'), '1.0.7', true);
wp_register_script('wp-color-picker', admin_url('js/color-picker.min.js'), array('iris'), '', true);
// localize
wp_localize_script('wp-color-picker', 'wpColorPickerL10n', array(
'clear' => __('Clear', 'acf' ),
'defaultString' => __('Default', 'acf' ),
'pick' => __('Select Color', 'acf' ),
'current' => __('Current Color', 'acf' )
));
}
// 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
?>
<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'
));
}
}
// initialize
acf_register_field_type( 'acf_field_color_picker' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,305 @@
<?php
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
);
$this->l10n = 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'),
);
// actions
add_action('init', array($this, 'init'));
}
/*
* init
*
* This function is run on the 'init' action to set the field's $l10n data. Before the init action,
* access to the $wp_locale variable is not possible.
*
* @type action (init)
* @date 3/09/13
*
* @param n/a
* @return n/a
*/
function init() {
// globals
global $wp_locale;
// append
$this->l10n = array_merge($this->l10n, array(
'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 )
));
}
/*
* 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;
// script
wp_enqueue_script('jquery-ui-datepicker');
// style
wp_enqueue_style('acf-datepicker', acf_get_dir('assets/inc/datepicker/jquery-ui.min.css'), '', '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 ) {
// format value
$hidden_value = '';
$display_value = '';
if( $field['value'] ) {
$hidden_value = acf_format_date( $field['value'], 'Ymd' );
$display_value = acf_format_date( $field['value'], $field['display_format'] );
}
// vars
$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'],
'class' => 'input-alt',
'name' => $field['name'],
'value' => $hidden_value,
);
$text_input = array(
'class' => 'input',
'value' => $display_value,
);
// 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>'
)
));
}
// 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' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,255 @@
<?php
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
);
$this->l10n = 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'),
)
);
}
/*
* 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_dir('assets/inc/timepicker/jquery-ui-timepicker-addon.min.js'), array('jquery-ui-datepicker'), $version);
// style
wp_enqueue_style('acf-timepicker', acf_get_dir('assets/inc/timepicker/jquery-ui-timepicker-addon.min.css'), '', $version);
}
/*
* 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 ) {
// format 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 to date and time
// the letter 'm' is used for date and minute in JS, so this must be done here in PHP
$formats = acf_split_date_time($field['display_format']);
// vars
$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,
);
// 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 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
?>

View File

@@ -0,0 +1,161 @@
<?php
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' => ''
);
}
/*
* 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' );
$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;
}
/*
* 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',
));
}
}
// initialize
acf_register_field_type( 'acf_field_email' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,445 @@
<?php
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' => ''
);
$this->l10n = array(
'select' => __("Select File",'acf'),
'edit' => __("Edit File",'acf'),
'update' => __("Update File",'acf'),
'uploadedTo' => __("Uploaded to this post",'acf'),
);
// filters
add_filter('get_media_item_args', array($this, 'get_media_item_args'));
}
/*
* 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' => '',
'filesize' => '',
'filename' => '',
);
$div = array(
'class' => 'acf-file-uploader',
'data-library' => $field['library'],
'data-mime_types' => $field['mime_types'],
'data-uploader' => $uploader
);
// has value?
if( $field['value'] ) {
$file = get_post( $field['value'] );
if( $file ) {
$o['icon'] = wp_mime_type_icon( $file->ID );
$o['title'] = $file->post_title;
$o['filesize'] = @size_format(filesize( get_attached_file( $file->ID ) ));
$o['url'] = wp_get_attachment_url( $file->ID );
$explode = explode('/', $o['url']);
$o['filename'] = end( $explode );
}
// url exists
if( $o['url'] ) {
$div['class'] .= ' has-value';
}
}
?>
<div <?php acf_esc_attr_e( $div ); ?>>
<?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=""/>
</div>
<div class="file-info">
<p>
<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>
</p>
<p>
<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
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']) ): ?>
<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'] )); ?>
</label>
<?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>
<?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] = '';
}
}
// 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 is empty
if( empty($value) ) return false;
// validate
if( is_array($value) && isset($value['ID']) ) {
$value = $value['ID'];
} elseif( is_object($value) && isset($value->ID) ) {
$value = $value->ID;
}
// bail early if not attachment ID
if( !$value || !is_numeric($value) ) return false;
// confirm type
$value = (int) $value;
// maybe connect attacment to post
acf_connect_attachment_to_post( $value, $post_id );
// return
return $value;
}
/*
* 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' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,314 @@
<?php
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'
);
$this->l10n = array(
'locating' => __("Locating",'acf'),
'browser_support' => __("Sorry, this browser does not support geolocation",'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 ) {
// validate value
if( empty($field['value']) ) {
$field['value'] = array();
}
// value
$field['value'] = wp_parse_args($field['value'], array(
'address' => '',
'lat' => '',
'lng' => ''
));
// default options
foreach( $this->default_values as $k => $v ) {
if( empty($field[ $k ]) ) {
$field[ $k ] = $v;
}
}
// vars
$atts = array(
'id' => $field['id'],
'class' => "acf-google-map {$field['class']}",
'data-lat' => $field['center_lat'],
'data-lng' => $field['center_lng'],
'data-zoom' => $field['zoom'],
);
// has value
if( $field['value']['address'] ) {
$atts['class'] .= ' -value';
}
?>
<div <?php acf_esc_attr_e($atts); ?>>
<div class="acf-hidden">
<?php foreach( $field['value'] as $k => $v ):
acf_hidden_input(array( 'name' => $field['name'].'['.$k.']', 'value' => $v, 'class' => 'input-'.$k ));
endforeach; ?>
</div>
<div class="title">
<div class="acf-actions -hover">
<a href="#" data-name="search" class="acf-icon -search grey" title="<?php _e("Search", 'acf'); ?>"></a><?php
?><a href="#" data-name="clear" class="acf-icon -cancel grey" title="<?php _e("Clear location", 'acf'); ?>"></a><?php
?><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($field['value']['address']); ?>" />
<i class="acf-loading"></i>
</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' => __('Customise the map height','acf'),
'type' => 'text',
'name' => 'height',
'append' => 'px',
'placeholder' => $this->default_values['height']
));
}
/*
* 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;
}
if( empty($value) || empty($value['lat']) || empty($value['lng']) ) {
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 ) {
if( empty($value) || empty($value['lat']) || empty($value['lng']) ) {
return false;
}
// return
return $value;
}
/*
* input_admin_footer
*
* description
*
* @type function
* @date 6/03/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function input_admin_footer() {
// bail ealry if no qneueu
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' => ''
);
// 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');
?>
<script type="text/javascript">
if( acf ) acf.fields.google_map.url = '<?php echo $url; ?>';
</script>
<?php
}
}
// initialize
acf_register_field_type( 'acf_field_google_map' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,656 @@
<?php
if( ! class_exists('acf_field__group') ) :
class acf_field__group 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 = 'group';
$this->label = __("Group",'acf');
$this->category = 'layout';
$this->defaults = array(
'sub_fields' => array(),
'layout' => 'block'
);
$this->have_rows = 'single';
// field filters
$this->add_field_filter('acf/prepare_field_for_export', array($this, 'prepare_field_for_export'));
$this->add_field_filter('acf/prepare_field_for_import', array($this, 'prepare_field_for_import'));
}
/*
* 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 ) {
// vars
$sub_fields = acf_get_fields( $field );
// append
if( $sub_fields ) {
$field['sub_fields'] = $sub_fields;
}
// return
return $field;
}
/*
* load_value()
*
* This filter is applied to the $value after it is loaded from the db
*
* @type filter
* @since 3.6
* @date 23/01/13
*
* @param $value (mixed) the value found in 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
*/
function load_value( $value, $post_id, $field ) {
// bail early if no sub fields
if( empty($field['sub_fields']) ) return $value;
// modify names
$field = $this->prepare_field_for_db( $field );
// load sub fields
$value = array();
// loop
foreach( $field['sub_fields'] as $sub_field ) {
// load
$value[ $sub_field['key'] ] = acf_get_value( $post_id, $sub_field );
}
// return
return $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;
// modify names
$field = $this->prepare_field_for_db( $field );
// loop
foreach( $field['sub_fields'] as $sub_field ) {
// extract value
$sub_value = acf_extract_var( $value, $sub_field['key'] );
// format value
$sub_value = acf_format_value( $sub_value, $post_id, $sub_field );
// append to $row
$value[ $sub_field['_name'] ] = $sub_value;
}
// return
return $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 ) {
// bail early if no value
if( !acf_is_array($value) ) return null;
// bail ealry if no sub fields
if( empty($field['sub_fields']) ) return null;
// modify names
$field = $this->prepare_field_for_db( $field );
// loop
foreach( $field['sub_fields'] as $sub_field ) {
// vars
$v = false;
// key (backend)
if( isset($value[ $sub_field['key'] ]) ) {
$v = $value[ $sub_field['key'] ];
// name (frontend)
} elseif( isset($value[ $sub_field['_name'] ]) ) {
$v = $value[ $sub_field['_name'] ];
// empty
} else {
// input is not set (hidden by conditioanl logic)
continue;
}
// update value
acf_update_value( $v, $post_id, $sub_field );
}
// return
return '';
}
/*
* prepare_field_for_db
*
* This function will modify sub fields ready for update / load
*
* @type function
* @date 4/11/16
* @since 5.5.0
*
* @param $field (array)
* @return $field
*/
function prepare_field_for_db( $field ) {
// bail early if no sub fields
if( empty($field['sub_fields']) ) return $field;
// loop
foreach( $field['sub_fields'] as &$sub_field ) {
// prefix name
$sub_field['name'] = $field['name'] . '_' . $sub_field['_name'];
}
// return
return $field;
}
/*
* 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 ) {
// bail early if no sub fields
if( empty($field['sub_fields']) ) return;
// load values
foreach( $field['sub_fields'] as &$sub_field ) {
// add value
if( isset($field['value'][ $sub_field['key'] ]) ) {
// this is a normal value
$sub_field['value'] = $field['value'][ $sub_field['key'] ];
} elseif( isset($sub_field['default_value']) ) {
// no value, but this sub field has a default value
$sub_field['value'] = $sub_field['default_value'];
}
// update prefix to allow for nested values
$sub_field['prefix'] = $field['name'];
// restore required
if( $field['required'] ) $sub_field['required'] = 0;
}
// render
if( $field['layout'] == 'table' ) {
$this->render_field_table( $field );
} else {
$this->render_field_block( $field );
}
}
/*
* render_field_block
*
* description
*
* @type function
* @date 12/07/2016
* @since 5.4.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function render_field_block( $field ) {
// vars
$label_placement = ($field['layout'] == 'block') ? 'top' : 'left';
// html
echo '<div class="acf-fields -' . $label_placement . ' -border">';
foreach( $field['sub_fields'] as $sub_field ) {
acf_render_field_wrap( $sub_field );
}
echo '</div>';
}
/*
* render_field_table
*
* description
*
* @type function
* @date 12/07/2016
* @since 5.4.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function render_field_table( $field ) {
?>
<table class="acf-table">
<thead>
<tr>
<?php foreach( $field['sub_fields'] as $sub_field ):
// prepare field (allow sub fields to be removed)
$sub_field = acf_prepare_field($sub_field);
// bail ealry if no field
if( !$sub_field ) continue;
// vars
$atts = array();
$atts['class'] = 'acf-th';
$atts['data-name'] = $sub_field['_name'];
$atts['data-type'] = $sub_field['type'];
$atts['data-key'] = $sub_field['key'];
// Add custom width
if( $sub_field['wrapper']['width'] ) {
$atts['data-width'] = $sub_field['wrapper']['width'];
$atts['style'] = 'width: ' . $sub_field['wrapper']['width'] . '%;';
}
?>
<th <?php acf_esc_attr_e( $atts ); ?>>
<?php acf_render_field_label( $sub_field ); ?>
<?php acf_render_field_instructions( $sub_field ); ?>
</th>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<tr class="acf-row">
<?php
foreach( $field['sub_fields'] as $sub_field ) {
acf_render_field_wrap( $sub_field, 'td' );
}
?>
</tr>
</tbody>
</table>
<?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 ) {
// vars
$args = array(
'fields' => $field['sub_fields'],
'parent' => $field['ID']
);
?><tr class="acf-field acf-field-setting-sub_fields" data-setting="group" data-name="sub_fields">
<td class="acf-label">
<label><?php _e("Sub Fields",'acf'); ?></label>
</td>
<td class="acf-input">
<?php
acf_get_view('field-group-fields', $args);
?>
</td>
</tr>
<?php
// layout
acf_render_field_setting( $field, array(
'label' => __('Layout','acf'),
'instructions' => __('Specify the style used to render the selected fields', 'acf'),
'type' => 'radio',
'name' => 'layout',
'layout' => 'horizontal',
'choices' => array(
'block' => __('Block','acf'),
'table' => __('Table','acf'),
'row' => __('Row','acf')
)
));
}
/*
* 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 no $value
if( empty($value) ) return $valid;
// bail early if no sub fields
if( empty($field['sub_fields']) ) return $valid;
// loop
foreach( $field['sub_fields'] as $sub_field ) {
// get sub field
$k = $sub_field['key'];
// bail early if value not set (conditional logic?)
if( !isset($value[ $k ]) ) continue;
// required
if( $field['required'] ) {
$sub_field['required'] = 1;
}
// validate
acf_validate_value( $value[ $k ], $sub_field, "{$input}[{$k}]" );
}
// return
return $valid;
}
/*
* duplicate_field()
*
* This filter is appied to the $field before it is duplicated and saved to the database
*
* @type filter
* @since 3.6
* @date 23/01/13
*
* @param $field - the field array holding all the field options
*
* @return $field - the modified field
*/
function duplicate_field( $field ) {
// get sub fields
$sub_fields = acf_extract_var( $field, 'sub_fields' );
// save field to get ID
$field = acf_update_field( $field );
// duplicate sub fields
acf_duplicate_fields( $sub_fields, $field['ID'] );
// return
return $field;
}
/*
* prepare_field_for_export
*
* description
*
* @type function
* @date 11/03/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function prepare_field_for_export( $field ) {
// bail early if no sub fields
if( empty($field['sub_fields']) ) return $field;
// prepare
$field['sub_fields'] = acf_prepare_fields_for_export( $field['sub_fields'] );
// return
return $field;
}
/*
* prepare_field_for_import
*
* description
*
* @type function
* @date 11/03/2014
* @since 5.0.0
*
* @param $post_id (int)
* @return $post_id (int)
*/
function prepare_field_for_import( $field ) {
// bail early if no sub fields
if( empty($field['sub_fields']) ) return $field;
// vars
$sub_fields = $field['sub_fields'];
// reset field setting
$field['sub_fields'] = array();
// loop
foreach( $sub_fields as &$sub_field ) {
$sub_field['parent'] = $field['key'];
}
// merge
array_unshift($sub_fields, $field);
// return
return $sub_fields;
}
}
// initialize
acf_register_field_type( 'acf_field__group' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,472 @@
<?php
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' => 'thumbnail',
'library' => 'all',
'min_width' => 0,
'min_height' => 0,
'min_size' => 0,
'max_width' => 0,
'max_height' => 0,
'max_size' => 0,
'mime_types' => ''
);
$this->l10n = array(
'select' => __("Select Image",'acf'),
'edit' => __("Edit Image",'acf'),
'update' => __("Update Image",'acf'),
'uploadedTo' => __("Uploaded to this post",'acf'),
'all' => __("All images",'acf'),
);
// filters
add_filter('get_media_item_args', array($this, 'get_media_item_args'));
add_filter('wp_prepare_attachment_for_js', array($this, 'wp_prepare_attachment_for_js'), 10, 3);
}
/*
* 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');
// enqueue
if( $uploader == 'wp' ) {
acf_enqueue_uploader();
}
// vars
$url = '';
$alt = '';
$div = array(
'class' => 'acf-image-uploader',
'data-preview_size' => $field['preview_size'],
'data-library' => $field['library'],
'data-mime_types' => $field['mime_types'],
'data-uploader' => $uploader
);
// has value?
if( $field['value'] ) {
// update vars
$url = wp_get_attachment_image_src($field['value'], $field['preview_size']);
$alt = get_post_meta($field['value'], '_wp_attachment_image_alt', true);
// url exists
if( $url ) $url = $url[0];
// url exists
if( $url ) {
$div['class'] .= ' has-value';
}
}
// get size of preview value
$size = acf_get_image_size($field['preview_size']);
?>
<div <?php acf_esc_attr_e( $div ); ?>>
<?php acf_hidden_input(array( 'name' => $field['name'], 'value' => $field['value'] )); ?>
<div class="show-if-value image-wrap" <?php if( $size['width'] ): ?>style="<?php echo esc_attr('max-width: '.$size['width'].'px'); ?>"<?php endif; ?>>
<img data-name="image" src="<?php echo esc_url($url); ?>" alt="<?php echo esc_attr($alt); ?>"/>
<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
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']) ): ?>
<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'] )); ?>
</label>
<?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] = '';
}
}
// 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' => __("Image Array",'acf'),
'url' => __("Image URL",'acf'),
'id' => __("Image ID",'acf')
)
));
// preview_size
acf_render_field_setting( $field, array(
'label' => __('Preview Size','acf'),
'instructions' => __('Shown when entering data','acf'),
'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);
}
/*
* wp_prepare_attachment_for_js
*
* this filter allows ACF to add in extra data to an attachment JS object
* This sneaky hook adds the missing sizes to each attachment in the 3.5 uploader.
* It would be a lot easier to add all the sizes to the 'image_size_names_choose' filter but
* then it will show up on the normal the_content editor
*
* @type function
* @since: 3.5.7
* @date 13/01/13
*
* @param {int} $post_id
* @return {int} $post_id
*/
function wp_prepare_attachment_for_js( $response, $attachment, $meta ) {
// only for image
if( $response['type'] != 'image' ) {
return $response;
}
// make sure sizes exist. Perhaps they dont?
if( !isset($meta['sizes']) ) {
return $response;
}
$attachment_url = $response['url'];
$base_url = str_replace( wp_basename( $attachment_url ), '', $attachment_url );
if( isset($meta['sizes']) && is_array($meta['sizes']) ) {
foreach( $meta['sizes'] as $k => $v ) {
if( !isset($response['sizes'][ $k ]) ) {
$response['sizes'][ $k ] = array(
'height' => $v['height'],
'width' => $v['width'],
'url' => $base_url . $v['file'],
'orientation' => $v['height'] > $v['width'] ? 'portrait' : 'landscape',
);
}
}
}
return $response;
}
/*
* 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
?>

View File

@@ -0,0 +1,292 @@
<?php
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;
}
/*
* 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); ?>>
<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 )); ?>
<?php endforeach; ?>
</div>
<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>
</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'];
}
// 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 ) {
// URL is required
if( empty($value) || empty($value['url']) ) {
return false;
}
// return
return $value;
}
}
// initialize
acf_register_field_type( 'acf_field_link' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,200 @@
<?php
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',
);
}
/*
* 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 );
}
/*
* 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 &lt;br&gt;",'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 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
?>

View File

@@ -0,0 +1,304 @@
<?php
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' => ''
);
}
/*
* 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');
}
// 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;
}
/*
* 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;
}
}
// initialize
acf_register_field_type( 'acf_field_number' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,333 @@
<?php
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'));
}
/*
* 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',
);
// value
if( $field['value'] ) $atts['class'] .= ' has-value';
?>
<div <?php acf_esc_attr_e($atts) ?>>
<?php acf_hidden_input(array( 'name' => $field['name'], 'value' => $field['value'], 'data-name' => 'value-input' )); ?>
<div class="title">
<div class="title-value">
<h4 data-name="value-title"><?php echo esc_html( $field['value'] ); ?></h4>
</div>
<div class="title-search">
<input data-name="search-input" type="text" placeholder="<?php _e("Enter URL", 'acf'); ?>" autocomplete="off" />
</div>
<div class="acf-actions -hover">
<a data-name="clear-button" href="#" class="acf-icon -cancel grey"></a>
</div>
</div>
<div class="canvas">
<div class="canvas-loading">
<i class="acf-loading"></i>
</div>
<div class="canvas-error">
<p><strong><?php _e("Error.", 'acf'); ?></strong> <?php _e("No embed found for the given URL.", 'acf'); ?></p>
</div>
<div class="canvas-media" data-name="value-embed">
<?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;
}
}
// initialize
acf_register_field_type( 'acf_field_oembed' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,77 @@
<?php
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
);
}
/*
* 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' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,680 @@
<?php
if( ! class_exists('acf_field_page_link') ) :
class acf_field_page_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 = 'page_link';
$this->label = __("Page Link",'acf');
$this->category = 'relational';
$this->defaults = array(
'post_type' => array(),
'taxonomy' => array(),
'allow_null' => 0,
'multiple' => 0,
'allow_archives' => 1
);
// extra
add_action('wp_ajax_acf/fields/page_link/query', array($this, 'ajax_query'));
add_action('wp_ajax_nopriv_acf/fields/page_link/query', array($this, 'ajax_query'));
}
/*
* 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();
// defaults
$options = acf_parse_args($_POST, array(
'post_id' => 0,
's' => '',
'field_key' => '',
'paged' => 1
));
// vars
$results = array();
$args = array();
$s = false;
$is_search = false;
// paged
$args['posts_per_page'] = 20;
$args['paged'] = $options['paged'];
// search
if( $options['s'] !== '' ) {
// strip slashes (search may be integer)
$s = wp_unslash( strval($options['s']) );
// update vars
$args['s'] = $s;
$is_search = true;
}
// load field
$field = acf_get_field( $options['field_key'] );
if( !$field ) die();
// update $args
if( !empty($field['post_type']) ) {
$args['post_type'] = acf_get_array( $field['post_type'] );
} else {
$args['post_type'] = acf_get_post_types();
}
// create tax queries
if( !empty($field['taxonomy']) ) {
// append to $args
$args['tax_query'] = array();
// decode terms
$taxonomies = acf_decode_taxonomy_terms( $field['taxonomy'] );
// now create the tax queries
foreach( $taxonomies as $taxonomy => $terms ) {
$args['tax_query'][] = array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $terms,
);
}
}
// filters
$args = apply_filters('acf/fields/page_link/query', $args, $field, $options['post_id']);
$args = apply_filters('acf/fields/page_link/query/name=' . $field['name'], $args, $field, $options['post_id'] );
$args = apply_filters('acf/fields/page_link/query/key=' . $field['key'], $args, $field, $options['post_id'] );
// add archives to $results
if( $field['allow_archives'] && $args['paged'] == 1 ) {
$archives = array();
$archives[] = array(
'id' => home_url(),
'text' => home_url()
);
foreach( $args['post_type'] as $post_type ) {
// vars
$archive_link = get_post_type_archive_link( $post_type );
// bail ealry if no link
if( !$archive_link ) continue;
// bail early if no search match
if( $is_search && stripos($archive_link, $s) === false ) continue;
// append
$archives[] = array(
'id' => $archive_link,
'text' => $archive_link
);
}
// append
$results[] = array(
'text' => __('Archives', 'acf'),
'children' => $archives
);
}
// get posts grouped by post type
$groups = acf_get_grouped_posts( $args );
// loop
if( !empty($groups) ) {
foreach( array_keys($groups) as $group_title ) {
// vars
$posts = acf_extract_var( $groups, $group_title );
// data
$data = array(
'text' => $group_title,
'children' => array()
);
// convert post objects to post titles
foreach( array_keys($posts) as $post_id ) {
$posts[ $post_id ] = $this->get_post_title( $posts[ $post_id ], $field, $options['post_id'], $is_search );
}
// order posts by search
if( $is_search && empty($args['orderby']) ) {
$posts = acf_order_by_search( $posts, $args['s'] );
}
// append to $data
foreach( array_keys($posts) as $post_id ) {
$data['children'][] = $this->get_post_result( $post_id, $posts[ $post_id ]);
}
// append to $results
$results[] = $data;
}
}
// return
acf_send_ajax_results(array(
'results' => $results,
'limit' => $args['posts_per_page']
));
}
/*
* get_post_result
*
* This function will return an array containing id, text and maybe description data
*
* @type function
* @date 7/07/2016
* @since 5.4.0
*
* @param $id (mixed)
* @param $text (string)
* @return (array)
*/
function get_post_result( $id, $text ) {
// vars
$result = array(
'id' => $id,
'text' => $text
);
// look for parent
$search = '| ' . __('Parent', 'acf') . ':';
$pos = strpos($text, $search);
if( $pos !== false ) {
$result['description'] = substr($text, $pos+2);
$result['text'] = substr($text, 0, $pos);
}
// return
return $result;
}
/*
* get_post_title
*
* This function returns the HTML for a result
*
* @type function
* @date 1/11/2013
* @since 5.0.0
*
* @param $post (object)
* @param $field (array)
* @param $post_id (int) the post_id to which this value is saved to
* @return (string)
*/
function get_post_title( $post, $field, $post_id = 0, $is_search = 0 ) {
// get post_id
if( !$post_id ) $post_id = acf_get_form_data('post_id');
// vars
$title = acf_get_post_title( $post, $is_search );
// filters
$title = apply_filters('acf/fields/page_link/result', $title, $post, $field, $post_id);
$title = apply_filters('acf/fields/page_link/result/name=' . $field['_name'], $title, $post, $field, $post_id);
$title = apply_filters('acf/fields/page_link/result/key=' . $field['key'], $title, $post, $field, $post_id);
// return
return $title;
}
/*
* get_posts
*
* This function will return an array of posts for a given field value
*
* @type function
* @date 13/06/2014
* @since 5.0.0
*
* @param $value (array)
* @return $value
*/
function get_posts( $value, $field ) {
// force value to array
$value = acf_get_array( $value );
// get selected post ID's
$post__in = array();
foreach( $value as $k => $v ) {
if( is_numeric($v) ) {
// append to $post__in
$post__in[] = (int) $v;
}
}
// bail early if no posts
if( empty($post__in) ) {
return $value;
}
// get posts
$posts = acf_get_posts(array(
'post__in' => $post__in,
'post_type' => $field['post_type']
));
// override value with post
$return = array();
// append to $return
foreach( $value as $k => $v ) {
if( is_numeric($v) ) {
// extract first post
$post = array_shift( $posts );
// append
if( $post ) {
$return[] = $post;
}
} else {
$return[] = $v;
}
}
// return
return $return;
}
/*
* 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 ){
// Change Field into a select
$field['type'] = 'select';
$field['ui'] = 1;
$field['ajax'] = 1;
$field['choices'] = array();
// populate choices if value exists
if( !empty($field['value']) ) {
// get posts
$posts = $this->get_posts( $field['value'], $field );
// set choices
if( !empty($posts) ) {
foreach( array_keys($posts) as $i ) {
// vars
$post = acf_extract_var( $posts, $i );
if( is_object($post) ) {
// append to choices
$field['choices'][ $post->ID ] = $this->get_post_title( $post, $field );
} else {
// append to choices
$field['choices'][ $post ] = $post;
}
}
}
}
// render
acf_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 ) {
// post_type
acf_render_field_setting( $field, array(
'label' => __('Filter by Post Type','acf'),
'instructions' => '',
'type' => 'select',
'name' => 'post_type',
'choices' => acf_get_pretty_post_types(),
'multiple' => 1,
'ui' => 1,
'allow_null' => 1,
'placeholder' => __("All post types",'acf'),
));
// taxonomy
acf_render_field_setting( $field, array(
'label' => __('Filter by Taxonomy','acf'),
'instructions' => '',
'type' => 'select',
'name' => 'taxonomy',
'choices' => acf_get_taxonomy_terms(),
'multiple' => 1,
'ui' => 1,
'allow_null' => 1,
'placeholder' => __("All taxonomies",'acf'),
));
// allow_null
acf_render_field_setting( $field, array(
'label' => __('Allow Null?','acf'),
'instructions' => '',
'name' => 'allow_null',
'type' => 'true_false',
'ui' => 1,
));
// allow_archives
acf_render_field_setting( $field, array(
'label' => __('Allow Archives URLs','acf'),
'instructions' => '',
'name' => 'allow_archives',
'type' => 'true_false',
'ui' => 1,
));
// multiple
acf_render_field_setting( $field, array(
'label' => __('Select multiple values?','acf'),
'instructions' => '',
'name' => 'multiple',
'type' => 'true_false',
'ui' => 1,
));
}
/*
* 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 ) {
// ACF4 null
if( $value === 'null' ) {
return false;
}
// bail early if no value
if( empty($value) ) {
return $value;
}
// get posts
$value = $this->get_posts( $value, $field );
// set choices
foreach( array_keys($value) as $i ) {
// vars
$post = acf_extract_var( $value, $i );
// convert $post to permalink
if( is_object($post) ) {
$post = get_permalink( $post );
}
// append back to $value
$value[ $i ] = $post;
}
// convert back from array if neccessary
if( !$field['multiple'] ) {
$value = array_shift($value);
}
// return value
return $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 $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 ) {
// validate
if( empty($value) ) {
return $value;
}
// format
if( is_array($value) ) {
// array
foreach( $value as $k => $v ){
// object?
if( is_object($v) && isset($v->ID) )
{
$value[ $k ] = $v->ID;
}
}
// save value as strings, so we can clearly search for them in SQL LIKE statements
$value = array_map('strval', $value);
} elseif( is_object($value) && isset($value->ID) ) {
// object
$value = $value->ID;
}
// return
return $value;
}
}
// initialize
acf_register_field_type( 'acf_field_page_link' );
endif; // class_exists check
?>

View File

@@ -0,0 +1,104 @@
<?php
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',
));
}
}
// initialize
acf_register_field_type( 'acf_field_password' );
endif; // class_exists check
?>

Some files were not shown because too many files have changed in this diff Show More