280 lines
4.9 KiB
PHP
280 lines
4.9 KiB
PHP
<?php
|
|
|
|
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
|
|
|
if( ! class_exists('acf_json') ) :
|
|
|
|
class acf_json {
|
|
|
|
function __construct() {
|
|
|
|
// update setting
|
|
acf_update_setting('save_json', get_stylesheet_directory() . '/acf-json');
|
|
acf_append_setting('load_json', get_stylesheet_directory() . '/acf-json');
|
|
|
|
|
|
// actions
|
|
add_action('acf/update_field_group', array($this, 'update_field_group'), 10, 1);
|
|
add_action('acf/untrash_field_group', array($this, 'update_field_group'), 10, 1);
|
|
add_action('acf/trash_field_group', array($this, 'delete_field_group'), 10, 1);
|
|
add_action('acf/delete_field_group', array($this, 'delete_field_group'), 10, 1);
|
|
add_action('acf/include_fields', array($this, 'include_json_folders'), 10, 0);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* update_field_group
|
|
*
|
|
* This function is hooked into the acf/update_field_group action and will save all field group data to a .json file
|
|
*
|
|
* @type function
|
|
* @date 10/03/2014
|
|
* @since 5.0.0
|
|
*
|
|
* @param $field_group (array)
|
|
* @return n/a
|
|
*/
|
|
|
|
function update_field_group( $field_group ) {
|
|
|
|
// validate
|
|
if( !acf_get_setting('json') ) return;
|
|
|
|
|
|
// get fields
|
|
$field_group['fields'] = acf_get_fields( $field_group );
|
|
|
|
|
|
// save file
|
|
acf_write_json_field_group( $field_group );
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* delete_field_group
|
|
*
|
|
* This function will remove the field group .json file
|
|
*
|
|
* @type function
|
|
* @date 10/03/2014
|
|
* @since 5.0.0
|
|
*
|
|
* @param $field_group (array)
|
|
* @return n/a
|
|
*/
|
|
|
|
function delete_field_group( $field_group ) {
|
|
|
|
// validate
|
|
if( !acf_get_setting('json') ) return;
|
|
|
|
|
|
// WP appends '__trashed' to end of 'key' (post_name)
|
|
$field_group['key'] = str_replace('__trashed', '', $field_group['key']);
|
|
|
|
|
|
// delete
|
|
acf_delete_json_field_group( $field_group['key'] );
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* include_json_folders
|
|
*
|
|
* This function will include all registered .json files
|
|
*
|
|
* @type function
|
|
* @date 10/03/2014
|
|
* @since 5.0.0
|
|
*
|
|
* @param n/a
|
|
* @return n/a
|
|
*/
|
|
|
|
function include_json_folders() {
|
|
|
|
// validate
|
|
if( !acf_get_setting('json') ) return;
|
|
|
|
|
|
// vars
|
|
$paths = acf_get_setting('load_json');
|
|
|
|
|
|
// loop through and add to cache
|
|
foreach( $paths as $path ) {
|
|
|
|
$this->include_json_folder( $path );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* include_json_folder
|
|
*
|
|
* This function will include all .json files within a folder
|
|
*
|
|
* @type function
|
|
* @date 1/5/17
|
|
* @since 5.5.13
|
|
*
|
|
* @param n/a
|
|
* @return n/a
|
|
*/
|
|
|
|
function include_json_folder( $path = '' ) {
|
|
|
|
// remove trailing slash
|
|
$path = untrailingslashit( $path );
|
|
|
|
|
|
// bail early if path does not exist
|
|
if( !is_dir($path) ) return false;
|
|
|
|
|
|
// open
|
|
$dir = opendir( $path );
|
|
|
|
// bail early if not valid
|
|
if( !$dir ) return false;
|
|
|
|
// loop over files
|
|
while(false !== ( $file = readdir($dir)) ) {
|
|
|
|
// validate type
|
|
if( pathinfo($file, PATHINFO_EXTENSION) !== 'json' ) continue;
|
|
|
|
|
|
// read json
|
|
$json = file_get_contents("{$path}/{$file}");
|
|
|
|
|
|
// validate json
|
|
if( empty($json) ) continue;
|
|
|
|
|
|
// decode
|
|
$json = json_decode($json, true);
|
|
|
|
|
|
// add local
|
|
$json['local'] = 'json';
|
|
|
|
|
|
// add field group
|
|
acf_add_local_field_group( $json );
|
|
|
|
}
|
|
|
|
|
|
// return
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// initialize
|
|
acf()->json = new acf_json();
|
|
|
|
endif; // class_exists check
|
|
|
|
|
|
/*
|
|
* acf_write_json_field_group
|
|
*
|
|
* This function will save a field group to a json file within the current theme
|
|
*
|
|
* @type function
|
|
* @date 5/12/2014
|
|
* @since 5.1.5
|
|
*
|
|
* @param $field_group (array)
|
|
* @return (boolean)
|
|
*/
|
|
|
|
function acf_write_json_field_group( $field_group ) {
|
|
|
|
// vars
|
|
$path = acf_get_setting('save_json');
|
|
$file = $field_group['key'] . '.json';
|
|
|
|
|
|
// remove trailing slash
|
|
$path = untrailingslashit( $path );
|
|
|
|
|
|
// bail early if dir does not exist
|
|
if( !is_writable($path) ) return false;
|
|
|
|
|
|
// prepare for export
|
|
$id = acf_extract_var( $field_group, 'ID' );
|
|
$field_group = acf_prepare_field_group_for_export( $field_group );
|
|
|
|
|
|
// add modified time
|
|
$field_group['modified'] = get_post_modified_time('U', true, $id, true);
|
|
|
|
|
|
// write file
|
|
$f = fopen("{$path}/{$file}", 'w');
|
|
fwrite($f, acf_json_encode( $field_group ));
|
|
fclose($f);
|
|
|
|
|
|
// return
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* acf_delete_json_field_group
|
|
*
|
|
* This function will delete a json field group file
|
|
*
|
|
* @type function
|
|
* @date 5/12/2014
|
|
* @since 5.1.5
|
|
*
|
|
* @param $key (string)
|
|
* @return (boolean)
|
|
*/
|
|
|
|
function acf_delete_json_field_group( $key ) {
|
|
|
|
// vars
|
|
$path = acf_get_setting('save_json');
|
|
$file = $key . '.json';
|
|
|
|
|
|
// remove trailing slash
|
|
$path = untrailingslashit( $path );
|
|
|
|
|
|
// bail early if file does not exist
|
|
if( !is_readable("{$path}/{$file}") ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
// remove file
|
|
unlink("{$path}/{$file}");
|
|
|
|
|
|
// return
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
?>
|