From 69cbd9369ca360f7ee03c57e6cafd37973d71aa8 Mon Sep 17 00:00:00 2001 From: Elliot Condon Date: Thu, 15 Sep 2016 13:57:03 +0200 Subject: [PATCH] 5.4.5 --- acf.php | 4 +- admin/field-groups.php | 16 + api/api-field.php | 2 +- api/api-helpers.php | 83 +++- api/api-template.php | 977 ++++++++++++++++++++----------------- assets/css/acf-global.css | 13 +- assets/js/acf-input.js | 2 +- assets/js/acf-input.min.js | 2 +- core/revisions.php | 76 +-- core/validation.php | 68 ++- lang/acf.pot | 315 ++++++------ readme.txt | 9 + 12 files changed, 905 insertions(+), 662 deletions(-) diff --git a/acf.php b/acf.php index 3383e17..f439b0b 100644 --- a/acf.php +++ b/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.4.4 +Version: 5.4.5 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.4.4', + 'version' => '5.4.5', // urls 'basename' => plugin_basename( __FILE__ ), diff --git a/admin/field-groups.php b/admin/field-groups.php index 7b35b71..096ac1d 100644 --- a/admin/field-groups.php +++ b/admin/field-groups.php @@ -713,6 +713,22 @@ class acf_admin_field_groups { $('#the-list tr.no-items td').attr('colspan', 4); + // search + $('.subsubsub').append(' |
  • '); + + + // events + $(document).on('click', '.acf-toggle-search', function( e ){ + + // prevent default + e.preventDefault(); + + + // toggle + $('.search-box').slideToggle(); + + }); + })(jQuery); post_parent == $post_id) { + + $post_id = (int) $revision->ID; + + } + } @@ -4757,8 +4768,78 @@ function acf_send_ajax_results( $response ) { // return wp_send_json( $response ); -} +} + + +/* +* acf_is_sequential_array +* +* This function will return true if the array contains only numeric keys +* +* @source http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential +* @type function +* @date 9/09/2016 +* @since 5.4.0 +* +* @param $array (array) +* @return (boolean) +*/ + +function acf_is_sequential_array( $array ) { + + // bail ealry if not array + if( !is_array($array) ) return false; + + + // loop + foreach( $array as $key => $value ) { + // bail ealry if is string + if( is_string($key) ) return false; + + } + + + // return + return true; + +} + + +/* +* acf_is_associative_array +* +* This function will return true if the array contains one or more string keys +* +* @source http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential +* @type function +* @date 9/09/2016 +* @since 5.4.0 +* +* @param $array (array) +* @return (boolean) +*/ + +function acf_is_associative_array( $array ) { + + // bail ealry if not array + if( !is_array($array) ) return false; + + + // loop + foreach( $array as $key => $value ) { + + // bail ealry if is string + if( is_string($key) ) return true; + + } + + + // return + return false; + +} + add_filter("acf/settings/slug", '_acf_settings_slug'); diff --git a/api/api-template.php b/api/api-template.php index dbb7bcb..2dd4535 100644 --- a/api/api-template.php +++ b/api/api-template.php @@ -994,6 +994,538 @@ function acf_shortcode( $atts ) add_shortcode( 'acf', 'acf_shortcode' ); + +/* +* acf_template_form +* +* This class contains funcitonality for a template form to work +* +* @type function +* @date 7/09/2016 +* @since 5.4.0 +* +* @param $post_id (int) +* @return $post_id (int) +*/ + +if( ! class_exists('acf_template_form') ) : + +class acf_template_form { + + // vars + var $fields; + + + /* + * __construct + * + * This function will setup the class functionality + * + * @type function + * @date 5/03/2014 + * @since 5.0.0 + * + * @param n/a + * @return n/a + */ + + function __construct() { + + // vars + $this->fields = array( + + '_post_title' => array( + 'prefix' => 'acf', + 'name' => '_post_title', + 'key' => '_post_title', + 'label' => __('Title', 'acf'), + 'type' => 'text', + 'required' => true, + ), + + '_post_content' => array( + 'prefix' => 'acf', + 'name' => '_post_content', + 'key' => '_post_content', + 'label' => __('Content', 'acf'), + 'type' => 'wysiwyg', + ), + + '_validate_email' => array( + 'prefix' => 'acf', + 'name' => '_validate_email', + 'key' => '_validate_email', + 'label' => __('Validate Email', 'acf'), + 'type' => 'text', + 'value' => '', + 'wrapper' => array('style' => 'display:none !important;') + ) + + ); + + + // actions + add_action('acf/validate_save_post', array($this, 'validate_save_post'), 1); + + + // filters + add_filter('acf/pre_save_post', array($this, 'pre_save_post'), 5, 2); + + } + + + /* + * validate_save_post + * + * This function will validate fields from the above array + * + * @type function + * @date 7/09/2016 + * @since 5.4.0 + * + * @param $post_id (int) + * @return $post_id (int) + */ + + function validate_save_post() { + + // register field if isset in $_POST + foreach( $this->fields as $k => $field ) { + + // bail early if no in $_POST + if( !isset($_POST['acf'][ $k ]) ) continue; + + + // register + acf_add_local_field($field); + + } + + + // honeypot + if( !empty($_POST['acf']['_validate_email']) ) { + + acf_add_validation_error( '', __('Spam Detected', 'acf') ); + + } + + } + + + /* + * pre_save_post + * + * description + * + * @type function + * @date 7/09/2016 + * @since 5.4.0 + * + * @param $post_id (int) + * @return $post_id (int) + */ + + function pre_save_post( $post_id, $form ) { + + // vars + $save = array( + 'ID' => 0 + ); + + + // determine save data + if( is_numeric($post_id) ) { + + // update post + $save['ID'] = $post_id; + + } elseif( $post_id == 'new_post' ) { + + // new post + $form['new_post'] = wp_parse_args( $form['new_post'], array( + 'post_type' => 'post', + 'post_status' => 'draft', + )); + + + // merge in new post data + $save = array_merge($save, $form['new_post']); + + } else { + + // not post + return $post_id; + + } + + + // save post_title + if( isset($_POST['acf']['_post_title']) ) { + + $save['post_title'] = acf_extract_var($_POST['acf'], '_post_title'); + + } + + + // save post_content + if( isset($_POST['acf']['_post_content']) ) { + + $save['post_content'] = acf_extract_var($_POST['acf'], '_post_content'); + + } + + + // honeypot + if( !empty($_POST['acf']['_validate_email']) ) return; + + + // validate + if( count($save) == 1 ) { + + return $post_id; + + } + + + if( $save['ID'] ) { + + wp_update_post( $save ); + + } else { + + $post_id = wp_insert_post( $save ); + + } + + + // return + return $post_id; + + } + + + /* + * enqueue + * + * This function will enqueue a form + * + * @type function + * @date 7/09/2016 + * @since 5.4.0 + * + * @param $post_id (int) + * @return $post_id (int) + */ + + function enqueue_form() { + + // verify nonce + if( acf_verify_nonce('acf_form') ) { + + // validate data + if( acf_validate_save_post(true) ) { + + // form + $GLOBALS['acf_form'] = acf_extract_var($_POST, '_acf_form'); + $GLOBALS['acf_form'] = @json_decode(base64_decode($GLOBALS['acf_form']), true); + + + // validate + if( empty($GLOBALS['acf_form']) ) return; + + + // vars + $post_id = acf_maybe_get( $GLOBALS['acf_form'], 'post_id', 0 ); + + + // allow for custom save + $post_id = apply_filters('acf/pre_save_post', $post_id, $GLOBALS['acf_form']); + + + // save + acf_save_post( $post_id ); + + + // vars + $return = acf_maybe_get( $GLOBALS['acf_form'], 'return', '' ); + + + // redirect + if( $return ) { + + // update %placeholders% + $return = str_replace('%post_url%', get_permalink($post_id), $return); + + + // redirect + wp_redirect( $return ); + exit; + } + + } + // if + + } + // if + + + // load acf scripts + acf_enqueue_scripts(); + + } + + + /* + * render + * + * description + * + * @type function + * @date 7/09/2016 + * @since 5.4.0 + * + * @param $post_id (int) + * @return $post_id (int) + */ + + function render_form( $args = array() ) { + + // vars + $url = acf_get_current_url(); + + + // defaults + $args = wp_parse_args( $args, array( + 'id' => 'acf-form', + 'post_id' => false, + 'new_post' => false, + 'field_groups' => false, + 'fields' => false, + 'post_title' => false, + 'post_content' => false, + 'form' => true, + 'form_attributes' => array(), + 'return' => add_query_arg( 'updated', 'true', $url ), + 'html_before_fields' => '', + 'html_after_fields' => '', + 'submit_value' => __("Update", 'acf'), + 'updated_message' => __("Post updated", 'acf'), + 'label_placement' => 'top', + 'instruction_placement' => 'label', + 'field_el' => 'div', + 'uploader' => 'wp', + 'honeypot' => true + )); + + $args['form_attributes'] = wp_parse_args( $args['form_attributes'], array( + 'id' => 'post', + 'class' => '', + 'action' => '', + 'method' => 'post', + )); + + + // filter post_id + $args['post_id'] = acf_get_valid_post_id( $args['post_id'] ); + + + // load values from this post + $post_id = $args['post_id']; + + + // new post? + if( $post_id == 'new_post' ) { + + // dont load values + $post_id = false; + + + // new post defaults + $args['new_post'] = wp_parse_args( $args['new_post'], array( + 'post_type' => 'post', + 'post_status' => 'draft', + )); + + } + + + // attributes + $args['form_attributes']['class'] .= ' acf-form'; + + + // register local fields + foreach( $this->fields as $k => $field ) { + + acf_add_local_field($field); + + } + + + // vars + $field_groups = array(); + $fields = array(); + + + // post_title + if( $args['post_title'] ) { + + // 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; + + } + + + // post_content + if( $args['post_content'] ) { + + // 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; + + } + + + // specific fields + if( $args['fields'] ) { + + foreach( $args['fields'] as $selector ) { + + // append field ($strict = false to allow for better compatibility with field names) + $fields[] = acf_maybe_get_field( $selector, $post_id, false ); + + } + + } elseif( $args['field_groups'] ) { + + foreach( $args['field_groups'] as $selector ) { + + $field_groups[] = acf_get_field_group( $selector ); + + } + + } elseif( $args['post_id'] == 'new_post' ) { + + $field_groups = acf_get_field_groups( $args['new_post'] ); + + } else { + + $field_groups = acf_get_field_groups(array( + 'post_id' => $args['post_id'] + )); + + } + + + //load fields based on field groups + if( !empty($field_groups) ) { + + foreach( $field_groups as $field_group ) { + + $field_group_fields = acf_get_fields( $field_group ); + + if( !empty($field_group_fields) ) { + + foreach( array_keys($field_group_fields) as $i ) { + + $fields[] = acf_extract_var($field_group_fields, $i); + } + + } + + } + + } + + + // honeypot + if( $args['honeypot'] ) { + + $fields[] = acf_get_field('_validate_email'); + + } + + + // updated message + if( !empty($_GET['updated']) && $args['updated_message'] ) { + + echo '

    ' . $args['updated_message'] . '

    '; + + } + + + // uploader (always set incase of multiple forms on the page) + acf_update_setting('uploader', $args['uploader']); + + + // display form + if( $args['form'] ): ?> + +
    > + + $args['post_id'], + 'nonce' => 'acf_form' + )); + + ?> + +
    + '_acf_form', 'value' => base64_encode(json_encode($args)) )); ?> +
    + +
    + +
    + + + +
    + + + + +
    + +
    + template_form = new acf_template_form(); + +endif; // class_exists check + + /* * acf_form_head() * @@ -1009,231 +1541,7 @@ 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', '_acf_form_validate_save_post'); - add_filter('acf/pre_save_post', '_acf_form_pre_save_post', 5, 2); - - - // validate data - if( acf_validate_save_post(true) ) { - - // form - $GLOBALS['acf_form'] = acf_extract_var($_POST, '_acf_form'); - $GLOBALS['acf_form'] = @json_decode(base64_decode($GLOBALS['acf_form']), true); - - - // validate - if( empty($GLOBALS['acf_form']) ) return; - - - // vars - $post_id = acf_maybe_get( $GLOBALS['acf_form'], 'post_id', 0 ); - - - // allow for custom save - $post_id = apply_filters('acf/pre_save_post', $post_id, $GLOBALS['acf_form']); - - - // save - acf_save_post( $post_id ); - - - // vars - $return = acf_maybe_get( $GLOBALS['acf_form'], 'return', '' ); - - - // redirect - if( $return ) { - - // update %placeholders% - $return = str_replace('%post_url%', get_permalink($post_id), $return); - - - // redirect - wp_redirect( $return ); - exit; - } - - } - // if - - } - // if - - - // load acf scripts - acf_enqueue_scripts(); - -} - - -/* -* _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 -* -* This function will perfrom extra validation for acf_form -* -* @type function -* @date 16/06/2014 -* @since 5.0.0 -* -* @param $post_id (int) -* @return $post_id (int) -*/ - -function _acf_form_validate_save_post() { - - // honeypot - if( !empty($_POST['acf']['_validate_email']) ) { - - acf_add_validation_error( '', __('Spam Detected', 'acf') ); - - } - -} - - -/* -* _acf_form_pre_save_post -* -* This filter will save post data for the acf_form function -* -* @type filter -* @date 17/01/2014 -* @since 5.0.0 -* -* @param $post_id (int) -* @return $post_id (int) -*/ - -function _acf_form_pre_save_post( $post_id, $form ) { - - // vars - $save = array( - 'ID' => 0 - ); - - - // determine save data - if( is_numeric($post_id) ) { - - // update post - $save['ID'] = $post_id; - - } elseif( $post_id == 'new_post' ) { - - // new post - $form['new_post'] = wp_parse_args( $form['new_post'], array( - 'post_type' => 'post', - 'post_status' => 'draft', - )); - - - // merge in new post data - $save = array_merge($save, $form['new_post']); - - } else { - - // not post - return $post_id; - - } - - - // save post_title - if( isset($_POST['acf']['_post_title']) ) { - - $save['post_title'] = acf_extract_var($_POST['acf'], '_post_title'); - - } - - - // save post_content - if( isset($_POST['acf']['_post_content']) ) { - - $save['post_content'] = acf_extract_var($_POST['acf'], '_post_content'); - - } - - - // honeypot - if( !empty($_POST['acf']['_validate_email']) ) return; - - - // validate - if( count($save) == 1 ) { - - return $post_id; - - } - - - if( $save['ID'] ) { - - wp_update_post( $save ); - - } else { - - $post_id = wp_insert_post( $save ); - - } - - - // return - return $post_id; + acf()->template_form->enqueue_form(); } @@ -1264,223 +1572,8 @@ function _acf_form_pre_save_post( $post_id, $form ) { function acf_form( $args = array() ) { - // vars - $url = acf_get_current_url(); + acf()->template_form->render_form($args); - - // defaults - $args = wp_parse_args( $args, array( - 'id' => 'acf-form', - 'post_id' => false, - 'new_post' => false, - 'field_groups' => false, - 'fields' => false, - 'post_title' => false, - 'post_content' => false, - 'form' => true, - 'form_attributes' => array(), - 'return' => add_query_arg( 'updated', 'true', $url ), - 'html_before_fields' => '', - 'html_after_fields' => '', - 'submit_value' => __("Update", 'acf'), - 'updated_message' => __("Post updated", 'acf'), - 'label_placement' => 'top', - 'instruction_placement' => 'label', - 'field_el' => 'div', - 'uploader' => 'wp', - 'honeypot' => true - )); - - $args['form_attributes'] = wp_parse_args( $args['form_attributes'], array( - 'id' => 'post', - 'class' => '', - 'action' => '', - 'method' => 'post', - )); - - - // filter post_id - $args['post_id'] = acf_get_valid_post_id( $args['post_id'] ); - - - // load values from this post - $post_id = $args['post_id']; - - - // new post? - if( $post_id == 'new_post' ) { - - // dont load values - $post_id = false; - - - // new post defaults - $args['new_post'] = wp_parse_args( $args['new_post'], array( - 'post_type' => 'post', - 'post_status' => 'draft', - )); - - } - - - // attributes - $args['form_attributes']['class'] .= ' acf-form'; - - - // vars - $field_groups = array(); - $fields = array(); - - - // post_title - if( $args['post_title'] ) { - - // 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; - - } - - - // post_content - if( $args['post_content'] ) { - - // 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; - - } - - - // specific fields - if( $args['fields'] ) { - - foreach( $args['fields'] as $selector ) { - - // append field ($strict = false to allow for better compatibility with field names) - $fields[] = acf_maybe_get_field( $selector, $post_id, false ); - - } - - } elseif( $args['field_groups'] ) { - - foreach( $args['field_groups'] as $selector ) { - - $field_groups[] = acf_get_field_group( $selector ); - - } - - } elseif( $args['post_id'] == 'new_post' ) { - - $field_groups = acf_get_field_groups( $args['new_post'] ); - - } else { - - $field_groups = acf_get_field_groups(array( - 'post_id' => $args['post_id'] - )); - - } - - - //load fields based on field groups - if( !empty($field_groups) ) { - - foreach( $field_groups as $field_group ) { - - $field_group_fields = acf_get_fields( $field_group ); - - if( !empty($field_group_fields) ) { - - foreach( array_keys($field_group_fields) as $i ) { - - $fields[] = acf_extract_var($field_group_fields, $i); - } - - } - - } - - } - - - // honeypot - if( $args['honeypot'] ) { - - $fields[] = acf_get_field('_validate_email'); - - } - - - // updated message - if( !empty($_GET['updated']) && $args['updated_message'] ) { - - echo '

    ' . $args['updated_message'] . '

    '; - - } - - - // uploader (always set incase of multiple forms on the page) - acf_update_setting('uploader', $args['uploader']); - - - // display form - if( $args['form'] ): ?> - -
    > - - $args['post_id'], - 'nonce' => 'acf_form' - )); - - ?> -
    - '_acf_form', 'value' => base64_encode(json_encode($args)) )); ?> -
    -
    - - - -
    - - - -
    - - - - -
    - - -
    - ').html( string ).text(); + return $('