Merge branch 'release/5.4.4' into develop
This commit is contained in:
commit
940bb40c76
69
acf.php
69
acf.php
|
|
@ -3,7 +3,7 @@
|
|||
Plugin Name: Advanced Custom Fields PRO
|
||||
Plugin URI: https://www.advancedcustomfields.com/
|
||||
Description: Customise WordPress with powerful, professional and intuitive fields
|
||||
Version: 5.3.10
|
||||
Version: 5.4.4
|
||||
Author: Elliot Condon
|
||||
Author URI: http://www.elliotcondon.com/
|
||||
Copyright: Elliot Condon
|
||||
|
|
@ -58,7 +58,7 @@ class acf {
|
|||
|
||||
// basic
|
||||
'name' => __('Advanced Custom Fields', 'acf'),
|
||||
'version' => '5.3.10',
|
||||
'version' => '5.4.4',
|
||||
|
||||
// urls
|
||||
'basename' => plugin_basename( __FILE__ ),
|
||||
|
|
@ -81,7 +81,9 @@ class acf {
|
|||
'l10n' => true,
|
||||
'l10n_textdomain' => '',
|
||||
'google_api_key' => '',
|
||||
'google_api_client' => ''
|
||||
'google_api_client' => '',
|
||||
'enqueue_google_maps' => true,
|
||||
'enqueue_select2' => true,
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -98,6 +100,8 @@ class acf {
|
|||
|
||||
// core
|
||||
acf_include('core/ajax.php');
|
||||
acf_include('core/cache.php');
|
||||
acf_include('core/fields.php');
|
||||
acf_include('core/field.php');
|
||||
acf_include('core/input.php');
|
||||
acf_include('core/validation.php');
|
||||
|
|
@ -441,11 +445,64 @@ class acf {
|
|||
|
||||
|
||||
/*
|
||||
function posts_request( $thing ) {
|
||||
* 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;
|
||||
|
||||
return $thing;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -102,8 +102,8 @@ class acf_admin_field_group {
|
|||
if( !acf_is_screen('acf-field-group') ) return;
|
||||
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// enqueue scripts
|
||||
|
|
@ -219,7 +219,7 @@ class acf_admin_field_group {
|
|||
|
||||
// render post data
|
||||
acf_form_data(array(
|
||||
'post_id' => $post->post_id,
|
||||
'post_id' => $post->ID,
|
||||
'nonce' => 'field_group',
|
||||
'ajax' => 0
|
||||
));
|
||||
|
|
@ -463,13 +463,11 @@ class acf_admin_field_group {
|
|||
}
|
||||
|
||||
|
||||
// disable local to avoid conflicts between DB and local
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
|
||||
// save fields
|
||||
unset( $_POST['acf_fields']['acfcloneindex'] );
|
||||
|
||||
if( !empty($_POST['acf_fields']) ) {
|
||||
|
||||
foreach( $_POST['acf_fields'] as $field ) {
|
||||
|
|
@ -509,16 +507,20 @@ class acf_admin_field_group {
|
|||
// delete fields
|
||||
if( $_POST['_acf_delete_fields'] ) {
|
||||
|
||||
// clean
|
||||
$ids = explode('|', $_POST['_acf_delete_fields']);
|
||||
$ids = array_map( 'intval', $ids );
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $ids as $id ) {
|
||||
|
||||
if( $id != 0 ) {
|
||||
|
||||
acf_delete_field( $id );
|
||||
|
||||
}
|
||||
// bai early if no id
|
||||
if( !$id ) continue;
|
||||
|
||||
|
||||
// delete
|
||||
acf_delete_field( $id );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -560,7 +562,8 @@ class acf_admin_field_group {
|
|||
|
||||
// get fields
|
||||
$view = array(
|
||||
'fields' => acf_get_fields_by_id( $field_group['ID'] )
|
||||
'fields' => acf_get_fields_by_id( $field_group['ID'] ),
|
||||
'parent' => 0
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -1124,8 +1127,8 @@ class acf_admin_field_group {
|
|||
|
||||
function ajax_move_field() {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
$args = acf_parse_args($_POST, array(
|
||||
|
|
|
|||
|
|
@ -71,8 +71,8 @@ class acf_settings_tools {
|
|||
|
||||
function load() {
|
||||
|
||||
// all export pages should not load local fields
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// run import / export
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ class acf_admin_update_network {
|
|||
|
||||
|
||||
// loop through sites and find updates
|
||||
$sites = wp_get_sites();
|
||||
$sites = acf_get_sites();
|
||||
|
||||
if( $sites ) {
|
||||
|
||||
|
|
@ -177,7 +177,7 @@ class acf_admin_update_network {
|
|||
|
||||
|
||||
// loop through sites and find updates
|
||||
$sites = wp_get_sites();
|
||||
$sites = acf_get_sites();
|
||||
|
||||
if( $sites ) {
|
||||
|
||||
|
|
@ -239,4 +239,49 @@ new acf_admin_update_network();
|
|||
|
||||
endif;
|
||||
|
||||
|
||||
/*
|
||||
* 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();
|
||||
|
||||
foreach( $_sites as $_site ) {
|
||||
|
||||
$_site = get_site( $_site );
|
||||
$sites[] = $_site->to_array();
|
||||
|
||||
}
|
||||
|
||||
// WP < 4.6
|
||||
} else {
|
||||
|
||||
$sites = wp_get_sites();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $sites;
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
<?php
|
||||
|
||||
// global
|
||||
global $post;
|
||||
// vars
|
||||
$field = false;
|
||||
$i = 0;
|
||||
|
||||
|
||||
// extract args
|
||||
|
|
|
|||
|
|
@ -1,27 +1,15 @@
|
|||
<?php
|
||||
|
||||
// vars
|
||||
// Note: $args is always passed to this view from above
|
||||
$fields = array();
|
||||
$fields = false;
|
||||
$layout = false;
|
||||
$parent = 0;
|
||||
$clone = false;
|
||||
|
||||
|
||||
// use fields if passed in
|
||||
extract( $args );
|
||||
|
||||
|
||||
// add clone
|
||||
$fields[] = acf_get_valid_field(array(
|
||||
'ID' => 'acfcloneindex',
|
||||
'key' => 'acfcloneindex',
|
||||
'label' => __('New Field','acf'),
|
||||
'name' => 'new_field',
|
||||
'type' => 'text',
|
||||
'parent' => $parent
|
||||
));
|
||||
|
||||
|
||||
?>
|
||||
<div class="acf-field-list-wrap">
|
||||
|
||||
|
|
@ -32,18 +20,23 @@ $fields[] = acf_get_valid_field(array(
|
|||
<li class="li-field-type"><?php _e('Type','acf'); ?></li>
|
||||
</ul>
|
||||
|
||||
<div class="acf-field-list<?php if( $layout ){ echo " layout-{$layout}"; } ?>">
|
||||
<div class="acf-field-list<?php if( $layout ){ echo " layout-{$layout}"; } ?>">
|
||||
<?php
|
||||
|
||||
<?php foreach( $fields as $i => $field ): ?>
|
||||
if( $fields ) {
|
||||
|
||||
<?php acf_get_view('field-group-field', array( 'field' => $field, 'i' => $i )); ?>
|
||||
|
||||
<?php endforeach; ?>
|
||||
foreach( $fields as $i => $field ) {
|
||||
|
||||
acf_get_view('field-group-field', array( 'field' => $field, 'i' => $i ));
|
||||
|
||||
}
|
||||
|
||||
<div class="no-fields-message" <?php if(count($fields) > 1){ echo 'style="display:none;"'; } ?>>
|
||||
}
|
||||
|
||||
?>
|
||||
<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>
|
||||
|
||||
</div>
|
||||
|
||||
<ul class="acf-hl acf-tfoot">
|
||||
|
|
@ -51,5 +44,22 @@ $fields[] = acf_get_valid_field(array(
|
|||
<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 )); ?>
|
||||
</script>
|
||||
<?php endif;?>
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ $json = acf_extract_var( $args, 'json');
|
|||
|
||||
<?php foreach( $json as $addon ):
|
||||
|
||||
$addon = acf_parse_args($addon, array(
|
||||
$addon = wp_parse_args($addon, array(
|
||||
"title" => "",
|
||||
"slug" => "",
|
||||
"description" => "",
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ function acf_is_field_group_key( $key = '' ) {
|
|||
function acf_get_valid_field_group( $field_group = false ) {
|
||||
|
||||
// parse in defaults
|
||||
$field_group = acf_parse_args( $field_group, array(
|
||||
$field_group = wp_parse_args( $field_group, array(
|
||||
'ID' => 0,
|
||||
'key' => '',
|
||||
'title' => '',
|
||||
|
|
@ -140,54 +140,71 @@ function acf_get_field_groups( $args = false ) {
|
|||
|
||||
// vars
|
||||
$field_groups = array();
|
||||
$post_ids = array();
|
||||
$cache_key = "get_field_groups";
|
||||
|
||||
|
||||
// cache
|
||||
$found = false;
|
||||
$cache = wp_cache_get( 'get_field_groups', 'acf', false, $found );
|
||||
|
||||
if( $found ) {
|
||||
// check cache for ids
|
||||
if( acf_isset_cache($cache_key) ) {
|
||||
|
||||
return acf_filter_field_groups( $cache, $args );
|
||||
$post_ids = acf_get_cache($cache_key);
|
||||
|
||||
// query DB for child ids
|
||||
} else {
|
||||
|
||||
// query
|
||||
$posts = get_posts(array(
|
||||
'post_type' => 'acf-field-group',
|
||||
'posts_per_page' => -1,
|
||||
'orderby' => 'menu_order title',
|
||||
'order' => 'asc',
|
||||
'suppress_filters' => false, // allow WPML to modify the query
|
||||
'post_status' => array('publish', 'acf-disabled'),
|
||||
'update_post_meta_cache' => false
|
||||
));
|
||||
|
||||
|
||||
// loop
|
||||
if( $posts ) {
|
||||
|
||||
foreach( $posts as $post ) {
|
||||
|
||||
$post_ids[] = $post->ID;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// update cache
|
||||
acf_set_cache($cache_key, $post_ids);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// load from DB
|
||||
$posts = get_posts(array(
|
||||
'post_type' => 'acf-field-group',
|
||||
'posts_per_page' => -1,
|
||||
'orderby' => 'menu_order title',
|
||||
'order' => 'asc',
|
||||
'suppress_filters' => false, // allow WPML to modify the query
|
||||
'post_status' => array('publish', 'acf-disabled'),
|
||||
'update_post_meta_cache' => false
|
||||
));
|
||||
|
||||
|
||||
// loop through and load field groups
|
||||
if( $posts ) {
|
||||
// load field groups
|
||||
foreach( $post_ids as $post_id ) {
|
||||
|
||||
foreach( $posts as $post ) {
|
||||
|
||||
// add to return array
|
||||
$field_groups[] = acf_get_field_group( $post );
|
||||
|
||||
}
|
||||
$field_groups[] = acf_get_field_group( $post_id );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// filter
|
||||
// - allows local field groups to be appended
|
||||
$field_groups = apply_filters('acf/get_field_groups', $field_groups);
|
||||
|
||||
|
||||
// set cache
|
||||
wp_cache_set( 'get_field_groups', $field_groups, 'acf' );
|
||||
|
||||
// filter via args
|
||||
if( $args ) {
|
||||
|
||||
$field_groups = acf_filter_field_groups( $field_groups, $args );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return acf_filter_field_groups( $field_groups, $args );
|
||||
return $field_groups;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -261,28 +278,29 @@ function acf_filter_field_groups( $field_groups, $args = false ) {
|
|||
* @return $field_group (array)
|
||||
*/
|
||||
|
||||
function acf_get_field_group( $selector = false ) {
|
||||
function acf_get_field_group( $selector = null ) {
|
||||
|
||||
// vars
|
||||
$field_group = false;
|
||||
$k = 'ID';
|
||||
$v = 0;
|
||||
$type = 'ID';
|
||||
|
||||
|
||||
// $post_id or $key
|
||||
// ID
|
||||
if( is_numeric($selector) ) {
|
||||
|
||||
$v = $selector;
|
||||
|
||||
} elseif( is_string($selector) ) {
|
||||
|
||||
$k = 'key';
|
||||
$v = $selector;
|
||||
|
||||
// do nothing
|
||||
|
||||
// object
|
||||
} elseif( is_object($selector) ) {
|
||||
|
||||
$v = $selector->ID;
|
||||
$selector = $selector->ID;
|
||||
|
||||
// string
|
||||
} elseif( is_string($selector) ) {
|
||||
|
||||
$type = 'key';
|
||||
|
||||
// other
|
||||
} else {
|
||||
|
||||
return false;
|
||||
|
|
@ -290,39 +308,50 @@ function acf_get_field_group( $selector = false ) {
|
|||
}
|
||||
|
||||
|
||||
// get cache key
|
||||
$cache_key = "get_field_group/{$k}={$v}";
|
||||
// return early if cache is found
|
||||
$cache_key = "get_field_group/{$type}={$selector}";
|
||||
|
||||
|
||||
// get cache
|
||||
$found = false;
|
||||
$cache = wp_cache_get( $cache_key, 'acf', false, $found );
|
||||
|
||||
if( $found ) return $cache;
|
||||
|
||||
|
||||
// get field group from ID or key
|
||||
if( $k == 'ID' ) {
|
||||
if( acf_isset_cache($cache_key) ) {
|
||||
|
||||
$field_group = _acf_get_field_group_by_id( $v );
|
||||
|
||||
} else {
|
||||
|
||||
$field_group = _acf_get_field_group_by_key( $v );
|
||||
return acf_get_cache($cache_key);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// ID
|
||||
if( $type == 'ID' ) {
|
||||
|
||||
$field_group = _acf_get_field_group_by_id( $selector );
|
||||
|
||||
// key
|
||||
} else {
|
||||
|
||||
$field_group = _acf_get_field_group_by_key( $selector );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// bail early if no field
|
||||
if( !$field_group ) return false;
|
||||
|
||||
|
||||
// filter for 3rd party customization
|
||||
$field_group = apply_filters('acf/get_field_group', $field_group);
|
||||
|
||||
|
||||
// set cache
|
||||
wp_cache_set( $cache_key, $field_group, 'acf' );
|
||||
// update cache
|
||||
// - Use key instead of ID for best compatibility (not all field groups exist in the DB)
|
||||
$cache_key = acf_set_cache("get_field_group/key={$field_group['key']}", $field_group);
|
||||
|
||||
|
||||
// update cache reference
|
||||
// - allow cache to return if using an ID selector
|
||||
acf_set_cache_reference("get_field_group/ID={$field_group['ID']}", $cache_key);
|
||||
|
||||
|
||||
// return
|
||||
return $field_group;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -487,6 +516,10 @@ function acf_update_field_group( $field_group = array() ) {
|
|||
$field_group = wp_unslash( $field_group );
|
||||
|
||||
|
||||
// parse types (converts string '0' to int 0)
|
||||
$field_group = acf_parse_types( $field_group );
|
||||
|
||||
|
||||
// locations may contain 'uniquid' array keys
|
||||
$field_group['location'] = array_values( $field_group['location'] );
|
||||
|
||||
|
|
@ -551,9 +584,7 @@ function acf_update_field_group( $field_group = array() ) {
|
|||
|
||||
|
||||
// clear cache
|
||||
wp_cache_delete("get_field_group/ID={$field_group['ID']}", 'acf');
|
||||
wp_cache_delete("get_field_group/key={$field_group['key']}", 'acf');
|
||||
wp_cache_delete("get_field_groups", 'acf');
|
||||
acf_delete_cache("get_field_group/key={$field_group['key']}");
|
||||
|
||||
|
||||
// return
|
||||
|
|
@ -589,8 +620,8 @@ function acf_update_field_group_wp_unique_post_slug( $slug, $post_ID, $post_stat
|
|||
|
||||
function acf_duplicate_field_group( $selector = 0, $new_post_id = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -713,8 +744,8 @@ function acf_get_field_count( $field_group ) {
|
|||
|
||||
function acf_delete_field_group( $selector = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -768,8 +799,8 @@ function acf_delete_field_group( $selector = 0 ) {
|
|||
|
||||
function acf_trash_field_group( $selector = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -823,8 +854,8 @@ function acf_trash_field_group( $selector = 0 ) {
|
|||
|
||||
function acf_untrash_field_group( $selector = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -987,6 +1018,10 @@ function acf_get_field_group_style( $field_group ) {
|
|||
|
||||
function acf_import_field_group( $field_group ) {
|
||||
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// vars
|
||||
$ref = array();
|
||||
$order = array();
|
||||
|
|
@ -1003,10 +1038,6 @@ function acf_import_field_group( $field_group ) {
|
|||
// remove old fields
|
||||
if( $field_group['ID'] ) {
|
||||
|
||||
// disable local - important as to avoid 'acf_get_fields_by_id' returning fields with ID = 0
|
||||
acf_disable_local();
|
||||
|
||||
|
||||
// load fields
|
||||
$db_fields = acf_get_fields_by_id( $field_group['ID'] );
|
||||
$db_fields = acf_prepare_fields_for_import( $db_fields );
|
||||
|
|
@ -1036,12 +1067,12 @@ function acf_import_field_group( $field_group ) {
|
|||
|
||||
}
|
||||
|
||||
|
||||
// enable local - important as to allow local to find new fields and save json file
|
||||
acf_enable_local();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// enable local filter for JSON to be created
|
||||
acf_enable_filter('local');
|
||||
|
||||
|
||||
// save field group
|
||||
$field_group = acf_update_field_group( $field_group );
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ function acf_get_valid_field( $field = false ) {
|
|||
|
||||
|
||||
// defaults
|
||||
$field = acf_parse_args($field, array(
|
||||
$field = wp_parse_args($field, array(
|
||||
'ID' => 0,
|
||||
'key' => '',
|
||||
'label' => '',
|
||||
|
|
@ -238,6 +238,37 @@ function acf_translate_field( $field ) {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* acf_clone_field
|
||||
*
|
||||
* This function will allow customization to a field when it is cloned
|
||||
* Cloning a field is the act of mimicing another. Some settings may need to be altered
|
||||
*
|
||||
* @type function
|
||||
* @date 8/03/2016
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $field (array)
|
||||
* @return $field
|
||||
*/
|
||||
|
||||
function acf_clone_field( $field, $clone_field ) {
|
||||
|
||||
// add reference
|
||||
$field['_clone'] = $clone_field['key'];
|
||||
|
||||
|
||||
// filters
|
||||
$field = apply_filters( "acf/clone_field", $field, $clone_field );
|
||||
$field = apply_filters( "acf/clone_field/type={$field['type']}", $field, $clone_field );
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* acf_prepare_field
|
||||
*
|
||||
|
|
@ -407,10 +438,6 @@ function acf_render_fields( $post_id = 0, $fields, $el = 'div', $instruction = '
|
|||
}
|
||||
|
||||
|
||||
// set prefix for correct post name (prefix + key)
|
||||
$field['prefix'] = 'acf';
|
||||
|
||||
|
||||
// render
|
||||
acf_render_field_wrap( $field, $el, $instruction );
|
||||
|
||||
|
|
@ -582,13 +609,7 @@ function acf_render_field_wrap( $field, $el = 'div', $instruction = 'label' ) {
|
|||
|
||||
|
||||
// vars
|
||||
$show_label = true;
|
||||
|
||||
if( $el == 'td' ) {
|
||||
|
||||
$show_label = false;
|
||||
|
||||
}
|
||||
$show_label = ($el !== 'td') ? true : false;
|
||||
|
||||
|
||||
?><<?php echo $el; ?> <?php echo acf_esc_attr($wrapper); ?>>
|
||||
|
|
@ -602,7 +623,6 @@ function acf_render_field_wrap( $field, $el = 'div', $instruction = 'label' ) {
|
|||
<?php endif; ?>
|
||||
<<?php echo $elements[ $el ]; ?> class="acf-input">
|
||||
<?php acf_render_field( $field ); ?>
|
||||
|
||||
<?php if( $instruction == 'field' && $field['instructions'] ): ?>
|
||||
<p class="description"><?php echo $field['instructions']; ?></p>
|
||||
<?php endif; ?>
|
||||
|
|
@ -655,11 +675,20 @@ function acf_render_field_setting( $field, $setting, $global = false ) {
|
|||
|
||||
$setting['value'] = $field[ $setting['name'] ];
|
||||
|
||||
} elseif( isset($setting['default_value']) ) {
|
||||
|
||||
// use the default value
|
||||
$setting['value'] = $setting['default_value'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$instructions_placement = acf_extract_var( $setting, 'instructions_placement', 'label' );
|
||||
|
||||
|
||||
// render
|
||||
acf_render_field_wrap( $setting, 'tr', 'label' );
|
||||
acf_render_field_wrap( $setting, 'tr', $instructions_placement );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -707,8 +736,12 @@ function acf_get_fields( $parent = false ) {
|
|||
}
|
||||
|
||||
|
||||
// filter
|
||||
$fields = apply_filters('acf/get_fields', $fields, $parent);
|
||||
|
||||
|
||||
// return
|
||||
return apply_filters('acf/get_fields', $fields, $parent);
|
||||
return $fields;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -726,53 +759,68 @@ function acf_get_fields( $parent = false ) {
|
|||
* @return $fields (array)
|
||||
*/
|
||||
|
||||
function acf_get_fields_by_id( $id = 0 ) {
|
||||
function acf_get_fields_by_id( $parent_id = 0 ) {
|
||||
|
||||
// bail early if no ID
|
||||
if( !$parent_id ) return false;
|
||||
|
||||
|
||||
// vars
|
||||
$fields = array();
|
||||
$post_ids = array();
|
||||
$cache_key = "get_fields/ID={$parent_id}";
|
||||
|
||||
|
||||
// bail early if no ID
|
||||
if( empty($id) ) return false;
|
||||
|
||||
|
||||
// cache
|
||||
$found = false;
|
||||
$cache = wp_cache_get( 'get_fields/parent=' . $id, 'acf', false, $found );
|
||||
|
||||
if( $found ) return $cache;
|
||||
|
||||
|
||||
// args
|
||||
$args = array(
|
||||
'posts_per_page' => -1,
|
||||
'post_type' => 'acf-field',
|
||||
'orderby' => 'menu_order',
|
||||
'order' => 'ASC',
|
||||
'suppress_filters' => true, // DO NOT allow WPML to modify the query
|
||||
'post_parent' => $id,
|
||||
'post_status' => 'publish, trash', // 'any' won't get trashed fields
|
||||
'update_post_meta_cache' => false
|
||||
);
|
||||
// check cache for child ids
|
||||
if( acf_isset_cache($cache_key) ) {
|
||||
|
||||
$post_ids = acf_get_cache($cache_key);
|
||||
|
||||
// load fields
|
||||
$posts = get_posts( $args );
|
||||
|
||||
if( $posts ) {
|
||||
// query DB for child ids
|
||||
} else {
|
||||
|
||||
foreach( $posts as $post ) {
|
||||
|
||||
$fields[] = acf_get_field( $post->ID );
|
||||
// query
|
||||
$posts = get_posts(array(
|
||||
'posts_per_page' => -1,
|
||||
'post_type' => 'acf-field',
|
||||
'orderby' => 'menu_order',
|
||||
'order' => 'ASC',
|
||||
'suppress_filters' => true, // DO NOT allow WPML to modify the query
|
||||
'post_parent' => $parent_id,
|
||||
'post_status' => 'publish, trash', // 'any' won't get trashed fields
|
||||
'update_post_meta_cache' => false
|
||||
));
|
||||
|
||||
|
||||
// loop
|
||||
if( $posts ) {
|
||||
|
||||
foreach( $posts as $post ) {
|
||||
|
||||
$post_ids[] = $post->ID;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// update cache
|
||||
acf_set_cache($cache_key, $post_ids);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// set cache
|
||||
wp_cache_set( 'get_fields/parent=' . $id, $fields, 'acf' );
|
||||
// bail early if no children
|
||||
if( empty($post_ids) ) return false;
|
||||
|
||||
|
||||
// load fields
|
||||
foreach( $post_ids as $post_id ) {
|
||||
|
||||
$fields[] = acf_get_field( $post_id );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $fields;
|
||||
|
|
@ -801,22 +849,22 @@ function acf_get_field( $selector = null, $db_only = false ) {
|
|||
$type = 'ID';
|
||||
|
||||
|
||||
// is $selector an ID
|
||||
// ID
|
||||
if( is_numeric($selector) ) {
|
||||
|
||||
// do nothing
|
||||
|
||||
// is $selector a string (name|key)
|
||||
} elseif( is_string($selector) ) {
|
||||
|
||||
$type = acf_is_field_key($selector) ? 'key' : 'name';
|
||||
|
||||
// is $selector an object
|
||||
// object
|
||||
} elseif( is_object($selector) ) {
|
||||
|
||||
$selector = $selector->ID;
|
||||
|
||||
// selector not valid
|
||||
// string
|
||||
} elseif( is_string($selector) ) {
|
||||
|
||||
$type = acf_is_field_key($selector) ? 'key' : 'name';
|
||||
|
||||
// other
|
||||
} else {
|
||||
|
||||
return false;
|
||||
|
|
@ -824,58 +872,65 @@ function acf_get_field( $selector = null, $db_only = false ) {
|
|||
}
|
||||
|
||||
|
||||
// get cache key
|
||||
// return early if cache is found
|
||||
$cache_key = "get_field/{$type}={$selector}";
|
||||
|
||||
|
||||
// get cache
|
||||
if( !$db_only ) {
|
||||
if( !$db_only && acf_isset_cache($cache_key) ) {
|
||||
|
||||
$found = false;
|
||||
$cache = wp_cache_get( $cache_key, 'acf', false, $found );
|
||||
|
||||
if( $found ) return $cache;
|
||||
return acf_get_cache($cache_key);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// get field group from ID or key
|
||||
// ID
|
||||
if( $type == 'ID' ) {
|
||||
|
||||
$field = _acf_get_field_by_id( $selector, $db_only );
|
||||
|
||||
// key
|
||||
} elseif( $type == 'key' ) {
|
||||
|
||||
} elseif( $type == 'name' ) {
|
||||
$field = _acf_get_field_by_key( $selector, $db_only );
|
||||
|
||||
// name (rare case)
|
||||
} else {
|
||||
|
||||
$field = _acf_get_field_by_name( $selector, $db_only );
|
||||
|
||||
} else {
|
||||
|
||||
$field = _acf_get_field_by_key( $selector, $db_only );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// bail early if no field
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// validate
|
||||
$field = acf_get_valid_field( $field );
|
||||
|
||||
|
||||
// set prefix (acf fields save with prefix 'acf')
|
||||
$field['prefix'] = 'acf';
|
||||
|
||||
|
||||
// bail early if db only value (no need to update cache)
|
||||
if( $db_only ) {
|
||||
|
||||
return $field;
|
||||
|
||||
}
|
||||
if( $db_only ) return $field;
|
||||
|
||||
|
||||
// filter for 3rd party customization
|
||||
if( $field ) {
|
||||
|
||||
$field = apply_filters( "acf/load_field", $field);
|
||||
$field = apply_filters( "acf/load_field/type={$field['type']}", $field );
|
||||
$field = apply_filters( "acf/load_field/name={$field['name']}", $field );
|
||||
$field = apply_filters( "acf/load_field/key={$field['key']}", $field );
|
||||
|
||||
}
|
||||
$field = apply_filters( "acf/load_field", $field);
|
||||
$field = apply_filters( "acf/load_field/type={$field['type']}", $field );
|
||||
$field = apply_filters( "acf/load_field/name={$field['name']}", $field );
|
||||
$field = apply_filters( "acf/load_field/key={$field['key']}", $field );
|
||||
|
||||
|
||||
// set cache
|
||||
wp_cache_set( $cache_key, $field, 'acf' );
|
||||
// update cache
|
||||
// - Use key instead of ID for best compatibility (not all fields exist in the DB)
|
||||
$cache_key = acf_set_cache("get_field/key={$field['key']}", $field);
|
||||
|
||||
|
||||
// update cache reference
|
||||
// - allow cache to return if using an ID selector
|
||||
acf_set_cache_reference("get_field/ID={$field['ID']}", $cache_key);
|
||||
|
||||
|
||||
// return
|
||||
|
|
@ -904,11 +959,7 @@ function _acf_get_field_by_id( $post_id = 0, $db_only = false ) {
|
|||
|
||||
|
||||
// bail early if no post, or is not a field
|
||||
if( empty($post) || $post->post_type != 'acf-field' ) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
if( empty($post) || $post->post_type != 'acf-field' ) return false;
|
||||
|
||||
|
||||
// unserialize
|
||||
|
|
@ -927,27 +978,21 @@ function _acf_get_field_by_id( $post_id = 0, $db_only = false ) {
|
|||
// override with JSON
|
||||
if( !$db_only && acf_is_local_field($field['key']) ) {
|
||||
|
||||
// extract some args
|
||||
$backup = acf_extract_vars($field, array(
|
||||
'ID',
|
||||
'parent'
|
||||
));
|
||||
|
||||
|
||||
// load JSON field
|
||||
$field = acf_get_local_field( $field['key'] );
|
||||
$local = acf_get_local_field( $field['key'] );
|
||||
|
||||
|
||||
// merge in backup
|
||||
$field = array_merge($field, $backup);
|
||||
// override IDs
|
||||
$local['ID'] = $field['ID'];
|
||||
$local['parent'] = $field['parent'];
|
||||
|
||||
|
||||
// return
|
||||
return $local;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// validate
|
||||
$field = acf_get_valid_field( $field );
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
|
|
@ -972,13 +1017,7 @@ function _acf_get_field_by_key( $key = '', $db_only = false ) {
|
|||
// try JSON before DB to save query time
|
||||
if( !$db_only && acf_is_local_field( $key ) ) {
|
||||
|
||||
$field = acf_get_local_field( $key );
|
||||
|
||||
// validate
|
||||
$field = acf_get_valid_field( $field );
|
||||
|
||||
// return
|
||||
return $field;
|
||||
return acf_get_local_field( $key );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1183,6 +1222,10 @@ function acf_update_field( $field = false, $specific = false ) {
|
|||
$field = wp_unslash( $field );
|
||||
|
||||
|
||||
// parse types (converts string '0' to int 0)
|
||||
$field = acf_parse_types( $field );
|
||||
|
||||
|
||||
// clean up conditional logic keys
|
||||
if( !empty($field['conditional_logic']) ) {
|
||||
|
||||
|
|
@ -1210,15 +1253,11 @@ function acf_update_field( $field = false, $specific = false ) {
|
|||
}
|
||||
|
||||
|
||||
// find correct parent
|
||||
// parent may be a field key
|
||||
// - lookup parent ID
|
||||
if( acf_is_field_key($field['parent']) ) {
|
||||
|
||||
// get parent
|
||||
$parent = acf_get_field( $field['parent'] );
|
||||
|
||||
|
||||
// update to ID
|
||||
$field['parent'] = acf_maybe_get( $parent, 'ID', 0 );
|
||||
$field['parent'] = acf_get_field_id( $field['parent'] );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1312,9 +1351,7 @@ function acf_update_field( $field = false, $specific = false ) {
|
|||
|
||||
|
||||
// clear cache
|
||||
wp_cache_delete( "get_field/ID={$field['ID']}", 'acf' );
|
||||
wp_cache_delete( "get_field/key={$field['key']}", 'acf' );
|
||||
wp_cache_delete( "get_fields/parent={$field['parent']}", 'acf' );
|
||||
acf_delete_cache("get_field/key={$field['key']}");
|
||||
|
||||
|
||||
// return
|
||||
|
|
@ -1394,8 +1431,8 @@ function acf_duplicate_fields( $fields, $new_parent = 0 ) {
|
|||
|
||||
function acf_duplicate_field( $selector = 0, $new_parent = 0 ){
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field
|
||||
|
|
@ -1520,8 +1557,8 @@ function acf_duplicate_field( $selector = 0, $new_parent = 0 ){
|
|||
|
||||
function acf_delete_field( $selector = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -1542,13 +1579,12 @@ function acf_delete_field( $selector = 0 ) {
|
|||
|
||||
|
||||
// clear cache
|
||||
wp_cache_delete( "get_field/ID={$field['ID']}", 'acf' );
|
||||
wp_cache_delete( "get_field/key={$field['key']}", 'acf' );
|
||||
wp_cache_delete( "get_fields/parent={$field['parent']}", 'acf' );
|
||||
acf_delete_cache("get_field/key={$field['key']}");
|
||||
|
||||
|
||||
// return
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1567,8 +1603,8 @@ function acf_delete_field( $selector = 0 ) {
|
|||
|
||||
function acf_trash_field( $selector = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -1589,6 +1625,7 @@ function acf_trash_field( $selector = 0 ) {
|
|||
|
||||
// return
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1607,8 +1644,8 @@ function acf_trash_field( $selector = 0 ) {
|
|||
|
||||
function acf_untrash_field( $selector = 0 ) {
|
||||
|
||||
// disable JSON to avoid conflicts between DB and JSON
|
||||
acf_disable_local();
|
||||
// disable filters to ensure ACF loads raw data from DB
|
||||
acf_disable_filters();
|
||||
|
||||
|
||||
// load the origional field gorup
|
||||
|
|
@ -1721,7 +1758,7 @@ function acf_prepare_field_for_export( $field ) {
|
|||
function acf_prepare_fields_for_import( $fields = false ) {
|
||||
|
||||
// validate
|
||||
if( empty($fields) ) return $fields;
|
||||
if( empty($fields) ) return array();
|
||||
|
||||
|
||||
// re-index array
|
||||
|
|
|
|||
1100
api/api-helpers.php
1100
api/api-helpers.php
File diff suppressed because it is too large
Load Diff
|
|
@ -243,29 +243,26 @@ function get_field_objects( $post_id = false, $format_value = true, $load_value
|
|||
|
||||
// filter post_id
|
||||
$post_id = acf_get_valid_post_id( $post_id );
|
||||
|
||||
|
||||
$info = acf_get_post_id_info( $post_id );
|
||||
|
||||
|
||||
// vars
|
||||
$meta = array();
|
||||
$fields = array();
|
||||
|
||||
|
||||
// get field_names
|
||||
if( is_numeric($post_id) ) {
|
||||
if( $info['type'] == 'post' ) {
|
||||
|
||||
$meta = get_post_meta( $post_id );
|
||||
$meta = get_post_meta( $info['id'] );
|
||||
|
||||
} elseif( strpos($post_id, 'user_') !== false ) {
|
||||
} elseif( $info['type'] == 'user' ) {
|
||||
|
||||
$user_id = (int) str_replace('user_', '', $post_id);
|
||||
$meta = get_user_meta( $info['id'] );
|
||||
|
||||
$meta = get_user_meta( $user_id );
|
||||
} elseif( $info['type'] == 'comment' ) {
|
||||
|
||||
} elseif( strpos($post_id, 'comment_') !== false ) {
|
||||
|
||||
$comment_id = (int) str_replace('comment_', '', $post_id);
|
||||
|
||||
$meta = get_comment_meta( $comment_id );
|
||||
$meta = get_comment_meta( $info['id'] );
|
||||
|
||||
} else {
|
||||
|
||||
|
|
@ -279,7 +276,24 @@ function get_field_objects( $post_id = false, $format_value = true, $load_value
|
|||
|
||||
foreach( $rows as $row ) {
|
||||
|
||||
$meta[ $row['option_name'] ][] = $row['option_value'];
|
||||
// vars
|
||||
$name = $row['option_name'];
|
||||
$prefix = $post_id . '_';
|
||||
$_prefix = '_' . $prefix;
|
||||
|
||||
|
||||
// remove prefix from name
|
||||
if( strpos($name, $prefix) === 0 ) {
|
||||
|
||||
$name = substr($name, strlen($prefix));
|
||||
|
||||
} elseif( strpos($name, $_prefix) === 0 ) {
|
||||
|
||||
$name = '_' . substr($name, strlen($_prefix));
|
||||
|
||||
}
|
||||
|
||||
$meta[ $name ][] = $row['option_value'];
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -308,8 +322,9 @@ function get_field_objects( $post_id = false, $format_value = true, $load_value
|
|||
$field = acf_get_field( $field_key );
|
||||
|
||||
|
||||
// bail early if not a parent field
|
||||
if( !$field || acf_is_sub_field($field) ) continue;
|
||||
// bail early if no field, or if the field's name is different to $k
|
||||
// - solves problem where sub fields (and clone fields) are incorrectly allowed
|
||||
if( !$field || $field['name'] !== $k ) continue;
|
||||
|
||||
|
||||
// load value
|
||||
|
|
@ -994,12 +1009,16 @@ add_shortcode( 'acf', 'acf_shortcode' );
|
|||
|
||||
function acf_form_head() {
|
||||
|
||||
// register local fields
|
||||
_acf_form_register_fields();
|
||||
|
||||
|
||||
// verify nonce
|
||||
if( acf_verify_nonce('acf_form') ) {
|
||||
|
||||
// add actions
|
||||
add_action('acf/validate_save_post', '_validate_save_post');
|
||||
add_filter('acf/pre_save_post', '_acf_pre_save_post', 5, 2);
|
||||
add_action('acf/validate_save_post', '_acf_form_validate_save_post');
|
||||
add_filter('acf/pre_save_post', '_acf_form_pre_save_post', 5, 2);
|
||||
|
||||
|
||||
// validate data
|
||||
|
|
@ -1055,10 +1074,57 @@ function acf_form_head() {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* _acf_form_register_fields
|
||||
*
|
||||
* This function will register some local fields used by the acf_form function
|
||||
*
|
||||
* @type function
|
||||
* @date 15/08/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function _acf_form_register_fields() {
|
||||
|
||||
acf_add_local_field(array(
|
||||
'prefix' => 'acf',
|
||||
'name' => '_post_title',
|
||||
'key' => '_post_title',
|
||||
'label' => __('Title', 'acf'),
|
||||
'type' => 'text',
|
||||
'required' => true,
|
||||
));
|
||||
|
||||
acf_add_local_field(array(
|
||||
'prefix' => 'acf',
|
||||
'name' => '_post_content',
|
||||
'key' => '_post_content',
|
||||
'label' => __('Content', 'acf'),
|
||||
'type' => 'wysiwyg',
|
||||
));
|
||||
|
||||
acf_add_local_field(array(
|
||||
'prefix' => 'acf',
|
||||
'name' => '_validate_email',
|
||||
'key' => '_validate_email',
|
||||
'label' => __('Validate Email', 'acf'),
|
||||
'type' => 'text',
|
||||
'value' => '',
|
||||
'wrapper' => array(
|
||||
'style' => 'display:none !important;'
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* _validate_save_post
|
||||
*
|
||||
* description
|
||||
* This function will perfrom extra validation for acf_form
|
||||
*
|
||||
* @type function
|
||||
* @date 16/06/2014
|
||||
|
|
@ -1068,25 +1134,7 @@ function acf_form_head() {
|
|||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function _validate_save_post() {
|
||||
|
||||
// save post_title
|
||||
if( isset($_POST['acf']['_post_title']) ) {
|
||||
|
||||
// get field
|
||||
$field = acf_get_valid_field(array(
|
||||
'name' => '_post_title',
|
||||
'label' => __('Title', 'acf'),
|
||||
'type' => 'text',
|
||||
'required' => true
|
||||
));
|
||||
|
||||
|
||||
// validate
|
||||
acf_validate_value( $_POST['acf']['_post_title'], $field, "acf[_post_title]" );
|
||||
|
||||
}
|
||||
|
||||
function _acf_form_validate_save_post() {
|
||||
|
||||
// honeypot
|
||||
if( !empty($_POST['acf']['_validate_email']) ) {
|
||||
|
|
@ -1099,7 +1147,7 @@ function _validate_save_post() {
|
|||
|
||||
|
||||
/*
|
||||
* _acf_pre_save_post
|
||||
* _acf_form_pre_save_post
|
||||
*
|
||||
* This filter will save post data for the acf_form function
|
||||
*
|
||||
|
|
@ -1111,7 +1159,7 @@ function _validate_save_post() {
|
|||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function _acf_pre_save_post( $post_id, $form ) {
|
||||
function _acf_form_pre_save_post( $post_id, $form ) {
|
||||
|
||||
// vars
|
||||
$save = array(
|
||||
|
|
@ -1128,7 +1176,7 @@ function _acf_pre_save_post( $post_id, $form ) {
|
|||
} elseif( $post_id == 'new_post' ) {
|
||||
|
||||
// new post
|
||||
$form['new_post'] = acf_parse_args( $form['new_post'], array(
|
||||
$form['new_post'] = wp_parse_args( $form['new_post'], array(
|
||||
'post_type' => 'post',
|
||||
'post_status' => 'draft',
|
||||
));
|
||||
|
|
@ -1267,7 +1315,7 @@ function acf_form( $args = array() ) {
|
|||
|
||||
|
||||
// new post defaults
|
||||
$args['new_post'] = acf_parse_args( $args['new_post'], array(
|
||||
$args['new_post'] = wp_parse_args( $args['new_post'], array(
|
||||
'post_type' => 'post',
|
||||
'post_status' => 'draft',
|
||||
));
|
||||
|
|
@ -1287,13 +1335,13 @@ function acf_form( $args = array() ) {
|
|||
// post_title
|
||||
if( $args['post_title'] ) {
|
||||
|
||||
$fields[] = acf_get_valid_field(array(
|
||||
'name' => '_post_title',
|
||||
'label' => __('Title', 'acf'),
|
||||
'type' => 'text',
|
||||
'value' => $post_id ? get_post_field('post_title', $post_id) : '',
|
||||
'required' => true
|
||||
));
|
||||
// load local field
|
||||
$_post_title = acf_get_field('_post_title');
|
||||
$_post_title['value'] = $post_id ? get_post_field('post_title', $post_id) : '';
|
||||
|
||||
|
||||
// append
|
||||
$fields[] = $_post_title;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1301,13 +1349,14 @@ function acf_form( $args = array() ) {
|
|||
// post_content
|
||||
if( $args['post_content'] ) {
|
||||
|
||||
$fields[] = acf_get_valid_field(array(
|
||||
'name' => '_post_content',
|
||||
'label' => __('Content', 'acf'),
|
||||
'type' => 'wysiwyg',
|
||||
'value' => $post_id ? get_post_field('post_content', $post_id) : ''
|
||||
));
|
||||
// load local field
|
||||
$_post_content = acf_get_field('_post_content');
|
||||
$_post_content['value'] = $post_id ? get_post_field('post_content', $post_id) : '';
|
||||
|
||||
|
||||
// append
|
||||
$fields[] = $_post_content;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1366,15 +1415,7 @@ function acf_form( $args = array() ) {
|
|||
// honeypot
|
||||
if( $args['honeypot'] ) {
|
||||
|
||||
$fields[] = acf_get_valid_field(array(
|
||||
'name' => '_validate_email',
|
||||
'label' => __('Validate Email', 'acf'),
|
||||
'type' => 'text',
|
||||
'value' => '',
|
||||
'wrapper' => array(
|
||||
'style' => 'display:none;'
|
||||
)
|
||||
));
|
||||
$fields[] = acf_get_field('_validate_email');
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1824,20 +1865,24 @@ function delete_row( $selector, $row = 1, $post_id = false ) {
|
|||
if( empty($rows) ) return false;
|
||||
|
||||
|
||||
// deincrement
|
||||
if( $row == count($rows) ) {
|
||||
|
||||
acf_update_metadata( $post_id, $field['name'], $row-1 );
|
||||
|
||||
}
|
||||
// vars
|
||||
$i = $row-1;
|
||||
|
||||
|
||||
// update sub field values
|
||||
foreach( $rows[0] as $k => $v ) {
|
||||
|
||||
update_sub_field( array( $field['key'], $row, $k ), null, $post_id );
|
||||
|
||||
}
|
||||
// bail early if row doesn't exist
|
||||
if( empty($rows[ $i ]) ) return false;
|
||||
|
||||
|
||||
// unset
|
||||
unset( $rows[ $i ] );
|
||||
|
||||
|
||||
// reindex
|
||||
$rows = array_values($rows);
|
||||
|
||||
|
||||
// update
|
||||
acf_update_value( $rows, $post_id, $field );
|
||||
|
||||
|
||||
// return
|
||||
|
|
|
|||
|
|
@ -19,71 +19,37 @@ 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( !$post_id ) return $value;
|
||||
if( !$info['id'] ) return $value;
|
||||
|
||||
|
||||
// add prefix for hidden meta
|
||||
if( $hidden ) {
|
||||
// option
|
||||
if( $info['type'] === 'option' ) {
|
||||
|
||||
$name = '_' . $name;
|
||||
$name = $prefix . $post_id . '_' . $name;
|
||||
$value = get_option( $name, null );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// post
|
||||
if( is_numeric($post_id) ) {
|
||||
|
||||
$meta = get_metadata( 'post', $post_id, $name, false );
|
||||
|
||||
if( isset($meta[0]) ) {
|
||||
|
||||
$value = $meta[0];
|
||||
|
||||
}
|
||||
|
||||
// user
|
||||
} elseif( substr($post_id, 0, 5) == 'user_' ) {
|
||||
|
||||
$user_id = (int) substr($post_id, 5);
|
||||
|
||||
$meta = get_metadata( 'user', $user_id, $name, false );
|
||||
|
||||
if( isset($meta[0]) ) {
|
||||
|
||||
$value = $meta[0];
|
||||
|
||||
}
|
||||
|
||||
// comment
|
||||
} elseif( substr($post_id, 0, 8) == 'comment_' ) {
|
||||
|
||||
$comment_id = (int) substr($post_id, 8);
|
||||
|
||||
$meta = get_metadata( 'comment', $comment_id, $name, false );
|
||||
|
||||
if( isset($meta[0]) ) {
|
||||
|
||||
$value = $meta[0];
|
||||
|
||||
}
|
||||
|
||||
// meta
|
||||
} else {
|
||||
|
||||
// modify prefix for hidden meta
|
||||
if( $hidden ) {
|
||||
|
||||
$post_id = '_' . $post_id;
|
||||
$name = substr($name, 1);
|
||||
|
||||
}
|
||||
$name = $prefix . $name;
|
||||
$meta = get_metadata( $info['type'], $info['id'], $name, false );
|
||||
|
||||
$value = get_option( $post_id . '_' . $name, null );
|
||||
if( isset($meta[0]) ) {
|
||||
|
||||
$value = $meta[0];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
|
@ -111,53 +77,34 @@ function acf_update_metadata( $post_id = 0, $name = '', $value = '', $hidden = f
|
|||
|
||||
// vars
|
||||
$return = false;
|
||||
$prefix = $hidden ? '_' : '';
|
||||
|
||||
|
||||
// add prefix for hidden meta
|
||||
if( $hidden ) {
|
||||
|
||||
$name = '_' . $name;
|
||||
|
||||
}
|
||||
// get post_id info
|
||||
$info = acf_get_post_id_info($post_id);
|
||||
|
||||
|
||||
// postmeta
|
||||
if( is_numeric($post_id) ) {
|
||||
|
||||
$return = update_metadata('post', $post_id, $name, $value );
|
||||
// bail early if no $post_id (acf_form - new_post)
|
||||
if( !$info['id'] ) return $return;
|
||||
|
||||
// usermeta
|
||||
} elseif( substr($post_id, 0, 5) == 'user_' ) {
|
||||
|
||||
$user_id = (int) substr($post_id, 5);
|
||||
|
||||
$return = update_metadata('user', $user_id, $name, $value);
|
||||
|
||||
// commentmeta
|
||||
} elseif( substr($post_id, 0, 8) == 'comment_' ) {
|
||||
|
||||
$comment_id = (int) substr($post_id, 8);
|
||||
|
||||
$return = update_metadata('comment', $comment_id, $name, $value);
|
||||
|
||||
// options
|
||||
// option
|
||||
if( $info['type'] === 'option' ) {
|
||||
|
||||
$name = $prefix . $post_id . '_' . $name;
|
||||
$return = acf_update_option( $name, $value );
|
||||
|
||||
// meta
|
||||
} else {
|
||||
|
||||
// modify prefix for hidden meta
|
||||
if( $hidden ) {
|
||||
|
||||
$post_id = '_' . $post_id;
|
||||
$name = substr($name, 1);
|
||||
|
||||
}
|
||||
|
||||
$return = acf_update_option( $post_id . '_' . $name, $value );
|
||||
$name = $prefix . $name;
|
||||
$return = update_metadata( $info['type'], $info['id'], $name, $value );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return (boolean) $return;
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -181,47 +128,28 @@ function acf_delete_metadata( $post_id = 0, $name = '', $hidden = false ) {
|
|||
|
||||
// vars
|
||||
$return = false;
|
||||
$prefix = $hidden ? '_' : '';
|
||||
|
||||
|
||||
// add prefix for hidden meta
|
||||
if( $hidden ) {
|
||||
|
||||
$name = '_' . $name;
|
||||
|
||||
}
|
||||
// get post_id info
|
||||
$info = acf_get_post_id_info($post_id);
|
||||
|
||||
|
||||
// postmeta
|
||||
if( is_numeric($post_id) ) {
|
||||
|
||||
$return = delete_metadata('post', $post_id, $name );
|
||||
// bail early if no $post_id (acf_form - new_post)
|
||||
if( !$info['id'] ) return $return;
|
||||
|
||||
// usermeta
|
||||
} elseif( substr($post_id, 0, 5) == 'user_' ) {
|
||||
|
||||
$user_id = (int) substr($post_id, 5);
|
||||
|
||||
$return = delete_metadata('user', $user_id, $name);
|
||||
|
||||
// commentmeta
|
||||
} elseif( substr($post_id, 0, 8) == 'comment_' ) {
|
||||
|
||||
$comment_id = (int) substr($post_id, 8);
|
||||
|
||||
$return = delete_metadata('comment', $comment_id, $name);
|
||||
|
||||
// options
|
||||
// option
|
||||
if( $info['type'] === 'option' ) {
|
||||
|
||||
$name = $prefix . $post_id . '_' . $name;
|
||||
$return = delete_option( $name );
|
||||
|
||||
// meta
|
||||
} else {
|
||||
|
||||
// modify prefix for hidden meta
|
||||
if( $hidden ) {
|
||||
|
||||
$post_id = '_' . $post_id;
|
||||
$name = substr($name, 1);
|
||||
|
||||
}
|
||||
|
||||
$return = delete_option( $post_id . '_' . $name );
|
||||
$name = $prefix . $name;
|
||||
$return = delete_metadata( $info['type'], $info['id'], $name );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -302,14 +230,16 @@ function acf_update_option( $option = '', $value = '', $autoload = null ) {
|
|||
|
||||
function acf_get_value( $post_id = 0, $field ) {
|
||||
|
||||
// cache
|
||||
$found = false;
|
||||
$cache_slug = "load_value/post_id={$post_id}/name={$field['name']}";
|
||||
$cache = wp_cache_get($cache_slug, 'acf', false, $found);
|
||||
// vars
|
||||
$cache_key = "get_value/post_id={$post_id}/name={$field['name']}";
|
||||
|
||||
|
||||
// return cache if found
|
||||
if( $found ) return $cache;
|
||||
// return early if cache is found
|
||||
if( acf_isset_cache($cache_key) ) {
|
||||
|
||||
return acf_get_cache($cache_key);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// load value
|
||||
|
|
@ -336,7 +266,7 @@ function acf_get_value( $post_id = 0, $field ) {
|
|||
|
||||
|
||||
// update cache
|
||||
wp_cache_set($cache_slug, $value, 'acf');
|
||||
acf_set_cache($cache_key, $value);
|
||||
|
||||
|
||||
// return
|
||||
|
|
@ -362,14 +292,16 @@ function acf_get_value( $post_id = 0, $field ) {
|
|||
|
||||
function acf_format_value( $value, $post_id, $field ) {
|
||||
|
||||
// try cache
|
||||
$found = false;
|
||||
$cache_slug = "format_value/post_id={$post_id}/name={$field['name']}";
|
||||
$cache = wp_cache_get($cache_slug, 'acf', false, $found);
|
||||
// vars
|
||||
$cache_key = "format_value/post_id={$post_id}/name={$field['name']}";
|
||||
|
||||
|
||||
// return cache if found
|
||||
if( $found ) return $cache;
|
||||
// return early if cache is found
|
||||
if( acf_isset_cache($cache_key) ) {
|
||||
|
||||
return acf_get_cache($cache_key);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// apply filters
|
||||
|
|
@ -380,7 +312,7 @@ function acf_format_value( $value, $post_id, $field ) {
|
|||
|
||||
|
||||
// update cache
|
||||
wp_cache_set($cache_slug, $value, 'acf');
|
||||
acf_set_cache($cache_key, $value);
|
||||
|
||||
|
||||
// return
|
||||
|
|
@ -429,8 +361,8 @@ function acf_update_value( $value = null, $post_id = 0, $field ) {
|
|||
|
||||
|
||||
// clear cache
|
||||
wp_cache_delete( "load_value/post_id={$post_id}/name={$field['name']}", 'acf' );
|
||||
wp_cache_delete( "format_value/post_id={$post_id}/name={$field['name']}", 'acf' );
|
||||
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
|
||||
|
|
@ -471,8 +403,8 @@ function acf_delete_value( $post_id = 0, $field ) {
|
|||
|
||||
|
||||
// clear cache
|
||||
wp_cache_delete( "load_value/post_id={$post_id}/name={$field['name']}", 'acf' );
|
||||
wp_cache_delete( "format_value/post_id={$post_id}/name={$field['name']}", 'acf' );
|
||||
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
|
||||
|
|
@ -480,4 +412,72 @@ function acf_delete_value( $post_id = 0, $field ) {
|
|||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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 );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -348,6 +348,16 @@ html[dir="rtl"] .acf-c0 {
|
|||
.acf-field textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
/* disabled */
|
||||
.acf-field input:disabled,
|
||||
.acf-field select:disabled,
|
||||
.acf-field textarea:disabled {
|
||||
background: #f8f8f8;
|
||||
}
|
||||
.acf-field input[readonly],
|
||||
.acf-field textarea[readonly] {
|
||||
background: #f8f8f8;
|
||||
}
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Text
|
||||
|
|
@ -458,6 +468,10 @@ html[dir="rtl"] input.acf-is-prepended.acf-is-appended {
|
|||
* Select2 (v3)
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
.select2-container.-acf {
|
||||
/* open */
|
||||
/* single open */
|
||||
}
|
||||
.select2-container.-acf .select2-choices {
|
||||
background: #fff;
|
||||
border-color: #ddd;
|
||||
|
|
@ -483,13 +497,6 @@ html[dir="rtl"] input.acf-is-prepended.acf-is-appended {
|
|||
.select2-container.-acf .select2-search-choice-close {
|
||||
margin-top: -1px;
|
||||
}
|
||||
/* open */
|
||||
.select2-container.-acf.select2-container-active .select2-choices,
|
||||
.select2-container.-acf.select2-dropdown-open .select2-choices {
|
||||
border-color: #5B9DD9;
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
/* single */
|
||||
.select2-container.-acf .select2-choice {
|
||||
border-color: #BBBBBB;
|
||||
}
|
||||
|
|
@ -498,11 +505,38 @@ html[dir="rtl"] input.acf-is-prepended.acf-is-appended {
|
|||
border-left-color: #DFDFDF;
|
||||
padding-left: 1px;
|
||||
}
|
||||
/* single open */
|
||||
.select2-container.-acf .select2-choice .select2-result-description {
|
||||
display: none;
|
||||
}
|
||||
.select2-container.-acf.select2-container-active .select2-choices,
|
||||
.select2-container.-acf.select2-dropdown-open .select2-choices {
|
||||
border-color: #5B9DD9;
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
.select2-container.-acf.select2-dropdown-open .select2-choice {
|
||||
background: #fff;
|
||||
border-color: #5B9DD9;
|
||||
}
|
||||
/* description */
|
||||
.select2-drop {
|
||||
/* search*/
|
||||
/* result */
|
||||
}
|
||||
.select2-drop .select2-search {
|
||||
padding: 4px 4px 0;
|
||||
}
|
||||
.select2-drop .select2-result {
|
||||
/* hover*/
|
||||
}
|
||||
.select2-drop .select2-result .select2-result-description {
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.select2-drop .select2-result.select2-highlighted .select2-result-description {
|
||||
color: #fff;
|
||||
opacity: 0.75;
|
||||
}
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Select2 (v4)
|
||||
|
|
@ -1425,6 +1459,14 @@ html[dir="rtl"] .acf-file-uploader .file-info ul {
|
|||
}
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Clone field
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
.acf-clone-fields {
|
||||
border: #dfdfdf solid 1px;
|
||||
}
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Taxonomy
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
|
|
|||
|
|
@ -11,10 +11,6 @@
|
|||
'ready': 'init'
|
||||
},
|
||||
|
||||
filters: {
|
||||
'get_fields 99': 'get_fields'
|
||||
},
|
||||
|
||||
events: {
|
||||
'submit #post': 'submit',
|
||||
'click a[href="#"]': 'preventDefault',
|
||||
|
|
@ -101,27 +97,6 @@
|
|||
},
|
||||
|
||||
|
||||
/*
|
||||
* get_fields
|
||||
*
|
||||
* This function will remove fields from the clone index
|
||||
* Without this, field JS such as Select2 may run on fields which are used as a template
|
||||
*
|
||||
* @type function
|
||||
* @date 15/08/2015
|
||||
* @since 5.2.3
|
||||
*
|
||||
* @param $fields (selection)
|
||||
* @return $fields
|
||||
*/
|
||||
|
||||
get_fields: function( $fields ) {
|
||||
|
||||
return $fields.not('.acf-field-object[data-id="acfcloneindex"] .acf-field');
|
||||
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
* preventDefault
|
||||
*
|
||||
|
|
@ -165,7 +140,7 @@
|
|||
$('.acf-field-list').each(function(){
|
||||
|
||||
// vars
|
||||
var $fields = $(this).children('.acf-field-object').not('[data-id="acfcloneindex"]');
|
||||
var $fields = $(this).children('.acf-field-object');
|
||||
|
||||
|
||||
// loop over fields
|
||||
|
|
@ -456,15 +431,6 @@
|
|||
open = $(this).hasClass('open');
|
||||
|
||||
|
||||
// clone
|
||||
if( ID == 'acfcloneindex' ) {
|
||||
|
||||
$(this).remove();
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// close
|
||||
if( open ) {
|
||||
|
||||
|
|
@ -745,8 +711,7 @@
|
|||
add_field: function( $fields ){
|
||||
|
||||
// clone tr
|
||||
var $clone = $fields.children('.acf-field-object[data-id="acfcloneindex"]'),
|
||||
$el = $clone.clone(),
|
||||
var $el = $( $('#tmpl-acf-field').html() ),
|
||||
$label = $el.find('.field-label:first'),
|
||||
$name = $el.find('.field-name:first');
|
||||
|
||||
|
|
@ -756,7 +721,7 @@
|
|||
|
||||
|
||||
// append to table
|
||||
$clone.before( $el );
|
||||
$fields.append( $el );
|
||||
|
||||
|
||||
// clear name
|
||||
|
|
@ -926,7 +891,7 @@
|
|||
} else {
|
||||
|
||||
// Case: sub field's settings have changed
|
||||
$field.find('.acf-field-object').not('[data-id="acfcloneindex"]').each(function(){
|
||||
$field.find('.acf-field-object').each(function(){
|
||||
|
||||
if( !self.get_field_meta( $(this), 'ID' ) ) {
|
||||
|
||||
|
|
@ -1069,14 +1034,6 @@
|
|||
var id = this.get_field_meta($el, 'ID');
|
||||
|
||||
|
||||
// bail early if cloneindex
|
||||
if( id == 'acfcloneindex' ) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// add to remove list
|
||||
if( id ) {
|
||||
|
||||
|
|
@ -1650,10 +1607,6 @@
|
|||
|
||||
return;
|
||||
|
||||
} else if( this_key == 'acfcloneindex' ) {
|
||||
|
||||
return;
|
||||
|
||||
} else if( this_key == key ) {
|
||||
|
||||
return;
|
||||
|
|
@ -2519,15 +2472,19 @@
|
|||
render: function( $el ){
|
||||
|
||||
// bail early if not correct field type
|
||||
if( $el.attr('data-type') != 'tab' ) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
if( $el.attr('data-type') != 'tab' ) return;
|
||||
|
||||
|
||||
// vars
|
||||
var id = $el.data('id');
|
||||
|
||||
|
||||
// clear name
|
||||
$el.find('.acf-field[data-name="name"] input').val('').trigger('change');
|
||||
$('#acf_fields-' + id + '-name').val('').trigger('change');
|
||||
|
||||
|
||||
// clear required
|
||||
$('#acf_fields-' + id + '-required-0').trigger('click');
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -2557,17 +2514,207 @@
|
|||
render: function( $el ){
|
||||
|
||||
// bail early if not correct field type
|
||||
if( $el.attr('data-type') != 'message' ) {
|
||||
if( $el.attr('data-type') != 'message' ) return;
|
||||
|
||||
|
||||
// vars
|
||||
var id = $el.data('id');
|
||||
|
||||
|
||||
// clear name
|
||||
$('#acf_fields-' + id + '-name').val('').trigger('change');
|
||||
|
||||
|
||||
// clear required
|
||||
$('#acf_fields-' + id + '-required-0').trigger('click');
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* clone
|
||||
*
|
||||
* This field type requires some extra logic for its settings
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
var acf_settings_clone = acf.model.extend({
|
||||
|
||||
actions: {
|
||||
'open_field': 'render',
|
||||
'change_field_type': 'render'
|
||||
},
|
||||
|
||||
filters: {
|
||||
'select2_args': 'select2_args',
|
||||
'select2_ajax_data': 'select2_ajax_data'
|
||||
},
|
||||
|
||||
events: {
|
||||
'change .acf-field-object-clone .setting-display': 'render_display',
|
||||
'change .acf-field-object-clone .setting-prefix-label input': 'render_prefix_label',
|
||||
'change .acf-field-object-clone .setting-prefix-name input': 'render_prefix_name',
|
||||
},
|
||||
|
||||
event: function( e ){
|
||||
|
||||
// override
|
||||
return e.$el.closest('.acf-field-object');
|
||||
|
||||
},
|
||||
|
||||
return;
|
||||
render: function( $el ){
|
||||
|
||||
// bail early if not correct field type
|
||||
if( $el.attr('data-type') != 'clone' ) return;
|
||||
|
||||
|
||||
// render
|
||||
this.render_display( $el );
|
||||
this.render_prefix_label( $el );
|
||||
this.render_prefix_name( $el );
|
||||
|
||||
},
|
||||
|
||||
render_display: function( $el ){
|
||||
|
||||
// vars
|
||||
var $layout = $el.find('.acf-field[data-name="layout"]'),
|
||||
$display = $el.find('.acf-field[data-name="display"] select'),
|
||||
$conditional = $el.find('.acf-field[data-name="conditional_logic"]'),
|
||||
$wrapper = $el.find('.acf-field[data-name="wrapper"]');
|
||||
|
||||
|
||||
// hide conditional logic
|
||||
if( $display.val() == 'seamless' ) {
|
||||
|
||||
$conditional.hide();
|
||||
$wrapper.hide();
|
||||
$layout.hide();
|
||||
|
||||
} else {
|
||||
|
||||
$conditional.show();
|
||||
$wrapper.show();
|
||||
$layout.show();
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
render_prefix_label: function( $el ){
|
||||
|
||||
// vars
|
||||
var $prefix_label = $el.find('.setting-prefix-label input:checked'),
|
||||
$field_label = $el.find('.field-label'),
|
||||
$code = $el.find('.prefix-label-code-1');
|
||||
|
||||
|
||||
// html
|
||||
var html = '%field_label%';
|
||||
|
||||
if( $prefix_label.val() === '1' ) {
|
||||
|
||||
html = $field_label.val() + ' ' + html;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// clear name
|
||||
$el.find('.acf-field[data-name="name"] input').val('').trigger('change');
|
||||
// update code
|
||||
$code.html( html );
|
||||
|
||||
},
|
||||
|
||||
render_prefix_name: function( $el ){
|
||||
|
||||
// vars
|
||||
var $prefix_name = $el.find('.setting-prefix-name input:checked'),
|
||||
$field_name = $el.find('.field-name'),
|
||||
$code = $el.find('.prefix-name-code-1');
|
||||
|
||||
|
||||
// html
|
||||
var label = '%field_name%';
|
||||
|
||||
if( $prefix_name.val() === '1' ) {
|
||||
|
||||
label = $field_name.val() + '_' + label;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// html
|
||||
$code.html( label );
|
||||
|
||||
},
|
||||
|
||||
select2_args: function( select2_args, $select, args ){
|
||||
|
||||
// bail early if not clone
|
||||
if( args.ajax_action !== 'acf/fields/clone/query' ) return select2_args;
|
||||
|
||||
|
||||
// remain open on select
|
||||
select2_args.closeOnSelect = false;
|
||||
|
||||
|
||||
// return
|
||||
return select2_args;
|
||||
},
|
||||
|
||||
select2_ajax_data: function( data, args, params ){
|
||||
|
||||
// bail early if not clone
|
||||
if( args.ajax_action !== 'acf/fields/clone/query' ) return select2_args;
|
||||
|
||||
|
||||
// find current fields
|
||||
var fields = {};
|
||||
|
||||
|
||||
// loop
|
||||
$('.acf-field-object').each(function(){
|
||||
|
||||
// vars
|
||||
var $el = $(this),
|
||||
key = $el.data('key'),
|
||||
type = $el.data('type'),
|
||||
label = $el.find('.field-label:first').val(),
|
||||
$ancestors = $el.parents('.acf-field-object');
|
||||
|
||||
|
||||
// label
|
||||
fields[ key ] = {
|
||||
'key': key,
|
||||
'type': type,
|
||||
'label': label,
|
||||
'ancestors': $ancestors.length
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
|
||||
// append fields
|
||||
data.fields = fields;
|
||||
|
||||
|
||||
// append title
|
||||
data.title = $('#title').val();
|
||||
|
||||
|
||||
// return
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
|
|
|||
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
|
|
@ -53,7 +53,7 @@ class acf_ajax {
|
|||
function update_user_setting() {
|
||||
|
||||
// options
|
||||
$options = acf_parse_args( $_POST, array(
|
||||
$options = wp_parse_args( $_POST, array(
|
||||
'name' => '',
|
||||
'value' => '',
|
||||
'nonce' => '',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,300 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('acf_cache') ) :
|
||||
|
||||
class acf_cache {
|
||||
|
||||
|
||||
/*
|
||||
* __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() {
|
||||
|
||||
// vars
|
||||
$this->cache = array();
|
||||
$this->reference = array();
|
||||
|
||||
|
||||
// prevent ACF from persistent cache
|
||||
wp_cache_add_non_persistent_groups('acf');
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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 = '' ) {
|
||||
|
||||
// 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 = '' ) {
|
||||
|
||||
// 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 = '' ) {
|
||||
|
||||
wp_cache_set($key, $data, 'acf');
|
||||
|
||||
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 = '' ) {
|
||||
|
||||
$this->reference[ $key ] = $reference;
|
||||
|
||||
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 = '' ) {
|
||||
|
||||
return wp_cache_delete( $key, 'acf' );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf()->cache = new acf_cache();
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 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 );
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
<?php
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('acf_fields') ) :
|
||||
|
||||
class acf_fields {
|
||||
|
||||
|
||||
/*
|
||||
* __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() {
|
||||
|
||||
// vars
|
||||
$this->types = array();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_field_type
|
||||
*
|
||||
* This function will store a field type class
|
||||
*
|
||||
* @type function
|
||||
* @date 6/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $instance (object)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_field_type( $instance ) {
|
||||
|
||||
// bail ealry if no field name
|
||||
if( !$instance->name ) return false;
|
||||
|
||||
|
||||
// bail ealry if already exists
|
||||
if( isset($this->types[ $instance->name ]) ) return false;
|
||||
|
||||
|
||||
// append
|
||||
$this->types[ $instance->name ] = $instance;
|
||||
|
||||
|
||||
// return
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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 ) {
|
||||
|
||||
// bail ealry if doesn't exist
|
||||
if( !isset($this->types[ $name ]) ) return false;
|
||||
|
||||
|
||||
// return
|
||||
return $this->types[ $name ];
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf()->fields = new acf_fields();
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* acf_register_field_type
|
||||
*
|
||||
* alias of acf()->fields->register_field_type()
|
||||
*
|
||||
* @type function
|
||||
* @date 6/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_register_field_type( $instance ) {
|
||||
|
||||
return acf()->fields->register_field_type( $instance );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* acf_get_field_type
|
||||
*
|
||||
* alias of acf()->fields->get_field_type()
|
||||
*
|
||||
* @type function
|
||||
* @date 6/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function acf_get_field_type( $name ) {
|
||||
|
||||
return acf()->fields->get_field_type( $name );
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -426,7 +426,7 @@ function acf_enqueue_uploader() {
|
|||
|
||||
|
||||
// create dummy editor
|
||||
?><div class="acf-hidden"><?php wp_editor( '', 'acf_content' ); ?></div><?php
|
||||
?><div id="acf-hidden-wp-editor" class="acf-hidden"><?php wp_editor( '', 'acf_content' ); ?></div><?php
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,11 +36,7 @@ class acf_json {
|
|||
function update_field_group( $field_group ) {
|
||||
|
||||
// validate
|
||||
if( !acf_get_setting('json') ) {
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
if( !acf_get_setting('json') ) return;
|
||||
|
||||
|
||||
// get fields
|
||||
|
|
|
|||
1277
core/local.php
1277
core/local.php
File diff suppressed because it is too large
Load Diff
|
|
@ -1137,7 +1137,12 @@ new acf_location();
|
|||
|
||||
function acf_get_field_group_visibility( $field_group, $args = array() ) {
|
||||
|
||||
// bail early if not active
|
||||
if( !$field_group['active'] ) return false;
|
||||
|
||||
|
||||
// vars
|
||||
$visibility = false;
|
||||
$args = acf_parse_args($args, array(
|
||||
'post_id' => 0,
|
||||
'post_type' => 0,
|
||||
|
|
@ -1163,14 +1168,6 @@ function acf_get_field_group_visibility( $field_group, $args = array() ) {
|
|||
$args = apply_filters('acf/location/screen', $args, $field_group);
|
||||
|
||||
|
||||
// bail early if not active
|
||||
if( !$field_group['active'] ) return false;
|
||||
|
||||
|
||||
// vars
|
||||
$visibility = false;
|
||||
|
||||
|
||||
// loop through location rules
|
||||
foreach( $field_group['location'] as $group_id => $group ) {
|
||||
|
||||
|
|
|
|||
|
|
@ -51,9 +51,9 @@ class acf_media {
|
|||
|
||||
// append
|
||||
$l10n['media'] = array(
|
||||
'select' => __("Select",'acf'),
|
||||
'edit' => __("Edit",'acf'),
|
||||
'update' => __("Update",'acf'),
|
||||
'select' => _x('Select', 'verb', 'acf'),
|
||||
'edit' => _x('Edit', 'verb', 'acf'),
|
||||
'update' => _x('Update', 'verb', 'acf'),
|
||||
'uploadedTo' => __("Uploaded to this post",'acf'),
|
||||
'default_icon' => wp_mime_type_icon()
|
||||
);
|
||||
|
|
|
|||
|
|
@ -14,16 +14,80 @@ class acf_revisions {
|
|||
* @return N/A
|
||||
*/
|
||||
|
||||
function __construct()
|
||||
{
|
||||
// actions
|
||||
function __construct() {
|
||||
|
||||
// actions
|
||||
add_action('save_post', array($this, 'save_post'), 99, 3);
|
||||
add_action('wp_restore_post_revision', array($this, 'wp_restore_post_revision'), 10, 2 );
|
||||
|
||||
|
||||
// filters
|
||||
add_filter('_wp_post_revision_fields', array($this, 'wp_preview_post_fields') );
|
||||
add_filter('_wp_post_revision_fields', array($this, 'wp_post_revision_fields') );
|
||||
add_filter('wp_save_post_revision_check_for_changes', array($this, 'force_save_revision'), 10, 3);
|
||||
add_filter('wp_save_post_revision_check_for_changes', array($this, 'wp_save_post_revision_check_for_changes'), 10, 3);
|
||||
add_filter('_wp_post_revision_fields', array($this, 'wp_preview_post_fields'), 10, 2 );
|
||||
add_filter('_wp_post_revision_fields', array($this, 'wp_post_revision_fields'), 10, 2 );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_post_latest_revision
|
||||
*
|
||||
* This function will return the latest revision for a given post
|
||||
*
|
||||
* @type function
|
||||
* @date 25/06/2016
|
||||
* @since 5.3.8
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function get_post_latest_revision( $post_id ) {
|
||||
|
||||
// vars
|
||||
$revisions = wp_get_post_revisions( $post_id );
|
||||
|
||||
|
||||
// shift off and return first revision (will return null if no revisions)
|
||||
$revision = array_shift($revisions);
|
||||
|
||||
|
||||
// return
|
||||
return $revision;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* save_post
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 25/06/2016
|
||||
* @since 5.3.8
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function save_post( $post_id, $post, $update ) {
|
||||
|
||||
// bail ealry if post type does not support revision
|
||||
if( !post_type_supports($post->post_type, 'revisions') ) return $post_id;
|
||||
|
||||
|
||||
// get latest revision
|
||||
$revision = $this->get_post_latest_revision( $post_id );
|
||||
|
||||
|
||||
// save
|
||||
if( $revision ) {
|
||||
|
||||
acf_copy_postmeta( $post_id, $revision->ID );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -44,12 +108,12 @@ class acf_revisions {
|
|||
|
||||
function wp_preview_post_fields( $fields ) {
|
||||
|
||||
// vars
|
||||
$wp_preview = acf_maybe_get($_POST, 'wp-preview');
|
||||
|
||||
|
||||
// bail early if not previewing a post
|
||||
if( empty($_POST['wp-preview']) || $_POST['wp-preview'] != 'dopreview') {
|
||||
|
||||
return $fields;
|
||||
|
||||
}
|
||||
if( $wp_preview !== 'dopreview' ) return $fields;
|
||||
|
||||
|
||||
// add to fields if ACF has changed
|
||||
|
|
@ -67,7 +131,7 @@ class acf_revisions {
|
|||
|
||||
|
||||
/*
|
||||
* force_save_revision
|
||||
* wp_save_post_revision_check_for_changes
|
||||
*
|
||||
* This filter will return false and force WP to save a revision. This is required due to
|
||||
* WP checking only post_title, post_excerpt and post_content values, not custom fields.
|
||||
|
|
@ -81,17 +145,20 @@ class acf_revisions {
|
|||
* @return $return (boolean)
|
||||
*/
|
||||
|
||||
function force_save_revision( $return, $last_revision, $post )
|
||||
{
|
||||
// preview hack
|
||||
if( isset($_POST['_acfchanged']) && $_POST['_acfchanged'] == '1' )
|
||||
{
|
||||
function wp_save_post_revision_check_for_changes( $return, $last_revision, $post ) {
|
||||
|
||||
|
||||
// look for _acfchanged
|
||||
if( acf_maybe_get($_POST, '_acfchanged') === '1' ) {
|
||||
|
||||
$return = false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -109,112 +176,112 @@ class acf_revisions {
|
|||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function wp_post_revision_fields( $return ) {
|
||||
function wp_post_revision_fields( $fields, $post = null ) {
|
||||
|
||||
|
||||
//globals
|
||||
global $post, $pagenow;
|
||||
|
||||
|
||||
// validate
|
||||
$allowed = false;
|
||||
|
||||
|
||||
// Normal revisions page
|
||||
if( $pagenow == 'revision.php' )
|
||||
{
|
||||
$allowed = true;
|
||||
}
|
||||
|
||||
|
||||
// WP 3.6 AJAX revision
|
||||
if( $pagenow == 'admin-ajax.php' && isset($_POST['action']) && $_POST['action'] == 'get-revision-diffs' )
|
||||
{
|
||||
$allowed = true;
|
||||
}
|
||||
|
||||
|
||||
// bail
|
||||
if( !$allowed )
|
||||
{
|
||||
return $return;
|
||||
// validate page
|
||||
if( acf_is_screen('revision') || acf_is_ajax('get-revision-diffs') ) {
|
||||
|
||||
// allow
|
||||
|
||||
} else {
|
||||
|
||||
// bail early (most likely saving a post)
|
||||
return $fields;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$post_id = 0;
|
||||
$append = array();
|
||||
$order = array();
|
||||
$post_id = acf_maybe_get($post, 'ID');
|
||||
|
||||
|
||||
// determine $post_id
|
||||
if( isset($_POST['post_id']) )
|
||||
{
|
||||
$post_id = $_POST['post_id'];
|
||||
}
|
||||
elseif( isset($post->ID) )
|
||||
{
|
||||
// compatibility with WP < 4.5 (test)
|
||||
if( !$post_id ) {
|
||||
|
||||
global $post;
|
||||
$post_id = $post->ID;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// setup global array
|
||||
$GLOBALS['acf_revisions_fields'] = array();
|
||||
// get all postmeta
|
||||
$meta = get_post_meta( $post_id );
|
||||
|
||||
|
||||
// get field objects
|
||||
$custom_fields = get_post_custom( $post_id );
|
||||
// bail early if no meta
|
||||
if( !$meta ) return $fields;
|
||||
|
||||
|
||||
// populate vars
|
||||
if( !empty($custom_fields) )
|
||||
{
|
||||
foreach( $custom_fields as $k => $v )
|
||||
{
|
||||
// value is always an array
|
||||
$v = $v[0];
|
||||
|
||||
|
||||
// bail early if $value is not is a field_key
|
||||
if( !acf_is_field_key($v) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// remove prefix '_' field from reference
|
||||
$field_name = substr($k, 1);
|
||||
|
||||
|
||||
// get field
|
||||
//$field = acf_get_field($v);
|
||||
|
||||
|
||||
// append to return
|
||||
$return[ $field_name ] = $field_name;
|
||||
|
||||
|
||||
// load value
|
||||
add_filter("_wp_post_revision_field_{$field_name}", array($this, 'wp_post_revision_field'), 10, 4);
|
||||
|
||||
|
||||
// WP 3.5: left vs right
|
||||
// Add a value of the revision ID (as there is no way to determine this within the '_wp_post_revision_field_' filter!)
|
||||
if( isset($_GET['action'], $_GET['left'], $_GET['right']) && $_GET['action'] == 'diff' )
|
||||
{
|
||||
global $left_revision, $right_revision;
|
||||
// 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];
|
||||
|
||||
|
||||
$left_revision->$field_name = 'revision_id=' . $_GET['left'];
|
||||
$right_revision->$field_name = 'revision_id=' . $_GET['right'];
|
||||
}
|
||||
// bail early if $key is a not a field_key
|
||||
if( !acf_is_field_key($key) ) continue;
|
||||
|
||||
|
||||
// get field
|
||||
$field = acf_get_field( $key );
|
||||
$field_title = $field['label'] . ' (' . $name . ')';
|
||||
$field_order = $field['menu_order'];
|
||||
$ancestors = acf_get_field_ancestors( $field );
|
||||
|
||||
|
||||
// ancestors
|
||||
if( !empty($ancestors) ) {
|
||||
|
||||
// vars
|
||||
$count = count($ancestors);
|
||||
$oldest = acf_get_field( $ancestors[$count-1] );
|
||||
|
||||
|
||||
// update vars
|
||||
$field_title = str_repeat('- ', $count) . $field_title;
|
||||
$field_order = $oldest['menu_order'] . '.1';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append
|
||||
$append[ $name ] = $field_title;
|
||||
$order[ $name ] = $field_order;
|
||||
|
||||
|
||||
// hook into specific revision field filter and return local value
|
||||
add_filter("_wp_post_revision_field_{$name}", array($this, 'wp_post_revision_field'), 10, 4);
|
||||
|
||||
}
|
||||
|
||||
|
||||
return $return;
|
||||
|
||||
// append
|
||||
if( !empty($append) ) {
|
||||
|
||||
// sort by name (orders sub field values correctly)
|
||||
array_multisort($order, $append);
|
||||
|
||||
|
||||
// append
|
||||
$fields = array_merge($fields, $append);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $fields;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -234,60 +301,48 @@ class acf_revisions {
|
|||
* @return $value (string)
|
||||
*/
|
||||
|
||||
function wp_post_revision_field( $value, $field_name, $post = null, $direction = false)
|
||||
{
|
||||
function wp_post_revision_field( $value, $field_name, $post = null, $direction = false) {
|
||||
|
||||
// bail ealry if is empty
|
||||
if( empty($value) ) return $value;
|
||||
|
||||
|
||||
// value has not yet been 'maybe_unserialize'
|
||||
$value = maybe_unserialize( $value );
|
||||
|
||||
|
||||
// vars
|
||||
$post_id = 0;
|
||||
|
||||
|
||||
// determine $post_id
|
||||
if( isset($post->ID) )
|
||||
{
|
||||
// WP 3.6
|
||||
$post_id = $post->ID;
|
||||
}
|
||||
elseif( isset($_GET['revision']) )
|
||||
{
|
||||
// WP 3.5
|
||||
$post_id = (int) $_GET['revision'];
|
||||
}
|
||||
elseif( strpos($value, 'revision_id=') !== false )
|
||||
{
|
||||
// WP 3.5 (left vs right)
|
||||
$post_id = (int) str_replace('revision_id=', '', $value);
|
||||
}
|
||||
$post_id = $post->ID;
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_maybe_get_field( $field_name, $post_id );
|
||||
|
||||
|
||||
// update value
|
||||
//$value = $field['value'];
|
||||
|
||||
|
||||
// default formatting
|
||||
if( is_array($value) ) {
|
||||
|
||||
$value = implode(', ', $value);
|
||||
|
||||
} elseif( is_object($value) ) {
|
||||
|
||||
$value = serialize($value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// format
|
||||
if( !empty($value) )
|
||||
{
|
||||
// image || file?
|
||||
if( $field['type'] == 'image' || $field['type'] == 'file' )
|
||||
{
|
||||
$url = wp_get_attachment_url($value);
|
||||
$value = $value . ' (' . $url . ')';
|
||||
}
|
||||
// image
|
||||
if( $field['type'] == 'image' || $field['type'] == 'file' ) {
|
||||
|
||||
$url = wp_get_attachment_url($value);
|
||||
$value = $value . ' (' . $url . ')';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -304,49 +359,23 @@ class acf_revisions {
|
|||
*/
|
||||
|
||||
function wp_restore_post_revision( $post_id, $revision_id ) {
|
||||
|
||||
// global
|
||||
global $wpdb;
|
||||
|
||||
// copy postmeta from revision to post (restore from revision)
|
||||
acf_copy_postmeta( $revision_id, $post_id );
|
||||
|
||||
|
||||
// get field objects
|
||||
$custom_fields = get_post_custom( $revision_id );
|
||||
// Make sure the latest revision is also updated to match the new $post data
|
||||
// get latest revision
|
||||
$revision = $this->get_post_latest_revision( $post_id );
|
||||
|
||||
|
||||
// populate vars
|
||||
if( !empty($custom_fields) )
|
||||
{
|
||||
foreach( $custom_fields as $k => $v )
|
||||
{
|
||||
// value is always an array
|
||||
$v = $v[0];
|
||||
|
||||
|
||||
// bail early if $value is not is a field_key
|
||||
if( !acf_is_field_key($v) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// remove prefix '_' field from reference
|
||||
$field_name = substr($k, 1);
|
||||
|
||||
|
||||
// bail early if value could not be found
|
||||
if( !isset($custom_fields[ $field_name ][0]) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
update_post_meta( $post_id, $field_name, $custom_fields[ $field_name ][0] );
|
||||
|
||||
|
||||
}
|
||||
// save
|
||||
if( $revision ) {
|
||||
|
||||
// copy postmeta from revision to latest revision (potentialy may be the same, but most likely are different)
|
||||
acf_copy_postmeta( $revision_id, $revision->ID );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ class acf_updates {
|
|||
|
||||
|
||||
// validate
|
||||
if( isset($args->slug) && $args->slug == $slug ) {
|
||||
if( isset($args->slug) && $args->slug === $slug && acf_is_plugin_active() ) {
|
||||
|
||||
// filter
|
||||
$result = apply_filters('acf/updates/plugin_details', $result, $action, $args);
|
||||
|
|
@ -89,7 +89,7 @@ class acf_updates {
|
|||
function modify_plugin_update( $transient ) {
|
||||
|
||||
// bail early if no response (dashboard showed an error)
|
||||
if( empty($transient->response) ) return $transient;
|
||||
if( !isset($transient->response) ) return $transient;
|
||||
|
||||
|
||||
// vars
|
||||
|
|
@ -97,16 +97,8 @@ class acf_updates {
|
|||
$show_updates = acf_get_setting('show_updates');
|
||||
|
||||
|
||||
// ensure is_plugin_active() exists (not on frontend)
|
||||
if( !function_exists('is_plugin_active') ) {
|
||||
|
||||
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// bail early if not a plugin (included in theme)
|
||||
if( !is_plugin_active($basename) ) $show_updates = false;
|
||||
if( !acf_is_plugin_active() ) $show_updates = false;
|
||||
|
||||
|
||||
// bail early if no show_updates
|
||||
|
|
@ -381,4 +373,38 @@ function acf_get_wporg_remote_plugin_info() {
|
|||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* acf_refresh_plugin_updates_transient
|
||||
*
|
||||
* This function will refresh teh WP transient containing plugin update data
|
||||
*
|
||||
* @type function
|
||||
* @date 11/08/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function acf_refresh_plugin_updates_transient() {
|
||||
|
||||
// vars
|
||||
$transient = get_site_transient('update_plugins');
|
||||
|
||||
|
||||
// bail early if no transient
|
||||
if( empty($transient) ) return;
|
||||
|
||||
|
||||
// update transient
|
||||
$transient = acf()->updates->modify_plugin_update( $transient );
|
||||
|
||||
|
||||
// update
|
||||
set_site_transient( 'update_plugins', $transient );
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -36,10 +36,11 @@ class acf_field_checkbox extends acf_field {
|
|||
$this->label = __("Checkbox",'acf');
|
||||
$this->category = 'choice';
|
||||
$this->defaults = array(
|
||||
'layout' => 'vertical',
|
||||
'choices' => array(),
|
||||
'default_value' => '',
|
||||
'toggle' => 0
|
||||
'layout' => 'vertical',
|
||||
'choices' => array(),
|
||||
'default_value' => '',
|
||||
'toggle' => 0,
|
||||
'return_format' => 'value'
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -246,6 +247,20 @@ class acf_field_checkbox extends acf_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(
|
||||
'value' => __('Value','acf'),
|
||||
'label' => __('Label','acf'),
|
||||
'array' => __('Both (Array)','acf')
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -266,13 +281,8 @@ class acf_field_checkbox extends acf_field {
|
|||
|
||||
function update_field( $field ) {
|
||||
|
||||
// decode choices (convert to array)
|
||||
$field['choices'] = acf_decode_choices($field['choices']);
|
||||
$field['default_value'] = acf_decode_choices($field['default_value'], true);
|
||||
return acf_get_field_type('select')->update_field( $field );
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -294,25 +304,7 @@ class acf_field_checkbox extends acf_field {
|
|||
|
||||
function update_value( $value, $post_id, $field ) {
|
||||
|
||||
// validate
|
||||
if( empty($value) ) {
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// array
|
||||
if( is_array($value) ) {
|
||||
|
||||
// save value as strings, so we can clearly search for them in SQL LIKE statements
|
||||
$value = array_map('strval', $value);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
return acf_get_field_type('select')->update_value( $value, $post_id, $field );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -331,12 +323,30 @@ class acf_field_checkbox extends acf_field {
|
|||
|
||||
function translate_field( $field ) {
|
||||
|
||||
// translate
|
||||
$field['choices'] = acf_translate( $field['choices'] );
|
||||
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
|
||||
return $field;
|
||||
return acf_get_field_type('select')->format_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -155,8 +155,10 @@ class acf_field_color_picker extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_color_picker();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_color_picker() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -233,6 +233,41 @@ class acf_field_date_picker extends acf_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 ealry if no $value
|
||||
if( !$value ) return $value;
|
||||
|
||||
|
||||
// date field is currently saved as Ymd (not Y-m-d). Convert it
|
||||
if( strlen($value) == 8 ) {
|
||||
|
||||
$value = substr($value, 0, 4) . '-' . substr($value, 4, 2) . '-' . substr($value, 6, 2);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* format_value()
|
||||
*
|
||||
|
|
@ -255,10 +290,44 @@ class acf_field_date_picker extends acf_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 ealry if no $value
|
||||
if( !$value ) return $value;
|
||||
|
||||
|
||||
// remove '-'
|
||||
$value = str_replace('-', '', $value);
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_date_picker();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_date_picker() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ class acf_field_date_and_time_picker extends acf_field {
|
|||
'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'),
|
||||
|
|
@ -96,63 +97,6 @@ class acf_field_date_and_time_picker extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* _split_date_time
|
||||
*
|
||||
* This function will split a format string into seperate date and time
|
||||
*
|
||||
* @type function
|
||||
* @date 26/05/2016
|
||||
* @since 5.3.8
|
||||
*
|
||||
* @param $format (string)
|
||||
* @return $formats (array)
|
||||
*/
|
||||
|
||||
function _split_date_time( $date_time = '' ) {
|
||||
|
||||
// vars
|
||||
$time = array( 'a', 'A', 'h', 'g', 'H', 'G', 'i', 's' );
|
||||
$chars = str_split($date_time);
|
||||
$index = false;
|
||||
|
||||
|
||||
// default
|
||||
$data = array(
|
||||
'date' => $date_time,
|
||||
'time' => ''
|
||||
);
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $chars as $i => $c ) {
|
||||
|
||||
// i is set, break loop
|
||||
if( in_array($c, $time) ) {
|
||||
|
||||
$index = $i;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// if index found
|
||||
if( $index !== false ) {
|
||||
|
||||
$data['date'] = trim(substr($date_time, 0, $i));
|
||||
$data['time'] = trim(substr($date_time, $i));
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* render_field()
|
||||
*
|
||||
|
|
@ -179,7 +123,7 @@ class acf_field_date_and_time_picker extends acf_field {
|
|||
|
||||
// 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 = $this->_split_date_time($field['display_format']);
|
||||
$formats = acf_split_date_time($field['display_format']);
|
||||
|
||||
|
||||
// vars
|
||||
|
|
@ -303,8 +247,10 @@ class acf_field_date_and_time_picker extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_date_and_time_picker();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_date_and_time_picker() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -62,7 +62,9 @@ class acf_field_email extends acf_field {
|
|||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$o = array( 'type', 'id', 'class', 'name', 'value', 'placeholder' );
|
||||
$s = array( 'readonly', 'disabled' );
|
||||
$e = '';
|
||||
|
||||
|
||||
|
|
@ -84,8 +86,7 @@ class acf_field_email extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// populate atts
|
||||
$atts = array();
|
||||
// append atts
|
||||
foreach( $o as $k ) {
|
||||
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
|
|
@ -93,6 +94,14 @@ class acf_field_email extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// append special atts
|
||||
foreach( $s as $k ) {
|
||||
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// render
|
||||
$e .= '<div class="acf-input-wrap">';
|
||||
$e .= '<input ' . acf_esc_attr( $atts ) . ' />';
|
||||
|
|
@ -158,8 +167,10 @@ class acf_field_email extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_email();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_email() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -417,8 +417,10 @@ class acf_field_file extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_file();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_file() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ class acf_field_google_map extends acf_field {
|
|||
|
||||
|
||||
// value
|
||||
$field['value'] = acf_parse_args($field['value'], array(
|
||||
$field['value'] = wp_parse_args($field['value'], array(
|
||||
'address' => '',
|
||||
'lat' => '',
|
||||
'lng' => ''
|
||||
|
|
@ -292,11 +292,17 @@ class acf_field_google_map extends acf_field {
|
|||
|
||||
function input_admin_footer() {
|
||||
|
||||
// bail ealry if no qneueu
|
||||
if( !acf_get_setting('enqueue_google_maps') ) return;
|
||||
|
||||
|
||||
// vars
|
||||
$api = array(
|
||||
'libraries' => 'places',
|
||||
'key' => acf_get_setting('google_api_key'),
|
||||
'client' => acf_get_setting('google_api_client')
|
||||
'key' => acf_get_setting('google_api_key'),
|
||||
'client' => acf_get_setting('google_api_client'),
|
||||
'libraries' => 'places',
|
||||
'ver' => 3,
|
||||
'callback' => ''
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -309,17 +315,23 @@ class acf_field_google_map extends acf_field {
|
|||
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">
|
||||
acf.fields.google_map.api = <?php echo json_encode($api); ?>;
|
||||
acf.fields.google_map.url = '<?php echo $url; ?>';
|
||||
</script>
|
||||
<?php
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_google_map();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_google_map() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -482,8 +482,10 @@ class acf_field_image extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_image();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_image() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class acf_field_message extends acf_field {
|
|||
$this->label = __("Message",'acf');
|
||||
$this->category = 'layout';
|
||||
$this->defaults = array(
|
||||
'value' => false, // prevents acf_render_fields() from attempting to load value
|
||||
'value' => false, // prevents ACF from attempting to load value
|
||||
'message' => '',
|
||||
'esc_html' => 0,
|
||||
'new_lines' => 'wpautop',
|
||||
|
|
@ -150,6 +150,33 @@ class acf_field_message extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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 ) {
|
||||
|
||||
// remove name
|
||||
$field['name'] = '';
|
||||
$field['required'] = 0;
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* translate_field
|
||||
*
|
||||
|
|
@ -176,8 +203,10 @@ class acf_field_message extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_message();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_message() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -41,9 +41,7 @@ class acf_field_number extends acf_field {
|
|||
'step' => '',
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
'readonly' => 0,
|
||||
'disabled' => 0,
|
||||
'append' => ''
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -67,7 +65,9 @@ class acf_field_number extends acf_field {
|
|||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$o = array( 'type', 'id', 'class', 'min', 'max', 'step', 'name', 'value', 'placeholder' );
|
||||
$s = array( 'readonly', 'disabled' );
|
||||
$e = '';
|
||||
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ class acf_field_number extends acf_field {
|
|||
|
||||
|
||||
// prepend
|
||||
if( $field['prepend'] !== "" ) {
|
||||
if( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$e .= '<div class="acf-input-prepend">' . $field['prepend'] . '</div>';
|
||||
|
|
@ -89,7 +89,7 @@ class acf_field_number extends acf_field {
|
|||
|
||||
|
||||
// append
|
||||
if( $field['append'] !== "" ) {
|
||||
if( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$e .= '<div class="acf-input-append">' . $field['append'] . '</div>';
|
||||
|
|
@ -97,8 +97,7 @@ class acf_field_number extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// populate atts
|
||||
$atts = array();
|
||||
// append atts
|
||||
foreach( $o as $k ) {
|
||||
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
|
|
@ -106,14 +105,10 @@ class acf_field_number extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// special atts
|
||||
foreach( array( 'readonly', 'disabled' ) as $k ) {
|
||||
// append special atts
|
||||
foreach( $s as $k ) {
|
||||
|
||||
if( $field[ $k ] ) {
|
||||
|
||||
$atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -317,8 +312,10 @@ class acf_field_number extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_number();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_number() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -320,8 +320,10 @@ class acf_field_oembed extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_oembed();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_oembed() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -36,10 +36,11 @@ class acf_field_page_link extends acf_field {
|
|||
$this->label = __("Page Link",'acf');
|
||||
$this->category = 'relational';
|
||||
$this->defaults = array(
|
||||
'post_type' => array(),
|
||||
'taxonomy' => array(),
|
||||
'allow_null' => 0,
|
||||
'multiple' => 0,
|
||||
'post_type' => array(),
|
||||
'taxonomy' => array(),
|
||||
'allow_null' => 0,
|
||||
'multiple' => 0,
|
||||
'allow_archives' => 1
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -55,33 +56,38 @@ class acf_field_page_link extends acf_field {
|
|||
|
||||
|
||||
/*
|
||||
* get_choices
|
||||
* ajax_query
|
||||
*
|
||||
* This function will return an array of data formatted for use in a select2 AJAX response
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 15/10/2014
|
||||
* @since 5.0.9
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $options (array)
|
||||
* @return (array)
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function get_choices( $options = array() ) {
|
||||
function ajax_query() {
|
||||
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) die();
|
||||
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
$options = acf_parse_args($_POST, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'lang' => false,
|
||||
'field_key' => '',
|
||||
'paged' => 1
|
||||
));
|
||||
|
||||
|
||||
// vars
|
||||
$r = array();
|
||||
$results = array();
|
||||
$args = array();
|
||||
$s = false;
|
||||
$is_search = false;
|
||||
|
||||
|
||||
// paged
|
||||
|
|
@ -89,10 +95,23 @@ class acf_field_page_link extends acf_field {
|
|||
$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 ) return false;
|
||||
if( !$field ) die();
|
||||
|
||||
|
||||
// update $args
|
||||
|
|
@ -129,14 +148,6 @@ class acf_field_page_link extends acf_field {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// search
|
||||
if( $options['s'] ) {
|
||||
|
||||
$args['s'] = $options['s'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// filters
|
||||
$args = apply_filters('acf/fields/page_link/query', $args, $field, $options['post_id']);
|
||||
|
|
@ -144,12 +155,8 @@ class acf_field_page_link extends acf_field {
|
|||
$args = apply_filters('acf/fields/page_link/query/key=' . $field['key'], $args, $field, $options['post_id'] );
|
||||
|
||||
|
||||
// is search
|
||||
$is_search = !empty( $args['s'] );
|
||||
|
||||
|
||||
// add archives to $r
|
||||
if( $args['paged'] == 1 ) {
|
||||
// add archives to $results
|
||||
if( $field['allow_archives'] && $args['paged'] == 1 ) {
|
||||
|
||||
$archives = array();
|
||||
$archives[] = array(
|
||||
|
|
@ -159,60 +166,47 @@ class acf_field_page_link extends acf_field {
|
|||
|
||||
foreach( $args['post_type'] as $post_type ) {
|
||||
|
||||
// vars
|
||||
$archive_link = get_post_type_archive_link( $post_type );
|
||||
|
||||
if( $archive_link ) {
|
||||
|
||||
$archives[] = array(
|
||||
'id' => $archive_link,
|
||||
'text' => $archive_link
|
||||
);
|
||||
|
||||
}
|
||||
// bail ealry if no link
|
||||
if( !$archive_link ) continue;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// search
|
||||
if( $is_search ) {
|
||||
|
||||
foreach( array_keys($archives) as $i ) {
|
||||
|
||||
if( strpos( $archives[$i]['text'], $args['s'] ) === false ) {
|
||||
|
||||
unset($archives[$i]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
// bail early if no search match
|
||||
if( $is_search && stripos($archive_link, $s) === false ) continue;
|
||||
|
||||
$archives = array_values($archives);
|
||||
|
||||
}
|
||||
|
||||
|
||||
if( !empty($archives) ) {
|
||||
|
||||
$r[] = array(
|
||||
'text' => __('Archives', 'acf'),
|
||||
'children' => $archives
|
||||
// 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 );
|
||||
$titles = array();
|
||||
|
||||
|
||||
// data
|
||||
|
|
@ -222,16 +216,16 @@ class acf_field_page_link extends acf_field {
|
|||
);
|
||||
|
||||
|
||||
// convert post objects to post titles
|
||||
foreach( array_keys($posts) as $post_id ) {
|
||||
|
||||
// override data
|
||||
$posts[ $post_id ] = $this->get_post_title( $posts[ $post_id ], $field, $options['post_id'] );
|
||||
$posts[ $post_id ] = $this->get_post_title( $posts[ $post_id ], $field, $options['post_id'], $is_search );
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// order by search
|
||||
if( $is_search ) {
|
||||
// order posts by search
|
||||
if( $is_search && empty($args['orderby']) ) {
|
||||
|
||||
$posts = acf_order_by_search( $posts, $args['s'] );
|
||||
|
||||
|
|
@ -241,66 +235,65 @@ class acf_field_page_link extends acf_field {
|
|||
// append to $data
|
||||
foreach( array_keys($posts) as $post_id ) {
|
||||
|
||||
$data['children'][] = array(
|
||||
'id' => $post_id,
|
||||
'text' => $posts[ $post_id ]
|
||||
);
|
||||
$data['children'][] = $this->get_post_result( $post_id, $posts[ $post_id ]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $r
|
||||
$r[] = $data;
|
||||
// append to $results
|
||||
$results[] = $data;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// return
|
||||
return $r;
|
||||
|
||||
acf_send_ajax_results(array(
|
||||
'results' => $results,
|
||||
'limit' => $args['posts_per_page']
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ajax_query
|
||||
* get_post_result
|
||||
*
|
||||
* description
|
||||
* This function will return an array containing id, text and maybe description data
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
* @date 7/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
* @param $id (mixed)
|
||||
* @param $text (string)
|
||||
* @return (array)
|
||||
*/
|
||||
|
||||
function ajax_query() {
|
||||
function get_post_result( $id, $text ) {
|
||||
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) {
|
||||
// vars
|
||||
$result = array(
|
||||
'id' => $id,
|
||||
'text' => $text
|
||||
);
|
||||
|
||||
die();
|
||||
|
||||
// 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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// get choices
|
||||
$choices = $this->get_choices( $_POST );
|
||||
|
||||
|
||||
// validate
|
||||
if( !$choices ) {
|
||||
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return JSON
|
||||
echo json_encode( $choices );
|
||||
die();
|
||||
// return
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -338,6 +331,7 @@ class acf_field_page_link extends acf_field {
|
|||
|
||||
// return
|
||||
return $title;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -543,6 +537,20 @@ class acf_field_page_link extends acf_field {
|
|||
));
|
||||
|
||||
|
||||
// allow_archives
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Allow Archives URLs','acf'),
|
||||
'instructions' => '',
|
||||
'type' => 'radio',
|
||||
'name' => 'allow_archives',
|
||||
'choices' => array(
|
||||
1 => __("Yes",'acf'),
|
||||
0 => __("No",'acf'),
|
||||
),
|
||||
'layout' => 'horizontal',
|
||||
));
|
||||
|
||||
|
||||
// multiple
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Select multiple values?','acf'),
|
||||
|
|
@ -690,8 +698,10 @@ class acf_field_page_link extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_page_link();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_page_link() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -63,12 +63,14 @@ class acf_field_password extends acf_field {
|
|||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$o = array( 'type', 'id', 'class', 'name', 'value', 'placeholder' );
|
||||
$s = array( 'readonly', 'disabled' );
|
||||
$e = '';
|
||||
|
||||
|
||||
// prepend
|
||||
if( $field['prepend'] !== "" ) {
|
||||
if( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$e .= '<div class="acf-input-prepend">' . $field['prepend'] . '</div>';
|
||||
|
|
@ -77,7 +79,7 @@ class acf_field_password extends acf_field {
|
|||
|
||||
|
||||
// append
|
||||
if( $field['append'] !== "" ) {
|
||||
if( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$e .= '<div class="acf-input-append">' . $field['append'] . '</div>';
|
||||
|
|
@ -85,8 +87,7 @@ class acf_field_password extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// populate atts
|
||||
$atts = array();
|
||||
// append atts
|
||||
foreach( $o as $k ) {
|
||||
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
|
|
@ -94,14 +95,10 @@ class acf_field_password extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// special atts
|
||||
foreach( array( 'readonly', 'disabled' ) as $k ) {
|
||||
// append special atts
|
||||
foreach( $s as $k ) {
|
||||
|
||||
if( $field[ $k ] ) {
|
||||
|
||||
$atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -161,8 +158,10 @@ class acf_field_password extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_password();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_password() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -56,173 +56,6 @@ class acf_field_post_object extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_choices
|
||||
*
|
||||
* 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_choices( $options = array() ) {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
'paged' => 1
|
||||
));
|
||||
|
||||
|
||||
// vars
|
||||
$r = array();
|
||||
$args = array();
|
||||
|
||||
|
||||
// paged
|
||||
$args['posts_per_page'] = 20;
|
||||
$args['paged'] = $options['paged'];
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $options['field_key'] );
|
||||
|
||||
|
||||
// bail early if no field
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// 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,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// search
|
||||
if( $options['s'] ) {
|
||||
|
||||
$args['s'] = $options['s'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// filters
|
||||
$args = apply_filters('acf/fields/post_object/query', $args, $field, $options['post_id']);
|
||||
$args = apply_filters('acf/fields/post_object/query/name=' . $field['name'], $args, $field, $options['post_id'] );
|
||||
$args = apply_filters('acf/fields/post_object/query/key=' . $field['key'], $args, $field, $options['post_id'] );
|
||||
|
||||
|
||||
// is search
|
||||
$is_search = !empty( $args['s'] );
|
||||
|
||||
|
||||
// get posts grouped by post type
|
||||
$groups = acf_get_grouped_posts( $args );
|
||||
|
||||
|
||||
// bail early if no posts
|
||||
if( empty($groups) ) return false;
|
||||
|
||||
|
||||
// loop
|
||||
foreach( array_keys($groups) as $group_title ) {
|
||||
|
||||
// vars
|
||||
$posts = acf_extract_var( $groups, $group_title );
|
||||
$titles = array();
|
||||
|
||||
|
||||
// data
|
||||
$data = array(
|
||||
'text' => $group_title,
|
||||
'children' => array()
|
||||
);
|
||||
|
||||
|
||||
foreach( array_keys($posts) as $post_id ) {
|
||||
|
||||
// override data
|
||||
$posts[ $post_id ] = $this->get_post_title( $posts[ $post_id ], $field, $options['post_id'] );
|
||||
|
||||
};
|
||||
|
||||
|
||||
// order by search
|
||||
if( $is_search ) {
|
||||
|
||||
$posts = acf_order_by_search( $posts, $args['s'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $data
|
||||
foreach( array_keys($posts) as $post_id ) {
|
||||
|
||||
$data['children'][] = array(
|
||||
'id' => $post_id,
|
||||
'text' => $posts[ $post_id ]
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $r
|
||||
$r[] = $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// optgroup or single
|
||||
if( count($args['post_type']) == 1 ) {
|
||||
|
||||
$r = $r[0]['children'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $r;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ajax_query
|
||||
*
|
||||
|
|
@ -239,28 +72,227 @@ class acf_field_post_object extends acf_field {
|
|||
function ajax_query() {
|
||||
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) {
|
||||
|
||||
die();
|
||||
|
||||
}
|
||||
if( !acf_verify_ajax() ) die();
|
||||
|
||||
|
||||
// get choices
|
||||
$choices = $this->get_choices( $_POST );
|
||||
$response = $this->get_ajax_query( $_POST );
|
||||
|
||||
|
||||
// validate
|
||||
if( !$choices ) {
|
||||
// return
|
||||
acf_send_ajax_results($response);
|
||||
|
||||
die();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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( $options = array() ) {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
'paged' => 1
|
||||
));
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $options['field_key'] );
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// 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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// post_type
|
||||
if( !empty($field['post_type']) ) {
|
||||
|
||||
$args['post_type'] = acf_get_array( $field['post_type'] );
|
||||
|
||||
} else {
|
||||
|
||||
$args['post_type'] = acf_get_post_types();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return JSON
|
||||
echo json_encode( $choices );
|
||||
die();
|
||||
// taxonomy
|
||||
if( !empty($field['taxonomy']) ) {
|
||||
|
||||
// vars
|
||||
$terms = acf_decode_taxonomy_terms( $field['taxonomy'] );
|
||||
|
||||
|
||||
// append to $args
|
||||
$args['tax_query'] = array();
|
||||
|
||||
|
||||
// now create the tax queries
|
||||
foreach( $terms as $k => $v ) {
|
||||
|
||||
$args['tax_query'][] = array(
|
||||
'taxonomy' => $k,
|
||||
'field' => 'slug',
|
||||
'terms' => $v,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// filters
|
||||
$args = apply_filters('acf/fields/post_object/query', $args, $field, $options['post_id']);
|
||||
$args = apply_filters('acf/fields/post_object/query/name=' . $field['name'], $args, $field, $options['post_id'] );
|
||||
$args = apply_filters('acf/fields/post_object/query/key=' . $field['key'], $args, $field, $options['post_id'] );
|
||||
|
||||
|
||||
// get posts grouped by post type
|
||||
$groups = acf_get_grouped_posts( $args );
|
||||
|
||||
|
||||
// bail early if no posts
|
||||
if( empty($groups) ) return false;
|
||||
|
||||
|
||||
// loop
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// optgroup or single
|
||||
if( count($args['post_type']) == 1 ) {
|
||||
|
||||
$results = $results[0]['children'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'results' => $results,
|
||||
'limit' => $args['posts_per_page']
|
||||
);
|
||||
|
||||
|
||||
// return
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -322,29 +354,19 @@ class acf_field_post_object extends acf_field {
|
|||
$field['choices'] = array();
|
||||
|
||||
|
||||
// populate choices if value exists
|
||||
if( !empty($field['value']) ) {
|
||||
|
||||
// get posts
|
||||
$posts = acf_get_posts(array(
|
||||
'post__in' => $field['value'],
|
||||
'post_type' => $field['post_type']
|
||||
));
|
||||
|
||||
|
||||
// set choices
|
||||
if( !empty($posts) ) {
|
||||
// load posts
|
||||
$posts = $this->get_posts( $field['value'], $field );
|
||||
|
||||
if( $posts ) {
|
||||
|
||||
foreach( array_keys($posts) as $i ) {
|
||||
|
||||
// vars
|
||||
$post = acf_extract_var( $posts, $i );
|
||||
|
||||
|
||||
// append to choices
|
||||
$field['choices'][ $post->ID ] = $this->get_post_title( $post, $field );
|
||||
|
||||
}
|
||||
foreach( array_keys($posts) as $i ) {
|
||||
|
||||
// vars
|
||||
$post = acf_extract_var( $posts, $i );
|
||||
|
||||
|
||||
// append to choices
|
||||
$field['choices'][ $post->ID ] = $this->get_post_title( $post, $field );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -353,6 +375,7 @@ class acf_field_post_object extends acf_field {
|
|||
|
||||
// render
|
||||
acf_render_field( $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -461,15 +484,12 @@ class acf_field_post_object extends acf_field {
|
|||
function load_value( $value, $post_id, $field ) {
|
||||
|
||||
// ACF4 null
|
||||
if( $value === 'null' ) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
if( $value === 'null' ) return false;
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -491,38 +511,26 @@ class acf_field_post_object extends acf_field {
|
|||
|
||||
function format_value( $value, $post_id, $field ) {
|
||||
|
||||
// numeric
|
||||
$value = acf_get_numeric($value);
|
||||
|
||||
|
||||
// bail early if no value
|
||||
if( empty($value) ) {
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// force value to array
|
||||
$value = acf_get_array( $value );
|
||||
|
||||
|
||||
// convert values to int
|
||||
$value = array_map('intval', $value);
|
||||
if( empty($value) ) return false;
|
||||
|
||||
|
||||
// load posts if needed
|
||||
if( $field['return_format'] == 'object' ) {
|
||||
|
||||
// get posts
|
||||
$value = acf_get_posts(array(
|
||||
'post__in' => $value,
|
||||
'post_type' => $field['post_type']
|
||||
));
|
||||
|
||||
$value = $this->get_posts( $value, $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// convert back from array if neccessary
|
||||
if( !$field['multiple'] ) {
|
||||
if( !$field['multiple'] && acf_is_array($value) ) {
|
||||
|
||||
$value = array_shift($value);
|
||||
$value = current($value);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -591,10 +599,48 @@ class acf_field_post_object extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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 ) {
|
||||
|
||||
// numeric
|
||||
$value = acf_get_numeric($value);
|
||||
|
||||
|
||||
// bail early if no value
|
||||
if( empty($value) ) return false;
|
||||
|
||||
|
||||
// get posts
|
||||
$posts = acf_get_posts(array(
|
||||
'post__in' => $value,
|
||||
'post_type' => $field['post_type']
|
||||
));
|
||||
|
||||
|
||||
// return
|
||||
return $posts;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_post_object();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_post_object() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@ class acf_field_radio extends acf_field {
|
|||
'default_value' => '',
|
||||
'other_choice' => 0,
|
||||
'save_other_choice' => 0,
|
||||
'allow_null' => 0
|
||||
'allow_null' => 0,
|
||||
'return_format' => 'value'
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -301,6 +302,20 @@ class acf_field_radio extends acf_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(
|
||||
'value' => __('Value','acf'),
|
||||
'label' => __('Label','acf'),
|
||||
'array' => __('Both (Array)','acf')
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -433,19 +448,39 @@ class acf_field_radio extends acf_field {
|
|||
|
||||
function translate_field( $field ) {
|
||||
|
||||
// translate
|
||||
$field['choices'] = acf_translate( $field['choices'] );
|
||||
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
|
||||
return $field;
|
||||
return acf_get_field_type('select')->format_value( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_radio();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_radio() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -63,195 +63,6 @@ class acf_field_relationship extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_choices
|
||||
*
|
||||
* 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_choices( $options = array() ) {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'post_type' => '',
|
||||
'taxonomy' => '',
|
||||
'lang' => false,
|
||||
'field_key' => '',
|
||||
'paged' => 1
|
||||
));
|
||||
|
||||
|
||||
// vars
|
||||
$r = array();
|
||||
$args = array();
|
||||
|
||||
|
||||
// paged
|
||||
$args['posts_per_page'] = 20;
|
||||
$args['paged'] = $options['paged'];
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $options['field_key'] );
|
||||
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// update $args
|
||||
if( !empty($options['post_type']) ) {
|
||||
|
||||
$args['post_type'] = acf_get_array( $options['post_type'] );
|
||||
|
||||
} elseif( !empty($field['post_type']) ) {
|
||||
|
||||
$args['post_type'] = acf_get_array( $field['post_type'] );
|
||||
|
||||
} else {
|
||||
|
||||
$args['post_type'] = acf_get_post_types();
|
||||
}
|
||||
|
||||
|
||||
// update taxonomy
|
||||
$taxonomies = array();
|
||||
|
||||
if( !empty($options['taxonomy']) ) {
|
||||
|
||||
$term = acf_decode_taxonomy_term($options['taxonomy']);
|
||||
|
||||
// append to $args
|
||||
$args['tax_query'] = array(
|
||||
|
||||
array(
|
||||
'taxonomy' => $term['taxonomy'],
|
||||
'field' => 'slug',
|
||||
'terms' => $term['term'],
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
|
||||
} elseif( !empty($field['taxonomy']) ) {
|
||||
|
||||
$taxonomies = acf_decode_taxonomy_terms( $field['taxonomy'] );
|
||||
|
||||
// append to $args
|
||||
$args['tax_query'] = array();
|
||||
|
||||
|
||||
// now create the tax queries
|
||||
foreach( $taxonomies as $taxonomy => $terms ) {
|
||||
|
||||
$args['tax_query'][] = array(
|
||||
'taxonomy' => $taxonomy,
|
||||
'field' => 'slug',
|
||||
'terms' => $terms,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// search
|
||||
if( $options['s'] ) {
|
||||
|
||||
$args['s'] = $options['s'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// filters
|
||||
$args = apply_filters('acf/fields/relationship/query', $args, $field, $options['post_id']);
|
||||
$args = apply_filters('acf/fields/relationship/query/name=' . $field['name'], $args, $field, $options['post_id'] );
|
||||
$args = apply_filters('acf/fields/relationship/query/key=' . $field['key'], $args, $field, $options['post_id'] );
|
||||
|
||||
|
||||
// is search
|
||||
$is_search = !empty( $args['s'] );
|
||||
|
||||
|
||||
// get posts grouped by post type
|
||||
$groups = acf_get_grouped_posts( $args );
|
||||
|
||||
|
||||
// bail early if no posts
|
||||
if( empty($groups) ) return false;
|
||||
|
||||
|
||||
// loop
|
||||
foreach( array_keys($groups) as $group_title ) {
|
||||
|
||||
// vars
|
||||
$posts = acf_extract_var( $groups, $group_title );
|
||||
$titles = array();
|
||||
|
||||
|
||||
// data
|
||||
$data = array(
|
||||
'text' => $group_title,
|
||||
'children' => array()
|
||||
);
|
||||
|
||||
|
||||
foreach( array_keys($posts) as $post_id ) {
|
||||
|
||||
// override data
|
||||
$posts[ $post_id ] = $this->get_post_title( $posts[ $post_id ], $field, $options['post_id'] );
|
||||
|
||||
};
|
||||
|
||||
|
||||
// order by search
|
||||
if( $is_search ) {
|
||||
|
||||
$posts = acf_order_by_search( $posts, $args['s'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $data
|
||||
foreach( array_keys($posts) as $post_id ) {
|
||||
|
||||
$data['children'][] = array(
|
||||
'id' => $post_id,
|
||||
'text' => $posts[ $post_id ]
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $r
|
||||
$r[] = $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// add as optgroup or results
|
||||
if( count($args['post_type']) == 1 ) {
|
||||
|
||||
$r = $r[0]['children'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// return
|
||||
return $r;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ajax_query
|
||||
*
|
||||
|
|
@ -268,28 +79,239 @@ class acf_field_relationship extends acf_field {
|
|||
function ajax_query() {
|
||||
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) {
|
||||
if( !acf_verify_ajax() ) die();
|
||||
|
||||
die();
|
||||
|
||||
// get choices
|
||||
$response = $this->get_ajax_query( $_POST );
|
||||
|
||||
|
||||
// return
|
||||
acf_send_ajax_results($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( $options = array() ) {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
'paged' => 1,
|
||||
'post_type' => '',
|
||||
'taxonomy' => ''
|
||||
));
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $options['field_key'] );
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// 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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// get posts
|
||||
$posts = $this->get_choices( $_POST );
|
||||
|
||||
|
||||
// validate
|
||||
if( !$posts ) {
|
||||
// post_type
|
||||
if( !empty($options['post_type']) ) {
|
||||
|
||||
die();
|
||||
$args['post_type'] = acf_get_array( $options['post_type'] );
|
||||
|
||||
} elseif( !empty($field['post_type']) ) {
|
||||
|
||||
$args['post_type'] = acf_get_array( $field['post_type'] );
|
||||
|
||||
} else {
|
||||
|
||||
$args['post_type'] = acf_get_post_types();
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return JSON
|
||||
echo json_encode( $posts );
|
||||
die();
|
||||
// taxonomy
|
||||
if( !empty($options['taxonomy']) ) {
|
||||
|
||||
// vars
|
||||
$term = acf_decode_taxonomy_term($options['taxonomy']);
|
||||
|
||||
|
||||
// tax query
|
||||
$args['tax_query'] = array();
|
||||
|
||||
|
||||
// append
|
||||
$args['tax_query'][] = array(
|
||||
'taxonomy' => $term['taxonomy'],
|
||||
'field' => 'slug',
|
||||
'terms' => $term['term'],
|
||||
);
|
||||
|
||||
|
||||
} elseif( !empty($field['taxonomy']) ) {
|
||||
|
||||
// vars
|
||||
$terms = acf_decode_taxonomy_terms( $field['taxonomy'] );
|
||||
|
||||
|
||||
// append to $args
|
||||
$args['tax_query'] = array();
|
||||
|
||||
|
||||
// now create the tax queries
|
||||
foreach( $terms as $k => $v ) {
|
||||
|
||||
$args['tax_query'][] = array(
|
||||
'taxonomy' => $k,
|
||||
'field' => 'slug',
|
||||
'terms' => $v,
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// filters
|
||||
$args = apply_filters('acf/fields/relationship/query', $args, $field, $options['post_id']);
|
||||
$args = apply_filters('acf/fields/relationship/query/name=' . $field['name'], $args, $field, $options['post_id'] );
|
||||
$args = apply_filters('acf/fields/relationship/query/key=' . $field['key'], $args, $field, $options['post_id'] );
|
||||
|
||||
|
||||
// get posts grouped by post type
|
||||
$groups = acf_get_grouped_posts( $args );
|
||||
|
||||
|
||||
// bail early if no posts
|
||||
if( empty($groups) ) return false;
|
||||
|
||||
|
||||
// loop
|
||||
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'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// add as optgroup or results
|
||||
if( count($args['post_type']) == 1 ) {
|
||||
|
||||
$results = $results[0]['children'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'results' => $results,
|
||||
'limit' => $args['posts_per_page']
|
||||
);
|
||||
|
||||
|
||||
// return
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
);
|
||||
|
||||
|
||||
// return
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -917,8 +939,10 @@ class acf_field_relationship extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_relationship();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_relationship() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class acf_field_select extends acf_field {
|
|||
|
||||
// vars
|
||||
$this->name = 'select';
|
||||
$this->label = __("Select",'acf');
|
||||
$this->label = _x('Select', 'noun', 'acf');
|
||||
$this->category = 'choice';
|
||||
$this->defaults = array(
|
||||
'multiple' => 0,
|
||||
|
|
@ -43,8 +43,7 @@ class acf_field_select extends acf_field {
|
|||
'ui' => 0,
|
||||
'ajax' => 0,
|
||||
'placeholder' => '',
|
||||
'disabled' => 0,
|
||||
'readonly' => 0,
|
||||
'return_format' => 'value'
|
||||
);
|
||||
$this->l10n = array(
|
||||
'matches_1' => _x('One result is available, press enter to select it.', 'Select2 JS matches_1', 'acf'),
|
||||
|
|
@ -113,7 +112,7 @@ class acf_field_select extends acf_field {
|
|||
|
||||
|
||||
/*
|
||||
* query_posts
|
||||
* ajax_query
|
||||
*
|
||||
* description
|
||||
*
|
||||
|
|
@ -121,76 +120,106 @@ class acf_field_select extends acf_field {
|
|||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function ajax_query() {
|
||||
|
||||
// options
|
||||
$options = acf_parse_args( $_POST, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
'nonce' => '',
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) die();
|
||||
|
||||
|
||||
// get choices
|
||||
$response = $this->get_ajax_query( $_POST );
|
||||
|
||||
|
||||
// return
|
||||
acf_send_ajax_results($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( $options = array() ) {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
'paged' => 1
|
||||
));
|
||||
|
||||
|
||||
// load field
|
||||
$field = acf_get_field( $options['field_key'] );
|
||||
if( !$field ) return false;
|
||||
|
||||
if( !$field ) {
|
||||
|
||||
die();
|
||||
// vars
|
||||
$results = array();
|
||||
$s = false;
|
||||
$is_search = false;
|
||||
|
||||
|
||||
// search
|
||||
if( $options['s'] !== '' ) {
|
||||
|
||||
// strip slashes (search may be integer)
|
||||
$s = wp_unslash( strval($options['s']) );
|
||||
|
||||
|
||||
// update vars
|
||||
$is_search = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// bail ealry if no choices
|
||||
if( empty($field['choices']) ) return false;
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $field['choices'] as $k => $v ) {
|
||||
|
||||
// ensure $v is a string
|
||||
$v = strval( $v );
|
||||
|
||||
|
||||
// if searching, but doesn't exist
|
||||
if( $is_search && stripos($v, $s) === false ) continue;
|
||||
|
||||
|
||||
// append
|
||||
$results[] = array(
|
||||
'id' => $k,
|
||||
'text' => $v
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// vars
|
||||
$r = array();
|
||||
$s = false;
|
||||
$response = array(
|
||||
'results' => $results
|
||||
);
|
||||
|
||||
|
||||
// search
|
||||
if( $options['s'] !== '' ) {
|
||||
|
||||
// search may be integer
|
||||
$s = strval($options['s']);
|
||||
|
||||
|
||||
// strip slashes
|
||||
$s = wp_unslash($s);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// loop through choices
|
||||
if( !empty($field['choices']) ) {
|
||||
|
||||
foreach( $field['choices'] as $k => $v ) {
|
||||
|
||||
// if searching, but doesn't exist
|
||||
if( $s !== false && stripos($v, $s) === false ) {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append
|
||||
$r[] = array(
|
||||
'id' => $k,
|
||||
'text' => strval( $v )
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return JSON
|
||||
echo json_encode( $r );
|
||||
die();
|
||||
// return
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -217,7 +246,7 @@ class acf_field_select extends acf_field {
|
|||
// placeholder
|
||||
if( empty($field['placeholder']) ) {
|
||||
|
||||
$field['placeholder'] = __("Select",'acf');
|
||||
$field['placeholder'] = _x('Select', 'verb', 'acf');
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -231,6 +260,7 @@ class acf_field_select extends acf_field {
|
|||
|
||||
|
||||
// null
|
||||
// - have tried array_merge but this causes keys to re-index if is numeric (post ID's)
|
||||
if( $field['allow_null'] && !$field['multiple'] ) {
|
||||
|
||||
$prepend = array('' => '- ' . $field['placeholder'] . ' -');
|
||||
|
|
@ -239,6 +269,7 @@ class acf_field_select extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
|
||||
// vars
|
||||
$atts = array(
|
||||
'id' => $field['id'],
|
||||
|
|
@ -482,6 +513,21 @@ class acf_field_select extends acf_field {
|
|||
),
|
||||
'layout' => 'horizontal',
|
||||
));
|
||||
|
||||
|
||||
// return_format
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Return Format','acf'),
|
||||
'instructions' => __('Specify the value returned','acf'),
|
||||
'type' => 'radio',
|
||||
'name' => 'return_format',
|
||||
'layout' => 'horizontal',
|
||||
'choices' => array(
|
||||
'value' => __('Value','acf'),
|
||||
'label' => __('Label','acf'),
|
||||
'array' => __('Both (Array)','acf')
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -603,10 +649,89 @@ class acf_field_select extends acf_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 ) {
|
||||
|
||||
// array
|
||||
if( acf_is_array($value) ) {
|
||||
|
||||
foreach( $value as $i => $v ) {
|
||||
|
||||
$value[ $i ] = $this->format_value_single( $v, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$value = $this->format_value_single( $value, $post_id, $field );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
function format_value_single( $value, $post_id, $field ) {
|
||||
|
||||
// bail ealry if is empty
|
||||
if( acf_is_empty($value) ) return $value;
|
||||
|
||||
|
||||
// vars
|
||||
$label = acf_maybe_get($field['choices'], $value, $value);
|
||||
|
||||
|
||||
// value
|
||||
if( $field['return_format'] == 'value' ) {
|
||||
|
||||
// do nothing
|
||||
|
||||
// label
|
||||
} elseif( $field['return_format'] == 'label' ) {
|
||||
|
||||
$value = $label;
|
||||
|
||||
// array
|
||||
} elseif( $field['return_format'] == 'array' ) {
|
||||
|
||||
$value = array(
|
||||
'value' => $value,
|
||||
'label' => $label
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_select();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_select() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class acf_field_tab extends acf_field {
|
|||
$this->label = __("Tab",'acf');
|
||||
$this->category = 'layout';
|
||||
$this->defaults = array(
|
||||
'value' => false, // prevents acf_render_fields() from attempting to load value
|
||||
'value' => false, // prevents ACF from attempting to load value
|
||||
'placement' => 'top',
|
||||
'endpoint' => 0 // added in 5.2.8
|
||||
);
|
||||
|
|
@ -135,10 +135,39 @@ class acf_field_tab extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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 ) {
|
||||
|
||||
// remove name
|
||||
$field['name'] = '';
|
||||
$field['required'] = 0;
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_tab();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_tab() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -66,7 +66,36 @@ class acf_field_taxonomy extends acf_field {
|
|||
|
||||
|
||||
/*
|
||||
* get_choices
|
||||
* 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
|
||||
acf_send_ajax_results($response);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_ajax_query
|
||||
*
|
||||
* This function will return an array of data formatted for use in a select2 AJAX response
|
||||
*
|
||||
|
|
@ -78,7 +107,7 @@ class acf_field_taxonomy extends acf_field {
|
|||
* @return (array)
|
||||
*/
|
||||
|
||||
function get_choices( $options = array() ) {
|
||||
function get_ajax_query( $options = array() ) {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
|
|
@ -91,19 +120,15 @@ class acf_field_taxonomy extends acf_field {
|
|||
|
||||
// load field
|
||||
$field = acf_get_field( $options['field_key'] );
|
||||
|
||||
if( !$field ) {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// vars
|
||||
$r = array();
|
||||
$results = array();
|
||||
$args = array();
|
||||
$is_hierarchical = is_taxonomy_hierarchical( $field['taxonomy'] );
|
||||
$is_pagination = ($options['paged'] > 0);
|
||||
$is_search = false;
|
||||
$limit = 20;
|
||||
$offset = 20 * ($options['paged'] - 1);
|
||||
|
||||
|
|
@ -114,19 +139,25 @@ class acf_field_taxonomy extends acf_field {
|
|||
|
||||
// pagination
|
||||
// - don't bother for hierarchial terms, we will need to load all terms anyway
|
||||
if( !$is_hierarchical && $is_pagination ) {
|
||||
if( $is_pagination && !$is_hierarchical ) {
|
||||
|
||||
$args['offset'] = $offset;
|
||||
$args['number'] = $limit;
|
||||
$args['offset'] = $offset;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// search
|
||||
if( $options['s'] ) {
|
||||
|
||||
$args['search'] = $options['s'];
|
||||
|
||||
if( $options['s'] !== '' ) {
|
||||
|
||||
// strip slashes (search may be integer)
|
||||
$s = wp_unslash( strval($options['s']) );
|
||||
|
||||
|
||||
// update vars
|
||||
$args['search'] = $s;
|
||||
$is_search = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -134,7 +165,7 @@ class acf_field_taxonomy extends acf_field {
|
|||
$args = apply_filters('acf/fields/taxonomy/query', $args, $field, $options['post_id']);
|
||||
$args = apply_filters('acf/fields/taxonomy/query/name=' . $field['name'], $args, $field, $options['post_id'] );
|
||||
$args = apply_filters('acf/fields/taxonomy/query/key=' . $field['key'], $args, $field, $options['post_id'] );
|
||||
|
||||
|
||||
|
||||
// get terms
|
||||
$terms = get_terms( $field['taxonomy'], $args );
|
||||
|
|
@ -143,13 +174,18 @@ class acf_field_taxonomy extends acf_field {
|
|||
// sort into hierachial order!
|
||||
if( $is_hierarchical ) {
|
||||
|
||||
// update vars
|
||||
$limit = acf_maybe_get( $args, 'number', $limit );
|
||||
$offset = acf_maybe_get( $args, 'offset', $offset );
|
||||
|
||||
|
||||
// get parent
|
||||
$parent = acf_maybe_get( $args, 'parent', 0 );
|
||||
$parent = acf_maybe_get( $args, 'child_of', $parent );
|
||||
|
||||
|
||||
// this will fail if a search has taken place because parents wont exist
|
||||
if( empty($args['search']) ) {
|
||||
if( !$is_search ) {
|
||||
|
||||
$terms = _get_term_children( $parent, $terms, $field['taxonomy'] );
|
||||
|
||||
|
|
@ -170,7 +206,7 @@ class acf_field_taxonomy extends acf_field {
|
|||
foreach( $terms as $term ) {
|
||||
|
||||
// add to json
|
||||
$r[] = array(
|
||||
$results[] = array(
|
||||
'id' => $term->term_id,
|
||||
'text' => $this->get_term_title( $term, $field, $options['post_id'] )
|
||||
);
|
||||
|
|
@ -178,42 +214,15 @@ class acf_field_taxonomy extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// vars
|
||||
$response = array(
|
||||
'results' => $results,
|
||||
'limit' => $limit
|
||||
);
|
||||
|
||||
|
||||
// return
|
||||
return $r;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
$choices = $this->get_choices( $_POST );
|
||||
|
||||
|
||||
// validate
|
||||
if( !$choices ) die();
|
||||
|
||||
|
||||
// return JSON
|
||||
echo json_encode( $choices );
|
||||
die();
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -337,7 +346,8 @@ class acf_field_taxonomy extends acf_field {
|
|||
if( $field['load_terms'] ) {
|
||||
|
||||
// get terms
|
||||
$term_ids = wp_get_object_terms($post_id, $field['taxonomy'], array('fields' => 'ids', 'orderby' => 'none'));
|
||||
$info = acf_get_post_id_info($post_id);
|
||||
$term_ids = wp_get_object_terms($info['id'], $field['taxonomy'], array('fields' => 'ids', 'orderby' => 'none'));
|
||||
|
||||
|
||||
// bail early if no terms
|
||||
|
|
@ -421,16 +431,6 @@ class acf_field_taxonomy extends acf_field {
|
|||
$term_ids = array_map('intval', $term_ids);
|
||||
|
||||
|
||||
// if called directly from frontend update_field()
|
||||
if( !did_action('acf/save_post') ) {
|
||||
|
||||
wp_set_object_terms( $post_id, $term_ids, $taxonomy, false );
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// get existing term id's (from a previously saved field)
|
||||
$old_term_ids = isset($this->save_post_terms[ $taxonomy ]) ? $this->save_post_terms[ $taxonomy ] : array();
|
||||
|
||||
|
|
@ -438,6 +438,16 @@ class acf_field_taxonomy extends acf_field {
|
|||
// append
|
||||
$this->save_post_terms[ $taxonomy ] = array_merge($old_term_ids, $term_ids);
|
||||
|
||||
|
||||
// if called directly from frontend update_field()
|
||||
if( !did_action('acf/save_post') ) {
|
||||
|
||||
$this->save_post( $post_id );
|
||||
|
||||
return $value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -466,12 +476,15 @@ class acf_field_taxonomy extends acf_field {
|
|||
if( empty($this->save_post_terms) ) return;
|
||||
|
||||
|
||||
// vars
|
||||
$info = acf_get_post_id_info($post_id);
|
||||
|
||||
// loop over terms
|
||||
|
||||
// loop
|
||||
foreach( $this->save_post_terms as $taxonomy => $term_ids ){
|
||||
|
||||
wp_set_object_terms( $post_id, $term_ids, $taxonomy, false );
|
||||
|
||||
// save
|
||||
wp_set_object_terms( $info['id'], $term_ids, $taxonomy, false );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -756,7 +769,7 @@ class acf_field_taxonomy extends acf_field {
|
|||
),
|
||||
__("Single Value",'acf') => array(
|
||||
'radio' => __('Radio Buttons', 'acf'),
|
||||
'select' => __('Select', 'acf')
|
||||
'select' => _x('Select', 'noun', 'acf')
|
||||
)
|
||||
)
|
||||
));
|
||||
|
|
@ -960,11 +973,11 @@ class acf_field_taxonomy extends acf_field {
|
|||
if( is_taxonomy_hierarchical( $field['taxonomy'] ) ) {
|
||||
|
||||
$choices = array();
|
||||
$choices2 = $this->get_choices(array( 'field_key' => $field['key'] ));
|
||||
$response = $this->get_ajax_query($args);
|
||||
|
||||
if( $choices2 ) {
|
||||
if( $response ) {
|
||||
|
||||
foreach( $choices2 as $v) {
|
||||
foreach( $response['results'] as $v ) {
|
||||
|
||||
$choices[ $v['id'] ] = $v['text'];
|
||||
|
||||
|
|
@ -995,9 +1008,13 @@ class acf_field_taxonomy extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_taxonomy();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_taxonomy() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
|
||||
|
||||
if( ! class_exists('acf_taxonomy_field_walker') ) :
|
||||
|
||||
|
|
|
|||
|
|
@ -39,9 +39,7 @@ class acf_field_text extends acf_field {
|
|||
'maxlength' => '',
|
||||
'placeholder' => '',
|
||||
'prepend' => '',
|
||||
'append' => '',
|
||||
'readonly' => 0,
|
||||
'disabled' => 0,
|
||||
'append' => ''
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -65,13 +63,14 @@ class acf_field_text extends acf_field {
|
|||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$o = array( 'type', 'id', 'class', 'name', 'value', 'placeholder' );
|
||||
$s = array( 'readonly', 'disabled' );
|
||||
$e = '';
|
||||
|
||||
|
||||
// maxlength
|
||||
if( $field['maxlength'] !== "" ) {
|
||||
if( $field['maxlength'] ) {
|
||||
|
||||
$o[] = 'maxlength';
|
||||
|
||||
|
|
@ -79,7 +78,7 @@ class acf_field_text extends acf_field {
|
|||
|
||||
|
||||
// prepend
|
||||
if( $field['prepend'] !== "" ) {
|
||||
if( $field['prepend'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-prepended';
|
||||
$e .= '<div class="acf-input-prepend">' . $field['prepend'] . '</div>';
|
||||
|
|
@ -88,7 +87,7 @@ class acf_field_text extends acf_field {
|
|||
|
||||
|
||||
// append
|
||||
if( $field['append'] !== "" ) {
|
||||
if( $field['append'] !== '' ) {
|
||||
|
||||
$field['class'] .= ' acf-is-appended';
|
||||
$e .= '<div class="acf-input-append">' . $field['append'] . '</div>';
|
||||
|
|
@ -96,8 +95,7 @@ class acf_field_text extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// populate atts
|
||||
$atts = array();
|
||||
// append atts
|
||||
foreach( $o as $k ) {
|
||||
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
|
|
@ -105,14 +103,10 @@ class acf_field_text extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// special atts
|
||||
// append special atts
|
||||
foreach( $s as $k ) {
|
||||
|
||||
if( $field[ $k ] ) {
|
||||
|
||||
$atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -191,8 +185,10 @@ class acf_field_text extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_text();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_text() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -39,8 +39,6 @@ class acf_field_textarea extends acf_field {
|
|||
'new_lines' => '',
|
||||
'maxlength' => '',
|
||||
'placeholder' => '',
|
||||
'readonly' => 0,
|
||||
'disabled' => 0,
|
||||
'rows' => ''
|
||||
);
|
||||
|
||||
|
|
@ -65,13 +63,14 @@ class acf_field_textarea extends acf_field {
|
|||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$o = array( 'id', 'class', 'name', 'placeholder', 'rows' );
|
||||
$s = array( 'readonly', 'disabled' );
|
||||
$e = '';
|
||||
|
||||
|
||||
// maxlength
|
||||
if( $field['maxlength'] !== '' ) {
|
||||
if( $field['maxlength'] ) {
|
||||
|
||||
$o[] = 'maxlength';
|
||||
|
||||
|
|
@ -86,8 +85,7 @@ class acf_field_textarea extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// populate atts
|
||||
$atts = array();
|
||||
// append atts
|
||||
foreach( $o as $k ) {
|
||||
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
|
|
@ -95,14 +93,10 @@ class acf_field_textarea extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// special atts
|
||||
// append special atts
|
||||
foreach( $s as $k ) {
|
||||
|
||||
if( $field[ $k ] ) {
|
||||
|
||||
$atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -237,8 +231,10 @@ class acf_field_textarea extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_textarea();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_textarea() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -175,8 +175,10 @@ class acf_field_time_picker extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_time_picker();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_time_picker() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -207,8 +207,10 @@ class acf_field_true_false extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_true_false();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_true_false() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -60,12 +60,13 @@ class acf_field_url extends acf_field {
|
|||
function render_field( $field ) {
|
||||
|
||||
// vars
|
||||
$atts = array();
|
||||
$o = array( 'type', 'id', 'class', 'name', 'value', 'placeholder' );
|
||||
$s = array( 'readonly', 'disabled' );
|
||||
$e = '';
|
||||
|
||||
|
||||
// populate atts
|
||||
$atts = array();
|
||||
// append atts
|
||||
foreach( $o as $k ) {
|
||||
|
||||
$atts[ $k ] = $field[ $k ];
|
||||
|
|
@ -73,14 +74,10 @@ class acf_field_url extends acf_field {
|
|||
}
|
||||
|
||||
|
||||
// special atts
|
||||
foreach( array( 'readonly', 'disabled' ) as $k ) {
|
||||
// append special atts
|
||||
foreach( $s as $k ) {
|
||||
|
||||
if( !empty($field[ $k ]) ) {
|
||||
|
||||
$atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
if( !empty($field[ $k ]) ) $atts[ $k ] = $k;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -177,8 +174,10 @@ class acf_field_url extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_url();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_url() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
183
fields/user.php
183
fields/user.php
|
|
@ -54,32 +54,38 @@ class acf_field_user extends acf_field {
|
|||
|
||||
|
||||
/*
|
||||
* get_choices
|
||||
* ajax_query
|
||||
*
|
||||
* This function will return an array of data formatted for use in a select2 AJAX response
|
||||
* description
|
||||
*
|
||||
* @type function
|
||||
* @date 15/10/2014
|
||||
* @since 5.0.9
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $options (array)
|
||||
* @return (array)
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function get_choices( $options = array() ) {
|
||||
function ajax_query() {
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($options, array(
|
||||
// validate
|
||||
if( !acf_verify_ajax() ) die();
|
||||
|
||||
|
||||
// defaults
|
||||
$options = acf_parse_args($_POST, array(
|
||||
'post_id' => 0,
|
||||
's' => '',
|
||||
'field_key' => '',
|
||||
'paged' => 1,
|
||||
'paged' => 1
|
||||
));
|
||||
|
||||
|
||||
|
||||
// vars
|
||||
$r = array();
|
||||
$results = array();
|
||||
$args = array();
|
||||
$s = false;
|
||||
$is_search = false;
|
||||
|
||||
|
||||
// paged
|
||||
|
|
@ -87,15 +93,26 @@ class acf_field_user extends acf_field {
|
|||
$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();
|
||||
|
||||
|
||||
// bail early if no field
|
||||
if( !$field ) return false;
|
||||
|
||||
|
||||
// update $args
|
||||
// role
|
||||
if( !empty($field['role']) ) {
|
||||
|
||||
$args['role'] = acf_get_array( $field['role'] );
|
||||
|
|
@ -104,7 +121,7 @@ class acf_field_user extends acf_field {
|
|||
|
||||
|
||||
// search
|
||||
if( $options['s'] ) {
|
||||
if( $is_search ) {
|
||||
|
||||
// append to $args
|
||||
$args['search'] = '*' . $options['s'] . '*';
|
||||
|
|
@ -130,101 +147,71 @@ class acf_field_user extends acf_field {
|
|||
$groups = acf_get_grouped_users( $args );
|
||||
|
||||
|
||||
// bail early if no groups
|
||||
if( empty($groups) ) return false;
|
||||
|
||||
|
||||
// loop
|
||||
foreach( array_keys($groups) as $group_title ) {
|
||||
if( !empty($groups) ) {
|
||||
|
||||
// vars
|
||||
$users = acf_extract_var( $groups, $group_title );
|
||||
$data = array(
|
||||
'text' => $group_title,
|
||||
'children' => array()
|
||||
);
|
||||
|
||||
|
||||
// append users
|
||||
foreach( array_keys($users) as $user_id ) {
|
||||
foreach( array_keys($groups) as $group_title ) {
|
||||
|
||||
$users[ $user_id ] = $this->get_result( $users[ $user_id ], $field, $options['post_id'] );
|
||||
|
||||
};
|
||||
|
||||
|
||||
// order by search
|
||||
if( !empty($args['s']) ) {
|
||||
|
||||
$users = acf_order_by_search( $users, $args['s'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $data
|
||||
foreach( $users as $id => $title ) {
|
||||
|
||||
$data['children'][] = array(
|
||||
'id' => $id,
|
||||
'text' => $title
|
||||
// vars
|
||||
$users = acf_extract_var( $groups, $group_title );
|
||||
$data = array(
|
||||
'text' => $group_title,
|
||||
'children' => array()
|
||||
);
|
||||
|
||||
|
||||
// append users
|
||||
foreach( array_keys($users) as $user_id ) {
|
||||
|
||||
$users[ $user_id ] = $this->get_result( $users[ $user_id ], $field, $options['post_id'] );
|
||||
|
||||
};
|
||||
|
||||
|
||||
// order by search
|
||||
if( $is_search && empty($args['orderby']) ) {
|
||||
|
||||
$users = acf_order_by_search( $users, $args['s'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $data
|
||||
foreach( $users as $id => $title ) {
|
||||
|
||||
$data['children'][] = array(
|
||||
'id' => $id,
|
||||
'text' => $title
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $r
|
||||
$results[] = $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// append to $r
|
||||
$r[] = $data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// optgroup or single
|
||||
if( !empty($args['role']) && count($args['role']) == 1 ) {
|
||||
|
||||
$r = $r[0]['children'];
|
||||
$results = $results[0]['children'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $r;
|
||||
|
||||
acf_send_ajax_results(array(
|
||||
'results' => $results,
|
||||
'limit' => $args['users_per_page']
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
$choices = $this->get_choices( $_POST );
|
||||
|
||||
|
||||
// validate
|
||||
if( !$choices ) die();
|
||||
|
||||
|
||||
// return JSON
|
||||
echo json_encode( $choices );
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_result
|
||||
|
|
@ -244,11 +231,7 @@ class acf_field_user extends acf_field {
|
|||
function get_result( $user, $field, $post_id = 0 ) {
|
||||
|
||||
// get post_id
|
||||
if( !$post_id ) {
|
||||
|
||||
$post_id = acf_get_setting('form_data/post_id', get_the_ID());
|
||||
|
||||
}
|
||||
if( !$post_id ) $post_id = acf_get_form_data('post_id');
|
||||
|
||||
|
||||
// vars
|
||||
|
|
@ -588,8 +571,10 @@ class acf_field_user extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_user();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_user() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -259,7 +259,11 @@ acf.fields.wysiwyg.toolbars = <?php echo json_encode($json); ?>;
|
|||
|
||||
|
||||
// detect mode
|
||||
if( $field['tabs'] == 'visual' ) {
|
||||
if( !user_can_richedit() ) {
|
||||
|
||||
$show_tabs = false;
|
||||
|
||||
} elseif( $field['tabs'] == 'visual' ) {
|
||||
|
||||
// case: visual tab only
|
||||
$default_editor = 'tinymce';
|
||||
|
|
@ -462,8 +466,10 @@ acf.fields.wysiwyg.toolbars = <?php echo json_encode($json); ?>;
|
|||
|
||||
}
|
||||
|
||||
new acf_field_wysiwyg();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_wysiwyg() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -167,20 +167,14 @@ acf.unload.active = 0;
|
|||
function edit_attachment( $form_fields, $post ) {
|
||||
|
||||
// vars
|
||||
$el = 'tr';
|
||||
$is_page = $this->validate_page();
|
||||
$post_id = $post->ID;
|
||||
$el = 'tr';
|
||||
$args = array(
|
||||
'attachment' => $post_id
|
||||
);
|
||||
|
||||
|
||||
// $el
|
||||
if( $this->validate_page() ) {
|
||||
|
||||
//$el = 'div';
|
||||
|
||||
}
|
||||
|
||||
// get field groups
|
||||
$field_groups = acf_get_field_groups( $args );
|
||||
|
||||
|
|
@ -201,6 +195,7 @@ acf.unload.active = 0;
|
|||
if( $this->validate_page() ) {
|
||||
|
||||
echo '<style type="text/css">
|
||||
|
||||
.compat-attachment-fields,
|
||||
.compat-attachment-fields > tbody,
|
||||
.compat-attachment-fields > tbody > tr,
|
||||
|
|
@ -208,46 +203,60 @@ acf.unload.active = 0;
|
|||
.compat-attachment-fields > tbody > tr > td {
|
||||
display: block;
|
||||
}
|
||||
tr.acf-field {
|
||||
display: block;
|
||||
margin: 0 0 13px;
|
||||
|
||||
.compat-attachment-fields > tbody > tr.acf-field {
|
||||
margin: 0 0 15px;
|
||||
}
|
||||
tr.acf-field td.acf-label {
|
||||
display: block;
|
||||
|
||||
.compat-attachment-fields > tbody > tr.acf-field > td.acf-label {
|
||||
margin: 0;
|
||||
}
|
||||
tr.acf-field td.acf-input {
|
||||
display: block;
|
||||
|
||||
.compat-attachment-fields > tbody > tr.acf-field > td.acf-label label {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.compat-attachment-fields > tbody > tr.acf-field > td.acf-label p {
|
||||
margin: 0 0 3px !important;
|
||||
}
|
||||
|
||||
.compat-attachment-fields > tbody > tr.acf-field > td.acf-input {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
</style>';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// $el
|
||||
//if( $el == 'tr' ) {
|
||||
|
||||
echo '</td></tr>';
|
||||
|
||||
//}
|
||||
// open
|
||||
echo '</td></tr>';
|
||||
|
||||
|
||||
// loop
|
||||
foreach( $field_groups as $field_group ) {
|
||||
|
||||
// load fields
|
||||
$fields = acf_get_fields( $field_group );
|
||||
|
||||
acf_render_fields( $post_id, $fields, $el, 'field' );
|
||||
|
||||
// override instruction placement for modal
|
||||
if( !$is_page ) {
|
||||
|
||||
$field_group['instruction_placement'] = 'field';
|
||||
}
|
||||
|
||||
|
||||
// render
|
||||
acf_render_fields( $post_id, $fields, $el, $field_group['instruction_placement'] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// $el
|
||||
//if( $el == 'tr' ) {
|
||||
|
||||
echo '<tr class="compat-field-acf-blank"><td>';
|
||||
|
||||
//}
|
||||
// close
|
||||
echo '<tr class="compat-field-acf-blank"><td>';
|
||||
|
||||
|
||||
|
||||
$html = ob_get_contents();
|
||||
|
|
|
|||
|
|
@ -483,6 +483,49 @@ if( typeof acf !== 'undefined' ) {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* allow_save_post
|
||||
*
|
||||
* This function will return true if the post is allowed to be saved
|
||||
*
|
||||
* @type function
|
||||
* @date 26/06/2016
|
||||
* @since 5.3.8
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function allow_save_post( $post ) {
|
||||
|
||||
// vars
|
||||
$allow = true;
|
||||
$reject = array( 'auto-draft', 'revision', 'acf-field', 'acf-field-group' );
|
||||
$wp_preview = acf_maybe_get($_POST, 'wp-preview');
|
||||
|
||||
|
||||
// check post type
|
||||
if( in_array($post->post_type, $reject) ) {
|
||||
|
||||
$allow = false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// allow preview
|
||||
if( $post->post_type == 'revision' && $wp_preview === 'dopreview' ) {
|
||||
|
||||
$allow = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $allow;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* save_post
|
||||
*
|
||||
|
|
@ -498,50 +541,30 @@ if( typeof acf !== 'undefined' ) {
|
|||
|
||||
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 ealry if no allowed to save this post type
|
||||
if( !$this->allow_save_post($post) ) return $post_id;
|
||||
|
||||
|
||||
// bail early if is acf-field-group or acf-field
|
||||
if( in_array($post->post_type, array('acf-field', 'acf-field-group'))) {
|
||||
|
||||
return $post_id;
|
||||
|
||||
}
|
||||
// ensure saving to the correct post
|
||||
if( !acf_verify_nonce('post', $post_id) ) return $post_id;
|
||||
|
||||
|
||||
// verify and remove nonce
|
||||
if( !acf_verify_nonce('post', $post_id) ) {
|
||||
|
||||
return $post_id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// validate and save
|
||||
// validate for published post (allow draft to save without validation)
|
||||
if( get_post_status($post_id) == 'publish' ) {
|
||||
|
||||
if( acf_validate_save_post(true) ) {
|
||||
// show errors
|
||||
acf_validate_save_post( true );
|
||||
|
||||
acf_save_post( $post_id );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
acf_save_post( $post_id );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// save
|
||||
acf_save_post( $post_id );
|
||||
|
||||
|
||||
// return
|
||||
return $post_id;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ class acf_form_user {
|
|||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// load acf scripts
|
||||
acf_enqueue_scripts();
|
||||
|
|
@ -302,11 +302,11 @@ class acf_form_user {
|
|||
.acf-field input[type="email"],
|
||||
.acf-field input[type="url"],
|
||||
.acf-field select {
|
||||
width: 25em;
|
||||
max-width: 25em;
|
||||
}
|
||||
|
||||
.acf-field textarea {
|
||||
width: 500px;
|
||||
max-width: 500px;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -319,7 +319,7 @@ class acf_form_user {
|
|||
.acf-field .acf-field input[type="url"],
|
||||
.acf-field .acf-field textarea,
|
||||
.acf-field .acf-field select {
|
||||
width: 100%;
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
<?php else: ?>
|
||||
|
|
|
|||
Binary file not shown.
1087
lang/acf-de_CH.po
1087
lang/acf-de_CH.po
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
1460
lang/acf-fa_IR.po
1460
lang/acf-fa_IR.po
File diff suppressed because it is too large
Load Diff
Binary file not shown.
1147
lang/acf-nl_NL.po
1147
lang/acf-nl_NL.po
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
738
lang/acf.pot
738
lang/acf.pot
File diff suppressed because it is too large
Load Diff
|
|
@ -79,6 +79,7 @@ class acf_pro {
|
|||
acf_include('pro/fields/repeater.php');
|
||||
acf_include('pro/fields/flexible-content.php');
|
||||
acf_include('pro/fields/gallery.php');
|
||||
acf_include('pro/fields/clone.php');
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,10 +41,6 @@ class acf_settings_updates {
|
|||
|
||||
function admin_menu() {
|
||||
|
||||
// vars
|
||||
$basename = acf_get_setting('basename');
|
||||
|
||||
|
||||
// bail early if no show_admin
|
||||
if( !acf_get_setting('show_admin') ) return;
|
||||
|
||||
|
|
@ -54,7 +50,7 @@ class acf_settings_updates {
|
|||
|
||||
|
||||
// bail early if not a plugin (included in theme)
|
||||
if( !is_plugin_active($basename) ) return;
|
||||
if( !acf_is_plugin_active() ) return;
|
||||
|
||||
|
||||
// add page
|
||||
|
|
@ -67,6 +63,48 @@ class acf_settings_updates {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* show_remote_response_error
|
||||
*
|
||||
* This function will show an admin notice if server connection fails
|
||||
*
|
||||
* @type function
|
||||
* @date 25/07/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function show_remote_response_error() {
|
||||
|
||||
// only run once
|
||||
if( acf_has_done('show_remote_response_error') ) return false;
|
||||
|
||||
|
||||
// vars
|
||||
$error = acf_get_setting('remote_response_error');
|
||||
$notice = __('<b>Error</b>. Could not connect to update server', 'acf');
|
||||
|
||||
|
||||
// append error
|
||||
if( $error ) {
|
||||
|
||||
$notice .= ' <span class="description">(' . $error . ')</span>';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// add notice
|
||||
acf_add_admin_notice( $notice, 'error' );
|
||||
|
||||
|
||||
// return
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* load
|
||||
*
|
||||
|
|
@ -121,9 +159,8 @@ class acf_settings_updates {
|
|||
|
||||
// validate
|
||||
if( empty($info) ) {
|
||||
|
||||
acf_add_admin_notice( __('<b>Error</b>. Could not connect to update server', 'acf'), 'error');
|
||||
return;
|
||||
|
||||
return $this->show_remote_response_error();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -141,6 +178,10 @@ class acf_settings_updates {
|
|||
|
||||
}
|
||||
|
||||
|
||||
// update transient
|
||||
acf_refresh_plugin_updates_transient();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -200,8 +241,7 @@ class acf_settings_updates {
|
|||
// validate
|
||||
if( empty($response) ) {
|
||||
|
||||
acf_add_admin_notice( __('<b>Connection Error</b>. Sorry, please try again', 'acf'), 'error');
|
||||
return;
|
||||
return $this->show_remote_response_error();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -271,8 +311,7 @@ class acf_settings_updates {
|
|||
// validate
|
||||
if( empty($response) ) {
|
||||
|
||||
acf_add_admin_notice(__('<b>Connection Error</b>. Sorry, please try again', 'acf'), 'error');
|
||||
return;
|
||||
return $this->show_remote_response_error();
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ function acf_get_valid_options_page( $page = '' ) {
|
|||
|
||||
|
||||
// defaults
|
||||
$page = acf_parse_args($page, array(
|
||||
$page = wp_parse_args($page, array(
|
||||
'page_title' => '',
|
||||
'menu_title' => '',
|
||||
'menu_slug' => '',
|
||||
|
|
|
|||
|
|
@ -84,8 +84,27 @@ function acf_pro_get_remote_response( $action = '', $post = array() ) {
|
|||
));
|
||||
|
||||
|
||||
// return body
|
||||
if( !is_wp_error($request) || wp_remote_retrieve_response_code($request) === 200) {
|
||||
// error
|
||||
if( is_wp_error($request) ) {
|
||||
|
||||
// loop
|
||||
foreach( $request->errors as $k => $v ) {
|
||||
|
||||
// bail early if no error
|
||||
if( empty($v[0]) ) continue;
|
||||
|
||||
|
||||
// save
|
||||
acf_update_setting('remote_response_error', $k . ': ' . $v[0]);
|
||||
|
||||
|
||||
// only run once
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// success
|
||||
} elseif( wp_remote_retrieve_response_code($request) === 200) {
|
||||
|
||||
return $request['body'];
|
||||
|
||||
|
|
|
|||
|
|
@ -348,13 +348,11 @@ html[dir="rtl"] .acf-flexible-content .layout .acf-fc-layout-controlls {
|
|||
/* main */
|
||||
/* attachments */
|
||||
/* attachment */
|
||||
/* hide attachment actions when sidebar is open */
|
||||
/* toolbar */
|
||||
/* sidebar */
|
||||
/* side info */
|
||||
/* side data */
|
||||
/* column widths */
|
||||
/* column widths clear */
|
||||
/* resizable */
|
||||
}
|
||||
.acf-gallery .acf-gallery-main {
|
||||
|
|
@ -374,16 +372,15 @@ html[dir="rtl"] .acf-flexible-content .layout .acf-fc-layout-controlls {
|
|||
left: 0;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment {
|
||||
width: 25%;
|
||||
float: left;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
background: #fff;
|
||||
/* sortable */
|
||||
/* active */
|
||||
/* audio, video */
|
||||
/* icon */
|
||||
/* rtl */
|
||||
}
|
||||
|
|
@ -392,16 +389,27 @@ html[dir="rtl"] .acf-flexible-content .layout .acf-fc-layout-controlls {
|
|||
border: #DFDFDF solid 1px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
background: #eee;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment img {
|
||||
.acf-gallery .acf-gallery-attachment .margin:before {
|
||||
content: "";
|
||||
display: block;
|
||||
padding-top: 100%;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment .thumbnail {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
transform: translate(50%, 50%);
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment .thumbnail img {
|
||||
display: block;
|
||||
height: auto;
|
||||
max-height: 100%;
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment img[src$="svg"] {
|
||||
background: #f9f9f9;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment .filename {
|
||||
position: absolute;
|
||||
|
|
@ -417,50 +425,42 @@ html[dir="rtl"] .acf-flexible-content .layout .acf-fc-layout-controlls {
|
|||
word-wrap: break-word;
|
||||
max-height: 90%;
|
||||
overflow: hidden;
|
||||
display: none;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment .actions {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.ui-sortable-placeholder {
|
||||
visibility: visible !important;
|
||||
background: #F1F1F1;
|
||||
.acf-gallery .acf-gallery-attachment.ui-sortable-helper .margin {
|
||||
border: none;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.ui-sortable-placeholder .margin {
|
||||
visibility: hidden !important;
|
||||
background: #F1F1F1;
|
||||
border: none;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.ui-sortable-placeholder .margin * {
|
||||
display: none !important;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.active .margin {
|
||||
box-shadow: 0 0 0 1px #FFFFFF, 0 0 0 5px #1E8CBE;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.-audio .filename,
|
||||
.acf-gallery .acf-gallery-attachment.-video .filename {
|
||||
display: block;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.-icon .margin:before {
|
||||
content: "";
|
||||
display: block;
|
||||
padding-top: 100%;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.-icon .thumbnail {
|
||||
position: absolute;
|
||||
top: 35%;
|
||||
left: 50%;
|
||||
max-width: 40%;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.-icon img {
|
||||
margin: -50% 0 0 -50%;
|
||||
}
|
||||
.acf-gallery .acf-gallery-attachment.-icon .filename {
|
||||
display: block;
|
||||
.acf-gallery .acf-gallery-attachment.-icon .thumbnail img {
|
||||
transform: translate(-50%, -70%);
|
||||
}
|
||||
html[dir="rtl"] .acf-gallery .acf-gallery-attachment {
|
||||
float: right;
|
||||
}
|
||||
.acf-gallery.sidebar-open {
|
||||
/* hide attachment actions when sidebar is open */
|
||||
/* allow sidebar to move over main for small widths (widget edit box) */
|
||||
}
|
||||
.acf-gallery.sidebar-open .acf-gallery-attachment .actions {
|
||||
display: none;
|
||||
}
|
||||
.acf-gallery.sidebar-open .acf-gallery-side {
|
||||
z-index: 2;
|
||||
}
|
||||
.acf-gallery .acf-gallery-toolbar {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
|
|
@ -608,15 +608,6 @@ html[dir="rtl"] .acf-gallery .acf-gallery-side-data th.label {
|
|||
.acf-gallery[data-columns="8"] .acf-gallery-attachment {
|
||||
width: 12.5%;
|
||||
}
|
||||
.acf-gallery[data-columns="2"] .acf-gallery-attachment:nth-child(2n+1),
|
||||
.acf-gallery[data-columns="3"] .acf-gallery-attachment:nth-child(3n+1),
|
||||
.acf-gallery[data-columns="4"] .acf-gallery-attachment:nth-child(4n+1),
|
||||
.acf-gallery[data-columns="5"] .acf-gallery-attachment:nth-child(5n+1),
|
||||
.acf-gallery[data-columns="6"] .acf-gallery-attachment:nth-child(6n+1),
|
||||
.acf-gallery[data-columns="7"] .acf-gallery-attachment:nth-child(7n+1),
|
||||
.acf-gallery[data-columns="8"] .acf-gallery-attachment:nth-child(8n+1) {
|
||||
clear: both;
|
||||
}
|
||||
.acf-gallery .ui-resizable-handle {
|
||||
display: block;
|
||||
position: absolute;
|
||||
|
|
|
|||
|
|
@ -1191,6 +1191,7 @@
|
|||
$main: null,
|
||||
$side: null,
|
||||
$attachments: null,
|
||||
$input: null,
|
||||
//$attachment: null,
|
||||
|
||||
actions: {
|
||||
|
|
@ -1235,6 +1236,7 @@
|
|||
this.$main = this.$el.children('.acf-gallery-main');
|
||||
this.$side = this.$el.children('.acf-gallery-side');
|
||||
this.$attachments = this.$main.children('.acf-gallery-attachments');
|
||||
this.$input = this.$el.find('input:first');
|
||||
|
||||
|
||||
// get options
|
||||
|
|
@ -1610,14 +1612,14 @@
|
|||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
render_attachment: function( id, data ){
|
||||
render_attachment: function( data ){
|
||||
|
||||
// prepare
|
||||
data = this.prepare(data);
|
||||
|
||||
|
||||
// vars
|
||||
var $attachment = this.get_attachment(id),
|
||||
var $attachment = this.get_attachment(data.id),
|
||||
$margin = $attachment.find('.margin'),
|
||||
$img = $attachment.find('img'),
|
||||
$filename = $attachment.find('.filename'),
|
||||
|
|
@ -1628,11 +1630,29 @@
|
|||
var thumbnail = data.url;
|
||||
|
||||
|
||||
// icon
|
||||
if( data.type !== 'image' ) {
|
||||
// image
|
||||
if( data.type == 'image' ) {
|
||||
|
||||
// remove filename
|
||||
$filename.remove();
|
||||
|
||||
// other (video)
|
||||
} else {
|
||||
|
||||
// attempt to find attachment thumbnail
|
||||
thumbnail = acf.maybe_get(data, 'thumb.src');
|
||||
|
||||
|
||||
// update filenmae text
|
||||
$filename.text( data.filename );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// default icon
|
||||
if( !thumbnail ) {
|
||||
|
||||
thumbnail = acf._e('media', 'default_icon');
|
||||
|
||||
$attachment.addClass('-icon');
|
||||
|
||||
}
|
||||
|
|
@ -1644,23 +1664,10 @@
|
|||
'alt': data.alt,
|
||||
'title': data.title
|
||||
});
|
||||
$filename.text(data.filename);
|
||||
|
||||
|
||||
// vars
|
||||
var val = '';
|
||||
|
||||
|
||||
// WP attachment
|
||||
if( data.id ) {
|
||||
|
||||
val = data.id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// update val
|
||||
acf.val( $input, val );
|
||||
acf.val( $input, data.id );
|
||||
|
||||
},
|
||||
|
||||
|
|
@ -1792,12 +1799,16 @@
|
|||
|
||||
|
||||
// render data
|
||||
this.render_attachment( data.id, data );
|
||||
this.render_attachment( data );
|
||||
|
||||
|
||||
// render
|
||||
this.render();
|
||||
|
||||
|
||||
// trigger change
|
||||
this.$input.trigger('change');
|
||||
|
||||
},
|
||||
|
||||
|
||||
|
|
@ -1910,7 +1921,7 @@
|
|||
|
||||
|
||||
// maybe get preview size
|
||||
data.url = acf.maybe_get(data, 'sizes.'+this.o.preview_size+'.url', data.url);
|
||||
data.url = acf.maybe_get(data, 'sizes.medium.url', data.url);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -2226,6 +2237,10 @@
|
|||
// render (update classes)
|
||||
this.render();
|
||||
|
||||
|
||||
// trigger change
|
||||
this.$input.trigger('change');
|
||||
|
||||
},
|
||||
|
||||
|
||||
|
|
@ -2274,21 +2289,16 @@
|
|||
$field = this.$field;
|
||||
|
||||
|
||||
// vars
|
||||
var attachment = id,
|
||||
$attachment = this.get_attachment(id);
|
||||
|
||||
|
||||
// popup
|
||||
var frame = acf.media.popup({
|
||||
mode: 'edit',
|
||||
title: acf._e('image', 'edit'),
|
||||
button: acf._e('image', 'update'),
|
||||
attachment: attachment,
|
||||
attachment: id,
|
||||
select: function( attachment ){
|
||||
|
||||
// render attachment
|
||||
self.set('$field', $field).render_attachment( id, attachment );
|
||||
self.set('$field', $field).render_attachment( attachment );
|
||||
|
||||
|
||||
// render sidebar
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
|
@ -59,6 +59,10 @@ class acf_field_flexible_content extends acf_field {
|
|||
add_action('wp_ajax_nopriv_acf/fields/flexible_content/layout_title', array($this, 'ajax_layout_title'));
|
||||
|
||||
|
||||
// filters
|
||||
add_filter('acf/clone_field', array($this, 'acf_clone_field'), 10, 2);
|
||||
|
||||
|
||||
// do not delete!
|
||||
parent::__construct();
|
||||
|
||||
|
|
@ -707,6 +711,10 @@ class acf_field_flexible_content extends acf_field {
|
|||
$sub_field = $layout[ $j ];
|
||||
|
||||
|
||||
// bail ealry if no name (tab)
|
||||
if( acf_is_empty($sub_field['name']) ) continue;
|
||||
|
||||
|
||||
// update full name
|
||||
$sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
|
||||
|
||||
|
|
@ -795,14 +803,18 @@ class acf_field_flexible_content extends acf_field {
|
|||
$sub_field = $layout[ $j ];
|
||||
|
||||
|
||||
// update $sub_field name
|
||||
$sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
|
||||
|
||||
|
||||
// bail ealry if no name (tab)
|
||||
if( acf_is_empty($sub_field['name']) ) continue;
|
||||
|
||||
|
||||
// extract value
|
||||
$sub_value = acf_extract_var( $value[ $i ], $sub_field['key'] );
|
||||
|
||||
|
||||
// update $sub_field name
|
||||
$sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
|
||||
|
||||
|
||||
// format value
|
||||
$sub_value = acf_format_value( $sub_value, $post_id, $sub_field );
|
||||
|
||||
|
|
@ -1058,7 +1070,7 @@ class acf_field_flexible_content extends acf_field {
|
|||
// save false for empty value
|
||||
if( empty($order) ) {
|
||||
|
||||
$order = false;
|
||||
$order = '';
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -1291,10 +1303,10 @@ class acf_field_flexible_content extends acf_field {
|
|||
|
||||
// options
|
||||
$options = acf_parse_args( $_POST, array(
|
||||
'post_id' => 0,
|
||||
'i' => 0,
|
||||
'field_key' => '',
|
||||
'nonce' => '',
|
||||
'post_id' => 0,
|
||||
'i' => 0,
|
||||
'field_key' => '',
|
||||
'nonce' => '',
|
||||
'layout' => '',
|
||||
'acf' => array()
|
||||
));
|
||||
|
|
@ -1393,10 +1405,47 @@ class acf_field_flexible_content extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* acf_clone_field
|
||||
*
|
||||
* This function will update clone field settings based on the origional field
|
||||
*
|
||||
* @type function
|
||||
* @date 28/06/2016
|
||||
* @since 5.3.8
|
||||
*
|
||||
* @param $clone (array)
|
||||
* @param $field (array)
|
||||
* @return $clone
|
||||
*/
|
||||
|
||||
function acf_clone_field( $field, $clone_field ) {
|
||||
|
||||
// remove parent_layout
|
||||
// - allows a sub field to be rendered as a normal field
|
||||
unset($field['parent_layout']);
|
||||
|
||||
|
||||
// attempt to merger parent_layout
|
||||
if( isset($clone_field['parent_layout']) ) {
|
||||
|
||||
$field['parent_layout'] = $clone_field['parent_layout'];
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
new acf_field_flexible_content();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_flexible_content() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ class acf_field_gallery extends acf_field {
|
|||
$this->label = __("Gallery",'acf');
|
||||
$this->category = 'content';
|
||||
$this->defaults = array(
|
||||
'preview_size' => 'thumbnail',
|
||||
'library' => 'all',
|
||||
'min' => 0,
|
||||
'max' => 0,
|
||||
|
|
@ -225,10 +224,10 @@ class acf_field_gallery extends acf_field {
|
|||
$r = array();
|
||||
$order = 'DESC';
|
||||
$args = acf_parse_args( $_POST, array(
|
||||
'ids' => 0,
|
||||
'sort' => 'date',
|
||||
'field_key' => '',
|
||||
'nonce' => '',
|
||||
'ids' => 0,
|
||||
'sort' => 'date',
|
||||
'field_key' => '',
|
||||
'nonce' => '',
|
||||
));
|
||||
|
||||
|
||||
|
|
@ -467,7 +466,6 @@ class acf_field_gallery extends acf_field {
|
|||
$atts = array(
|
||||
'id' => $field['id'],
|
||||
'class' => "acf-gallery {$field['class']}",
|
||||
'data-preview_size' => $field['preview_size'],
|
||||
'data-library' => $field['library'],
|
||||
'data-min' => $field['min'],
|
||||
'data-max' => $field['max'],
|
||||
|
|
@ -516,10 +514,14 @@ class acf_field_gallery extends acf_field {
|
|||
|
||||
|
||||
// thumbnail
|
||||
$thumbnail = acf_get_post_thumbnail($a['ID'], $field['preview_size']);
|
||||
$thumbnail = acf_get_post_thumbnail($a['ID'], 'medium');
|
||||
|
||||
|
||||
// icon
|
||||
// remove filename if is image
|
||||
if( $a['type'] == 'image' ) $a['filename'] = '';
|
||||
|
||||
|
||||
// class
|
||||
$a['class'] .= ' -' . $a['type'];
|
||||
|
||||
if( $thumbnail['type'] == 'icon' ) {
|
||||
|
|
@ -536,18 +538,18 @@ class acf_field_gallery extends acf_field {
|
|||
<div class="thumbnail">
|
||||
<img src="<?php echo $thumbnail['url']; ?>" alt="" title="<?php echo $a['title']; ?>"/>
|
||||
</div>
|
||||
<div class="filename"><?php echo acf_get_truncated($a['filename'], 30); ?></div>
|
||||
<?php if( $a['filename'] ): ?>
|
||||
<div class="filename"><?php echo acf_get_truncated($a['filename'], 30); ?></div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="actions acf-soh-target">
|
||||
<a class="acf-icon -cancel dark acf-gallery-remove" href="#" data-id="<?php echo $a['ID']; ?>" title="<?php _e('Remove', 'acf'); ?>"></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="acf-gallery-toolbar">
|
||||
|
|
@ -650,16 +652,6 @@ class acf_field_gallery extends acf_field {
|
|||
));
|
||||
|
||||
|
||||
// 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()
|
||||
));
|
||||
|
||||
|
||||
// insert
|
||||
acf_render_field_setting( $field, array(
|
||||
'label' => __('Insert','acf'),
|
||||
|
|
@ -913,8 +905,10 @@ class acf_field_gallery extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_gallery();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_gallery() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -70,9 +70,18 @@ class acf_field_repeater extends acf_field {
|
|||
|
||||
function load_field( $field ) {
|
||||
|
||||
$field['sub_fields'] = acf_get_fields( $field );
|
||||
// vars
|
||||
$sub_fields = acf_get_fields( $field );
|
||||
|
||||
|
||||
// append
|
||||
if( $sub_fields ) {
|
||||
|
||||
$field['sub_fields'] = $sub_fields;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $field;
|
||||
}
|
||||
|
|
@ -531,6 +540,10 @@ class acf_field_repeater extends acf_field {
|
|||
$sub_field = $field['sub_fields'][ $j ];
|
||||
|
||||
|
||||
// bail ealry if no name (tab)
|
||||
if( acf_is_empty($sub_field['name']) ) continue;
|
||||
|
||||
|
||||
// update $sub_field name
|
||||
$sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
|
||||
|
||||
|
|
@ -594,14 +607,18 @@ class acf_field_repeater extends acf_field {
|
|||
$sub_field = $field['sub_fields'][ $j ];
|
||||
|
||||
|
||||
// update $sub_field name
|
||||
$sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
|
||||
// bail ealry if no name (tab)
|
||||
if( acf_is_empty($sub_field['name']) ) continue;
|
||||
|
||||
|
||||
// extract value
|
||||
$sub_value = acf_extract_var( $value[ $i ], $sub_field['key'] );
|
||||
|
||||
|
||||
// update $sub_field name
|
||||
$sub_field['name'] = "{$field['name']}_{$i}_{$sub_field['name']}";
|
||||
|
||||
|
||||
// format value
|
||||
$sub_value = acf_format_value( $sub_value, $post_id, $sub_field );
|
||||
|
||||
|
|
@ -707,6 +724,10 @@ class acf_field_repeater extends acf_field {
|
|||
$total = 0;
|
||||
|
||||
|
||||
// bail early if no sub fields
|
||||
if( empty($field['sub_fields']) ) return $value;
|
||||
|
||||
|
||||
// remove acfcloneindex
|
||||
if( isset($value['acfcloneindex']) ) {
|
||||
|
||||
|
|
@ -733,14 +754,6 @@ class acf_field_repeater extends acf_field {
|
|||
$total++;
|
||||
|
||||
|
||||
// continue if no sub fields
|
||||
if( !$field['sub_fields'] ) {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// loop through sub fields
|
||||
foreach( $field['sub_fields'] as $sub_field ) {
|
||||
|
||||
|
|
@ -812,6 +825,14 @@ class acf_field_repeater extends acf_field {
|
|||
$value = $total;
|
||||
|
||||
|
||||
// save false for empty value
|
||||
if( empty($value) ) {
|
||||
|
||||
$value = '';
|
||||
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $value;
|
||||
}
|
||||
|
|
@ -837,7 +858,7 @@ class acf_field_repeater extends acf_field {
|
|||
|
||||
|
||||
// bail early if no rows or no sub fields
|
||||
if( !$old_total || !$field['sub_fields'] ) {
|
||||
if( !$old_total || empty($field['sub_fields']) ) {
|
||||
|
||||
return;
|
||||
|
||||
|
|
@ -878,14 +899,14 @@ class acf_field_repeater extends acf_field {
|
|||
|
||||
function delete_field( $field ) {
|
||||
|
||||
// loop through sub fields
|
||||
if( !empty($field['sub_fields']) ) {
|
||||
// bail early if no sub fields
|
||||
if( empty($field['sub_fields']) ) return;
|
||||
|
||||
foreach( $field['sub_fields'] as $sub_field ) {
|
||||
|
||||
acf_delete_field( $sub_field['ID'] );
|
||||
|
||||
}
|
||||
|
||||
// loop through sub fields
|
||||
foreach( $field['sub_fields'] as $sub_field ) {
|
||||
|
||||
acf_delete_field( $sub_field['ID'] );
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -952,8 +973,10 @@ class acf_field_repeater extends acf_field {
|
|||
|
||||
}
|
||||
|
||||
new acf_field_repeater();
|
||||
|
||||
endif;
|
||||
// initialize
|
||||
acf_register_field_type( new acf_field_repeater() );
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
|
|
|
|||
38
readme.txt
38
readme.txt
|
|
@ -2,7 +2,7 @@
|
|||
Contributors: elliotcondon
|
||||
Tags: acf, advanced, custom, field, fields, custom field, custom fields, simple fields, magic fields, more fields, repeater, edit
|
||||
Requires at least: 3.6.0
|
||||
Tested up to: 4.5.2
|
||||
Tested up to: 4.6.0
|
||||
License: GPLv2 or later
|
||||
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
|
|
@ -106,6 +106,42 @@ http://support.advancedcustomfields.com/
|
|||
|
||||
== Changelog ==
|
||||
|
||||
= 5.4.4 =
|
||||
* WYSIWYG field: Fixed JS error when 'Disable the visual editor when writing' is checked
|
||||
|
||||
= 5.4.3 =
|
||||
* WYSIWYG field: Fixed JS bug (since WP 4.6) causing conflicts with editor plugins
|
||||
* Google Maps field: Fixed JS error conflict with Divi theme
|
||||
* Radio field: Fixed bug (Chrome only) ignoring default values in cloned sub fields
|
||||
* Core: Fixed `wp_get_sites()` deprecated error (since WP 4.6) shown in network admin
|
||||
|
||||
= 5.4.2 =
|
||||
* API: Fixed bug preventing post_title and post_content values saving in `acf_form()`
|
||||
|
||||
= 5.4.1 =
|
||||
* API: Fixed bug causing `get_fields('options')` to return false
|
||||
* Core: Fixed bug causing `get_current_screen()` to throw PHP error
|
||||
* Core: Fixed bug causing 'Preview Post' to load empty field values
|
||||
|
||||
= 5.4.0 =
|
||||
* Clone field: Added new field type (https://www.advancedcustomfields.com/resources/clone/)
|
||||
* Gallery field: Removed 'Preview Size' setting and improved UI
|
||||
* Taxonomy field: Added compatibility to save/load terms to user object
|
||||
* Select field: Added new 'Return Format' setting
|
||||
* Radio field: Added new 'Return Format' setting
|
||||
* Checkbox field: Added new 'Return Format' setting
|
||||
* Page link field: Added new 'Allow Archives URLs' setting
|
||||
* Core: Fixed plugin update bug delaying updates
|
||||
* Core: Fixed bug when editing field settings in Chrome causing required setting to self toggle
|
||||
* Core: Improved speed and fixed bugs when creating and restoring revisions
|
||||
* Core: Minor fixes and improvements
|
||||
* Language: Updated Portuguese translation - thanks to Pedro Mendonca
|
||||
* Language: Updated Brazilian Portuguese translation - thanks to Augusto Simão
|
||||
* Language: Updated Dutch translation - thanks to Derk Oosterveld
|
||||
* Language: Updated Persian translation - thanks to Kamel
|
||||
* Language: Updated German translation - thanks to Ralf Koller
|
||||
* Language: Updated Swiss German translation - thanks to Raphael Hüni
|
||||
|
||||
= 5.3.10 =
|
||||
* Core: Added new 'google_api_key' and 'google_api_client' global settings
|
||||
* Google Map: Added new 'acf/fields/google_map/api' filter
|
||||
|
|
|
|||
Loading…
Reference in New Issue