web/wp-content/plugins/acf-extended/includes/modules/autosync-json.php (254 lines of code) (raw):

<?php if(!defined('ABSPATH')){ exit; } if(!class_exists('ACFE_AutoSync_Json')): class ACFE_AutoSync_Json{ // vars private $json_files = array(); public $old_path = false; /** * construct */ function __construct(){ // hooks add_action('acf/update_field_group', array($this, 'pre_update_field_group'), 9); add_action('acf/untrash_field_group', array($this, 'pre_update_field_group'), 9); add_action('acf/update_field_group', array($this, 'post_update_field_group'), 11); add_action('acf/untrash_field_group', array($this, 'post_update_field_group'), 11); add_action('acf/trash_field_group', array($this, 'pre_delete_field_group'), 9); add_action('acf/delete_field_group', array($this, 'pre_delete_field_group'), 9); add_action('acf/trash_field_group', array($this, 'post_delete_field_group'), 11); add_action('acf/delete_field_group', array($this, 'post_delete_field_group'), 11); // override settings add_filter('acf/settings/json', array($this, 'override_json'), 5); add_filter('acf/settings/save_json', array($this, 'override_json_save'), 5); add_filter('acf/settings/load_json', array($this, 'override_json_load'), 5); // setup $this->setup_json(); } /** * override_json * * @param $value * * @return bool */ function override_json($value){ // not very elegant, but it allows // acf_update_setting('json', false) to work mid-page request if($value === false){ return false; } return (bool) acf_get_setting('acfe/json', $value); } /** * override_json_save * * @param $path * * @return mixed|null */ function override_json_save($path){ return apply_filters('acfe/settings/json_save', $path); } /** * override_json_load * * @param $paths * * @return array */ function override_json_load($paths){ return (array) apply_filters('acfe/settings/json_load', $paths); } /** * is_json_enabled * * @return bool */ function is_json_enabled(){ return (bool) acf_get_setting('acfe/json'); } /** * setup_json */ function setup_json(){ if($this->is_json_enabled()){ $this->scan_json_folders(); } } /** * scan_json_folders */ function scan_json_folders(){ // normalize paths $paths = (array) acf_get_setting('load_json'); // loop paths foreach($paths as $path){ // update setting if(is_dir($path)){ acf_update_setting('acfe/json_found', true); break; } } // acf < 5.9 compatibility if(acf_version_compare(acf_get_setting('version'), '<', '5.9')){ $this->scan_json_folders_compatibility(); } } /** * scan_json_folders_compatibility * * ACF < 5.9 compatibility * * @return array */ function scan_json_folders_compatibility(){ $json_files = array(); // get paths $paths = (array) acf_get_setting('load_json'); foreach($paths as $path){ // validate folder if(!is_dir($path)){ continue; } // validate files $files = scandir($path); if(!$files){ continue; } // loop files foreach($files as $filename){ // ignore hidden files if($filename[0] === '.'){ continue; } // ignore sub directories $file = untrailingslashit( $path ) . '/' . $filename; if(is_dir($file)){ continue; } // ignore non json files $ext = pathinfo($filename, PATHINFO_EXTENSION); if($ext !== 'json'){ continue; } // read json data $json = json_decode(file_get_contents($file), true); if(!is_array($json) || !isset($json['key'])){ continue; } // append data $json_files[ $json['key'] ] = $file; } } // store data and return $this->json_files = $json_files; // return return $json_files; } /** * get_json_files * * @return array */ function get_json_files(){ return $this->json_files; } /** * pre_update_field_group * * @param $field_group */ function pre_update_field_group($field_group){ $this->old_path = false; // json enabled if(!$this->is_json_enabled()){ return; } // save file if(acfe_has_json_sync($field_group)){ $old_path = untrailingslashit(acf_get_setting('save_json')); $new_path = $this->get_json_save_path($field_group); $this->old_path = $old_path; // set setting for native acf/update_field_group:10 acf_update_setting('save_json', $new_path); // delete file }else{ // delete file $this->delete_file($field_group); // do not save json file add_filter('acf/settings/json', array($this, '__return_false')); } } /** * post_update_field_group * * @param $field_group */ function post_update_field_group($field_group){ // json enabled if(!$this->is_json_enabled()){ return; } // save file if(acfe_has_json_sync($field_group)){ // set setting back to native acf_update_setting('save_json', $this->old_path); // reset old path $this->old_path = false; // delete file }else{ // reset json setting remove_filter('acf/settings/json', array($this, '__return_false')); } } /** * pre_delete_field_group * * @param $field_group * * @return void */ function pre_delete_field_group($field_group){ $this->old_path = false; // json enabled if(!$this->is_json_enabled()){ return; } // wp appends '__trashed' to end of 'key' (post_name) $field_group['key'] = str_replace('__trashed', '', $field_group['key']); // filters $delete = true; $delete = apply_filters("acfe/settings/should_delete_json", $delete, $field_group); $delete = apply_filters("acfe/settings/should_delete_json/ID={$field_group['ID']}", $delete, $field_group); $delete = apply_filters("acfe/settings/should_delete_json/key={$field_group['key']}", $delete, $field_group); // do not delete json file if(!$delete){ return add_filter('acf/settings/json', array($this, '__return_false')); } $old_path = untrailingslashit(acf_get_setting('save_json')); $new_path = $this->get_json_save_path($field_group); $this->old_path = $old_path; // set setting for native acf/update_field_group:10 acf_update_setting('save_json', $new_path); } /** * post_delete_field_group * * @param $field_group * * @return void */ function post_delete_field_group($field_group){ // json enabled if(!$this->is_json_enabled()){ return; } // reset json setting remove_filter('acf/settings/json', array($this, '__return_false')); if(!empty($this->old_path)){ // set setting back to native acf_update_setting('save_json', $this->old_path); // reset old path $this->old_path = false; } } /** * delete_file * * @param $field_group * * @return void */ function delete_file($field_group){ // validate if(!$this->is_json_enabled()){ return; } // filters $delete = true; $delete = apply_filters("acfe/settings/should_delete_json", $delete, $field_group); $delete = apply_filters("acfe/settings/should_delete_json/ID={$field_group['ID']}", $delete, $field_group); $delete = apply_filters("acfe/settings/should_delete_json/key={$field_group['key']}", $delete, $field_group); if(!$delete){ return; } // vars $path = $this->get_json_save_path($field_group); $filename = $this->get_filename($field_group); if(!$filename){ return; } $file = untrailingslashit($path) . '/' . $filename; // delete if(is_readable($file)){ unlink($file); } } /** * get_filename * * @param $field_group * * @return false|string */ function get_filename($field_group){ $version = acf_get_setting('version'); // acf 6.2 compatibility if(acf_version_compare($version, '>=', '6.2') && acf_version_compare($version, '<', '6.3')){ $instance = acf_get_instance('ACF_Local_JSON'); if(method_exists($instance, 'get_files')){ $load_path = ''; $files = $instance->get_files(); if(is_array($files) && isset($files[ $field_group['key'] ])){ $load_path = $files[ $field_group['key'] ]; } $filename = apply_filters('acf/json/save_file_name', $field_group['key'] . '.json', $field_group, $load_path); if(!is_string($filename)){ return false; } $filename = sanitize_file_name($filename); // sanitize_file_name() can potentially remove all characters. if(empty($filename)){ return false; } return $filename; } // acf 6.3 compatibility }elseif(acf_version_compare($version, '>=', '6.3')){ $instance = acf_get_instance('ACF_Local_JSON'); if(method_exists($instance, 'get_filename')){ return $instance->get_filename($field_group['key'], $field_group); } } // default return $field_group['key'] . '.json'; } /** * __return_false * * @return false */ function __return_false(){ return false; } /** * get_json_save_path * * @param $field_group * * @return mixed|null */ function get_json_save_path($field_group){ // default $path = untrailingslashit(acf_get_setting('acfe/json_save')); // acf 6.2 compatibility // added save_json variations $path = acf_get_setting("save_json/type=acf-field-group", $path); $path = acf_get_setting("save_json/name={$field_group['title']}", $path); $path = acf_get_setting("save_json/key={$field_group['key']}", $path); // filters $path = apply_filters("acfe/settings/json_save/all", $path, $field_group); $path = apply_filters("acfe/settings/json_save/ID={$field_group['ID']}", $path, $field_group); $path = apply_filters("acfe/settings/json_save/key={$field_group['key']}", $path, $field_group); return $path; } } acf_new_instance('ACFE_AutoSync_Json'); endif; /** * acf_get_local_json_files * * @return mixed */ if(!function_exists('acf_get_local_json_files') && acf_version_compare(acf_get_setting('version'), '<', '5.9')){ function acf_get_local_json_files(){ return acf_get_instance('ACFE_AutoSync_Json')->get_json_files(); } } /** * acfe_is_sync_available * * @param $field_group * * @return bool */ function acfe_is_sync_available($field_group){ $key = acf_maybe_get($field_group, 'key'); $id = acf_maybe_get($field_group, 'ID'); // bail early if(empty($key) || empty($id)){ return false; } acf_enable_filter('local'); $field_group = acf_get_local_field_group($key); acf_disable_filter('local'); if(!$field_group){ return false; } $private = acf_maybe_get($field_group, 'private', false); $local = acf_maybe_get($field_group, 'local', false); $modified = acf_maybe_get($field_group, 'modified', 0); if($private || $local !== 'json'){ return false; } if($modified && $modified > get_post_modified_time('U', true, $id, true)){ return true; } return false; } /** * acfe_has_json_sync * * @param $item * * @return bool */ function acfe_has_json_sync($item){ return in_array('json', (array) acf_maybe_get($item, 'acfe_autosync', array())); } /** * acfe_get_local_json_file * * @param $field_group * * @return false */ function acfe_get_local_json_file($field_group){ $key = $field_group; if(is_array($field_group) && isset($field_group['key'])){ $key = $field_group['key']; } $json_files = acf_get_local_json_files(); if(isset($json_files[ $key ])){ return $json_files[ $key ]; } return false; } /** * acfe_get_json_save_path * * @param $field_group * * @return mixed */ function acfe_get_json_save_path($field_group){ return acf_get_instance('ACFE_AutoSync_Json')->get_json_save_path($field_group); }