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){ //vars $id = false; $type = false; $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 */ extract(acf_decode_post_id($post_id)); // validate ID if(!$id){ return false; } $data['id'] = $id; $data['type'] = $type; // post if($type === '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}"; } } // term }elseif($type === '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}"; } } // user }elseif($type === '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}"; } } } // option }elseif($type === '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}"; } // comment }elseif($type === 'comment'){ $comment = get_comment($id); if($comment && !is_wp_error($comment)){ $data['object'] = $comment; } // block }elseif($type === 'block'){ $block = acf_get_block_type("acf/$id"); if($block){ $data['object'] = $block; } // blog }elseif($type === 'blog'){ if(function_exists('get_blog_details')){ $blog = get_blog_details($id); if($blog){ $data['object'] = $blog; } } } return $data; } /** * load_field_groups * * acf/load_field_groups:100 * * @param $field_groups * * @return mixed */ function load_field_groups($field_groups){ // do not execute in ACF UI if(acfe_is_admin_screen()){ return $field_groups; } // loop foreach($field_groups as $i => &$field_group){ $field_group = apply_filters("acfe/prepare_field_group", $field_group); if(isset($field_group['ID'])){ $field_group = apply_filters("acfe/prepare_field_group/ID={$field_group['ID']}", $field_group); } if(isset($field_group['key'])){ $field_group = apply_filters("acfe/prepare_field_group/key={$field_group['key']}", $field_group); } // Do not render if false if($field_group === false){ unset($field_groups[$i]); } } 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; do_action("acfe/pre_render_field_group", $field_group, $fields, $post_id); do_action("acfe/pre_render_field_group/ID={$field_group['ID']}", $field_group, $fields, $post_id); do_action("acfe/pre_render_field_group/key={$field_group['key']}", $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; do_action("acfe/render_field_group", $field_group, $fields, $post_id); do_action("acfe/render_field_group/ID={$field_group['ID']}", $field_group, $fields, $post_id); do_action("acfe/render_field_group/key={$field_group['key']}", $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){ $wrapper = apply_filters("acfe/field_wrapper_attributes", $wrapper, $field); $wrapper = apply_filters("acfe/field_wrapper_attributes/type={$field['type']}", $wrapper, $field); $wrapper = apply_filters("acfe/field_wrapper_attributes/name={$field['name']}", $wrapper, $field); $wrapper = apply_filters("acfe/field_wrapper_attributes/key={$field['key']}", $wrapper, $field); return $wrapper; } /** * load_fields * * acf/load_fields * * @param $fields * @param $parent * * @return mixed|void */ function load_fields($fields, $parent){ // check if field (fitler is also called on field groups) if(!acf_maybe_get($parent, 'type')){ return $fields; } $fields = apply_filters("acfe/load_fields", $fields, $parent); $fields = apply_filters("acfe/load_fields/type={$parent['type']}", $fields, $parent); $fields = apply_filters("acfe/load_fields/name={$parent['name']}", $fields, $parent); $fields = apply_filters("acfe/load_fields/key={$parent['key']}", $fields, $parent); return $fields; } /** * load_field * * acf/load_field * * @param $field * * @return mixed */ function load_field($field){ // do not execute in ACF UI if(acfe_is_admin_screen()){ return $field; } // hooks $field = apply_filters("acfe/load_field", $field); $field = apply_filters("acfe/load_field/type={$field['type']}", $field); $field = apply_filters("acfe/load_field/name={$field['name']}", $field); $field = apply_filters("acfe/load_field/key={$field['key']}", $field); // 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; // filters $uploads = apply_filters("acfe/upload_dir", $uploads, $field); $uploads = apply_filters("acfe/upload_dir/type={$field['type']}", $uploads, $field); $uploads = apply_filters("acfe/upload_dir/name={$field['name']}", $uploads, $field); $uploads = apply_filters("acfe/upload_dir/key={$field['key']}", $uploads, $field); // return return $uploads; } /** * handle_upload_file * * wp_handle_upload_prefilter:20 * * @param $file * * @return mixed|void */ function handle_upload_file($file){ // vars $field = $this->upload_field; // filters $file = apply_filters("acfe/upload_file", $file, $field); $file = apply_filters("acfe/upload_file/type={$field['type']}", $file, $field); $file = apply_filters("acfe/upload_file/name={$field['name']}", $file, $field); $file = apply_filters("acfe/upload_file/key={$field['key']}", $file, $field); // return return $file; } } new acfe_hooks(); endif;