web/wp-content/plugins/acf-extended/includes/hooks.php (317 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('acfe_hooks')): class acfe_hooks{ public $field_group; public $upload_field = false; /** * construct */ function __construct(){ // save/validate hooks add_action('acf/save_post', array($this, 'pre_save_post'), 9); add_action('acf/save_post', array($this, 'save_post'), 15); add_action('acf/validate_save_post', array($this, 'validate_save_post'), 4); // must be 4 as acf process acf/validate_value on 5 // field groups add_filter('acf/load_field_groups', array($this, 'load_field_groups'), 100); add_filter('acf/pre_render_fields', array($this, 'pre_render_fields'), 10, 2); add_action('acf/render_fields', array($this, 'render_fields'), 10, 2); // fields add_filter('acf/field_wrapper_attributes', array($this, 'field_wrapper_attributes'), 10, 2); add_filter('acf/load_fields', array($this, 'load_fields'), 10, 2); add_filter('acf/load_field', array($this, 'load_field')); // form data add_filter('acf/location/screen', array($this, 'acf_location_screen'), 99); add_action('acf/input/form_data', array($this, 'acf_form_data')); add_action('acf/validate_save_post', array($this, 'acf_save_post_form_data'), 0); add_action('acf/save_post', array($this, 'acf_save_post_form_data'), 0); // upload add_filter('acf/upload_prefilter', array($this, 'attachment_upload'), 10, 3); // hooks variations acf_add_filter_variations('acfe/prepare_field_group', array('ID', 'key'), 0); acf_add_action_variations('acfe/pre_render_field_group', array('ID', 'key'), 0); acf_add_action_variations('acfe/render_field_group', array('ID', 'key'), 0); acf_add_filter_variations('acf/field_wrapper_attributes', array('type', 'name', 'key'), 1); acf_add_filter_variations('acfe/field_wrapper_attributes', array('type', 'name', 'key'), 1); acf_add_filter_variations('acfe/load_fields', array('type', 'name', 'key'), 1); acf_add_filter_variations('acfe/load_field', array('type', 'name', 'key'), 0); acf_add_filter_variations('acfe/upload_dir', array('type', 'name', 'key'), 1); acf_add_filter_variations('acfe/upload_file', array('type', 'name', 'key'), 1); } /** * pre_save_post * * acf/save_post:9 * * @param $post_id */ function pre_save_post($post_id = 0){ $this->do_save_post($post_id, true); } /** * save_post * * acf/save_post:15 * * @param $post_id */ function save_post($post_id = 0){ $this->do_save_post($post_id); } /** * do_save_post * * @param $post_id * @param $pre */ function do_save_post($post_id = 0, $pre = false){ // validate acf if(!acf_maybe_get_POST('acf')){ return; } // check data $data = $this->decode_object($post_id); if(!$data){ return; } // vars $id = $data['id']; $type = $data['type']; $object = $data['object']; $hooks = $data['hooks']; $suffix = $pre ? 'pre_' : false; // all hooks $all_hooks = array(); $all_hooks[] = "acfe/{$suffix}save"; $all_hooks[] = "acfe/{$suffix}save/id={$post_id}"; $all_hooks[] = "acfe/{$suffix}save_{$type}"; foreach($hooks as $hook){ $all_hooks[] = "acfe/{$suffix}save_{$type}/{$hook}"; } $all_hooks[] = "acfe/{$suffix}save_{$type}/id={$post_id}"; // check if hooked $do_action = false; foreach($all_hooks as $all_hook){ if(has_action($all_hook)){ $do_action = true; break; } } // bail early if(!$do_action){ return; } // setup meta acfe_setup_meta($_POST['acf'], 'acfe/save', true); foreach($all_hooks as $all_hook){ do_action($all_hook, $post_id, $object); } // reset meta acfe_reset_meta(); } /** * validate_save_post * * acf/validate_save_post:4 */ function validate_save_post(){ // vars $rows = array(); // acf $acf = acf_maybe_get_POST('acf'); if(!empty($acf)){ $post_id = acf_maybe_get_POST('_acf_post_id'); if($post_id){ $rows[ $post_id ] = $acf; } } // menu items $menu_items = acf_maybe_get_POST('menu-item-acf'); if(!empty($menu_items)){ foreach($menu_items as $post_id => $fields){ $rows[ $post_id ] = $fields; } } // loop rows foreach($rows as $post_id => $acf){ // check data $data = $this->decode_object($post_id); if(!$data){ continue; } // vars $id = $data['id']; $type = $data['type']; $object = $data['object']; $hooks = $data['hooks']; // all hooks $all_hooks = array(); $all_hooks[] = "acfe/validate_save"; $all_hooks[] = "acfe/validate_save/id={$post_id}"; $all_hooks[] = "acfe/validate_save_{$type}"; foreach($hooks as $hook){ $all_hooks[] = "acfe/validate_save_{$type}/{$hook}"; } $all_hooks[] = "acfe/validate_save_{$type}/id={$post_id}"; // check if hooked $do_action = false; foreach($all_hooks as $all_hook){ if(has_action($all_hook)){ $do_action = true; break; } } // bail early if(!$do_action){ continue; } // setup meta acfe_setup_meta($acf, 'acfe/validate_save', true); foreach($all_hooks as $all_hook){ do_action($all_hook, $post_id, $object); } // reset meta acfe_reset_meta(); } } /** * decode_object * * @param $post_id * * @return array|false */ function decode_object($post_id){ //data $data = array( 'id' => false, 'type' => false, 'object' => false, 'hooks' => array(), ); /** * @string $post_id 12 | term_46 | user_22 | my-option | comment_89 | widget_56 | menu_74 | menu_item_96 | block_my-block | blog_55 | site_36 | attachment_24 * @string $id 12 | 46 | 22 | my-option | 89 | widget_56 | 74 | 96 | block_my-block | 55 | 36 | 24 * @string $type post | term | user | option | comment | option | term | post | block | blog | blog | post */ /** * @var $type * @var $id */ extract(acf_decode_post_id($post_id)); // validate id if(!$id){ return false; } // assign default $data['id'] = $id; $data['type'] = $type; switch($type){ // post case 'post': { $post = get_post($id); if($post && !is_wp_error($post)){ $data['object'] = $post; if(isset($post->post_type) && post_type_exists($post->post_type)){ $data['hooks'][] = "post_type={$post->post_type}"; } } break; } // term case 'term': { $term = get_term($id); if($term && !is_wp_error($term)){ $data['object'] = $term; if(isset($term->taxonomy) && taxonomy_exists($term->taxonomy)){ $data['hooks'][] = "taxonomy={$term->taxonomy}"; } } break; } // user case 'user': { $user = get_user_by('id', $id); if($user && !is_wp_error($user)){ $data['object'] = $user; if(isset($user->roles) && !empty($user->roles)){ foreach($user->roles as $role){ $data['hooks'][] = "role={$role}"; } } } break; } // option case 'option': { $location = acf_get_form_data('location'); $options_page = acf_maybe_get($location, 'options_page'); if($options_page){ $data['object'] = acf_get_options_page($options_page); $data['hooks'][] = "slug={$options_page}"; } break; } // comment case 'comment': { $comment = get_comment($id); if($comment && !is_wp_error($comment)){ $data['object'] = $comment; } break; } // block case 'block': { $block = acf_get_block_type("acf/$id"); if($block){ $data['object'] = $block; } break; } // blog case 'blog': { if(function_exists('get_blog_details')){ $blog = get_blog_details($id); if($blog){ $data['object'] = $blog; } } break; } } // return return $data; } /** * load_field_groups * * acf/load_field_groups:100 * * @param $field_groups * * @return mixed */ function load_field_groups($field_groups){ // bail early if(acfe_is_admin_screen()){ return $field_groups; } // loop foreach(array_keys($field_groups) as $i){ // get field group $field_group = $field_groups[ $i ]; // apply filters $field_group = apply_filters('acfe/prepare_field_group', $field_group); // hide field group if($field_group === false){ unset($field_groups[ $i ]); // assign }else{ $field_groups[ $i ] = $field_group; } } return $field_groups; } /** * pre_render_fields * * acf/pre_render_fields * * @param $fields * @param $post_id * * @return mixed */ function pre_render_fields($fields, $post_id){ $this->field_group = array(); if(!isset($fields[0])){ return $fields; } if(!acf_maybe_get($fields[0], 'parent')){ return $fields; } $field_group = acf_get_field_group($fields[0]['parent']); if(!$field_group){ return $fields; } $this->field_group = $field_group; // action do_action('acfe/pre_render_field_group', $field_group, $fields, $post_id); return $fields; } /** * render_fields * * acf/render_fields * * @param $fields * @param $post_id */ function render_fields($fields, $post_id){ if(empty($this->field_group)){ return; } $field_group = $this->field_group; // action do_action('acfe/render_field_group', $field_group, $fields, $post_id); } /** * field_wrapper_attributes * * acf/field_wrapper_attributes * * @param $wrapper * @param $field * * @return mixed|void */ function field_wrapper_attributes($wrapper, $field){ return apply_filters('acfe/field_wrapper_attributes', $wrapper, $field); } /** * load_fields * * acf/load_fields * * @param $fields * @param $parent * * @return mixed|void */ function load_fields($fields, $parent){ // validate field // this fitler is also applied on field groups if(!isset($parent['type'])){ return $fields; } $fields = apply_filters('acfe/load_fields', $fields, $parent); return $fields; } /** * load_field * * acf/load_field * * @param $field * * @return mixed */ function load_field($field){ // bail early if(acfe_is_admin_screen()){ return $field; } // hooks $field = apply_filters('acfe/load_field', $field); // todo: find a solution to add filter variations with deprecated notice // deprecated: admin if(acfe_is_admin()){ $field = apply_filters_deprecated("acfe/load_field_admin", array($field), '0.8.8', "acfe/load_field"); $field = apply_filters_deprecated("acfe/load_field_admin/type={$field['type']}", array($field), '0.8.8', "acfe/load_field/type={$field['type']}"); $field = apply_filters_deprecated("acfe/load_field_admin/name={$field['name']}", array($field), '0.8.8', "acfe/load_field/name={$field['name']}"); $field = apply_filters_deprecated("acfe/load_field_admin/key={$field['key']}", array($field), '0.8.8', "acfe/load_field/key={$field['key']}"); // deprecated: front }else{ $field = apply_filters_deprecated("acfe/load_field_front", array($field), '0.8.8', "acfe/load_field"); $field = apply_filters_deprecated("acfe/load_field_front/type={$field['type']}", array($field), '0.8.8', "acfe/load_field/type={$field['type']}"); $field = apply_filters_deprecated("acfe/load_field_front/name={$field['name']}", array($field), '0.8.8', "acfe/load_field/name={$field['name']}"); $field = apply_filters_deprecated("acfe/load_field_front/key={$field['key']}", array($field), '0.8.8', "acfe/load_field/key={$field['key']}"); } return $field; } /** * acf_location_screen * * acf/location/screen:99 * * @param $screen * * @return mixed */ function acf_location_screen($screen){ // clone var $_screen = $screen; acf_extract_vars($_screen, array('lang', 'ajax')); // set form data for later use in acf_form_data() acf_set_form_data('location', $_screen); return $screen; } /** * acf_form_data * * acf/input/form_data */ function acf_form_data(){ // retrieve location from screen filter $location = acf_get_form_data('location'); // generate hidden input if($location){ foreach($location as $name => $value){ // generate hidden input acf_hidden_input(array( 'id' => "_acf_location[$name]", 'name' => "_acf_location[$name]", 'value' => $value )); } } } /** * acf_save_post_form_data * * acf/validate_save_post:0 * acf/save_post:0 */ function acf_save_post_form_data(){ // vars $screen = acf_maybe_get_POST('_acf_screen', 'post'); $post_id = acf_maybe_get_POST('_acf_post_id', 0); $location = acf_maybe_get_POST('_acf_location', array()); // set form data acf_set_form_data(array( 'screen' => $screen, 'post_id' => $post_id, 'location' => $location, )); } /** * attachment_upload * * acf/upload_prefilter * * @param $errors * @param $file * @param $field * * @return mixed */ function attachment_upload($errors, $file, $field){ // vars $this->upload_field = $field; // filters add_filter('upload_dir', array($this, 'handle_upload_dir'), 20); add_filter('wp_handle_upload_prefilter', array($this, 'handle_upload_file'), 20); // return return $errors; } /** * handle_upload_dir * * upload_dir:20 * * @param $uploads * * @return mixed|void */ function handle_upload_dir($uploads){ // vars $field = $this->upload_field; // return return apply_filters('acfe/upload_dir', $uploads, $field); } /** * handle_upload_file * * wp_handle_upload_prefilter:20 * * @param $file * * @return mixed|void */ function handle_upload_file($file){ // vars $field = $this->upload_field; // return return apply_filters('acfe/upload_file', $file, $field); } } new acfe_hooks(); endif;