web/wp-content/plugins/acf-extended/includes/modules/autosync-php.php (162 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('ACFE_AutoSync_Php')):
class ACFE_AutoSync_Php{
// vars
private $php_files = array();
/**
* construct
*/
function __construct(){
// hooks
add_action('acf/update_field_group', array($this, 'update_field_group'));
add_action('acf/untrash_field_group', array($this, 'update_field_group'));
add_action('acf/trash_field_group', array($this, 'delete_field_group'));
add_action('acf/delete_field_group', array($this, 'delete_field_group'));
// setup
$this->setup_php();
}
/**
* is_php_enabled
*
* @return bool
*/
function is_php_enabled(){
return (bool) acf_get_setting('acfe/php');
}
/**
* setup_php
*/
function setup_php(){
if(!$this->is_php_enabled()){
return;
}
// vars
global $pagenow;
$files = $this->scan_php_folders();
// conditions
$acf_field_groups = $pagenow === 'edit.php' && acf_maybe_get_GET('post_type') === 'acf-field-group' && !acf_maybe_get_GET('page');
$acf_field_group = $pagenow === 'post.php' && get_post_type(acf_maybe_get_GET('post')) === 'acf-field-group';
// do not include php files in acf ui
if($acf_field_groups || $acf_field_group){
return;
}
// loop files and require
foreach($files as $key => $file){
require_once($file);
}
}
/**
* scan_php_folders
*
* @return array
*/
function scan_php_folders(){
$php_files = array();
$paths = (array) acf_get_setting('acfe/php_load');
foreach($paths as $path){
// normalize folder
$path = untrailingslashit($path);
if(!is_dir($path)){
continue;
}
// update setting
acf_update_setting('acfe/php_found', true);
// normalize files
$files = glob($path . '/group_*.php');
if(!$files){
continue;
}
// loop files
foreach($files as $file){
// extract key
$key = pathinfo($file, PATHINFO_FILENAME);
// append data
$php_files[ $key ] = $file;
}
}
// store data and return
$this->php_files = $php_files;
// return
return $php_files;
}
/**
* get_php_files
*
* @return array
*/
public function get_php_files(){
return $this->php_files;
}
/**
* update_field_group
*
* @param $field_group
*/
function update_field_group($field_group){
// save file
if(acfe_has_php_sync($field_group)){
$this->save_file($field_group);
// delete file
}else{
$this->delete_file($field_group);
}
}
/**
* delete_field_group
*
* @param $field_group
*/
function delete_field_group($field_group){
// wp appends '__trashed' to end of 'key' (post_name)
$field_group['key'] = str_replace('__trashed', '', $field_group['key']);
$this->delete_file($field_group);
}
/**
* save_file
*
* @param $field_group
*
* @return bool
*/
function save_file($field_group){
// bail early
if(!$this->is_php_enabled()){
return false;
}
// vars
$path = $this->get_php_save_path($field_group);
$file = untrailingslashit($path) . '/' . $field_group['key'] . '.php';
// validate path
if(!is_writable($path)){
return false;
}
// translation
$l10n = acf_get_setting('l10n');
$l10n_textdomain = acf_get_setting('l10n_textdomain');
if(!$l10n || !$l10n_textdomain){
$field_group['fields'] = acf_get_fields($field_group);
}else{
acf_update_setting('l10n_var_export', true);
$field_group = acf_translate_field_group($field_group);
// reset store to allow fields translation
$store = acf_get_store('fields');
$store->reset();
$field_group['fields'] = acf_get_fields($field_group);
acf_update_setting('l10n_var_export', false);
// reset store again to avoid storing translated fields
// this fix an issue with acfml 2.0.2 which update fields as "!!__(!!'My Field!!', !!'my-textdomain!!')!!" in ACF UI
$store->reset();
}
// 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);
// prepare
$str_replace = array(
" " => "\t",
"'!!__(!!\'" => "__('",
"!!\', !!\'" => "', '",
"!!\')!!'" => "')",
"array (" => "array("
);
$preg_replace = array(
'/([\t\r\n]+?)array/' => 'array',
'/[0-9]+ => array/' => 'array'
);
ob_start();
echo "<?php " . "\r\n" . "\r\n";
echo "if( function_exists('acf_add_local_field_group') ):" . "\r\n" . "\r\n";
// code
$code = var_export($field_group, true);
// change double spaces to tabs
$code = str_replace( array_keys($str_replace), array_values($str_replace), $code );
// correctly formats "=> array("
$code = preg_replace( array_keys($preg_replace), array_values($preg_replace), $code );
// echo
echo "acf_add_local_field_group({$code});" . "\r\n" . "\r\n";
echo "endif;";
$output = ob_get_clean();
// save and return true if bytes were written.
$result = file_put_contents($file, $output);
// return
return is_int($result);
}
/**
* delete_file
*
* @param $field_group
*
* @return void
*/
function delete_file($field_group){
// validate
if(!$this->is_php_enabled()){
return;
}
// filters
$delete = true;
$delete = apply_filters("acfe/settings/should_delete_php", $delete, $field_group);
$delete = apply_filters("acfe/settings/should_delete_php/ID={$field_group['ID']}", $delete, $field_group);
$delete = apply_filters("acfe/settings/should_delete_php/key={$field_group['key']}", $delete, $field_group);
// do not delete
if(!$delete){
return;
}
// vars
$path = $this->get_php_save_path($field_group);
$file = untrailingslashit($path) . '/' . $field_group['key'] . '.php';
// delete
if(is_readable($file)){
unlink($file);
}
}
/**
* get_php_save_path
*
* @param $field_group
*
* @return mixed|null
*/
function get_php_save_path($field_group){
// default
$path = untrailingslashit(acf_get_setting('acfe/php_save'));
// filters
$path = apply_filters("acfe/settings/php_save/all", $path, $field_group);
$path = apply_filters("acfe/settings/php_save/ID={$field_group['ID']}", $path, $field_group);
$path = apply_filters("acfe/settings/php_save/key={$field_group['key']}", $path, $field_group);
return $path;
}
}
acf_new_instance('ACFE_AutoSync_Php');
endif;
/**
* acfe_get_local_php_files
*
* @return mixed
*/
function acfe_get_local_php_files(){
return acf_get_instance('ACFE_AutoSync_Php')->get_php_files();
}
/**
* acfe_has_php_sync
*
* @param $item
*
* @return bool
*/
function acfe_has_php_sync($item){
return in_array('php', (array) acf_maybe_get($item, 'acfe_autosync', array()));
}
/**
* acfe_get_local_php_file
*
* @param $field_group
*
* @return false|mixed
*/
function acfe_get_local_php_file($field_group){
$key = $field_group;
if(is_array($field_group) && isset($field_group['key'])){
$key = $field_group['key'];
}
$php_files = acfe_get_local_php_files();
if(isset($php_files[ $key ])){
return $php_files[ $key ];
}
return false;
}
/**
* acfe_get_php_save_path
*
* @param $field_group
*
* @return mixed
*/
function acfe_get_php_save_path($field_group){
return acf_get_instance('ACFE_AutoSync_Php')->get_php_save_path($field_group);
}