web/wp-content/plugins/acf-extended/includes/modules/dev/module-dev.php (404 lines of code) (raw):
<?php
if(!defined('ABSPATH')){
exit;
}
if(!class_exists('acfe_dev')):
class acfe_dev{
var $wp_meta = array(),
$acf_meta = array(),
$type = '';
function __construct(){
// check settings
if((!acfe_is_dev() && !acfe_is_super_dev()) || !acf_current_user_can_admin()){
return;
}
// enqueue
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
// load
add_action('acfe/load_post', array($this, 'load_post'));
// add meta boxes
add_action('acfe/add_post_meta_boxes', array($this, 'add_post_meta_boxes'), 10, 2);
add_action('acfe/add_posts_meta_boxes', array($this, 'add_posts_meta_boxes'));
add_action('acfe/add_term_meta_boxes', array($this, 'add_term_meta_boxes'), 10, 2);
add_action('acfe/add_terms_meta_boxes', array($this, 'add_terms_meta_boxes'));
add_action('acfe/add_user_meta_boxes', array($this, 'add_user_meta_boxes'));
add_action('acfe/add_option_meta_boxes', array($this, 'add_option_meta_boxes'));
add_action('acfe/add_settings_meta_boxes', array($this, 'add_settings_meta_boxes'));
add_action('acfe/add_attachment_meta_boxes', array($this, 'add_attachment_meta_boxes'));
add_action('acfe/add_attachments_meta_boxes', array($this, 'add_attachments_meta_boxes'));
add_action('acfe/add_users_meta_boxes', array($this, 'add_users_meta_boxes'));
// table render
add_filter('acfe/dev/meta/columns', array($this, 'meta_columns'), 10, 3);
add_action('acfe/dev/meta/render_column', array($this, 'meta_render_column'), 10, 4);
}
/**
* admin_enqueue_scripts
*/
function admin_enqueue_scripts(){
// enqueue acf on network screen
if(acf_is_screen(array('profile-network', 'user-edit-network', 'user-network'))){
acf_enqueue_scripts();
}
}
/**
* load_post
*
* acfe/load_post
*/
function load_post(){
// force remove wp post meta metabox
remove_meta_box('postcustom', false, 'normal');
}
/**
* add_post_meta_boxes
*
* acfe/add_post_meta_boxes
*
* @param $post_type
* @param $post
*/
function add_post_meta_boxes($post_type, $post){
// check restricted post types
if(acfe_is_post_type_reserved_dev($post_type)){
return;
}
// post id
$post_id = $post->ID;
// add meta boxes
$this->add_meta_boxes($post_id, $post_type);
// action
do_action('acfe/dev/add_meta_boxes', $post_id, $post_type, 'post');
}
/**
* add_posts_meta_boxes
*
* acfe/add_posts_meta_boxes
*
* @param $post_type
*/
function add_posts_meta_boxes($post_type){
// post id
$post_id = "{$post_type}_options";
// add meta boxes
$this->add_meta_boxes($post_id, 'edit');
// action
do_action('acfe/dev/add_meta_boxes', $post_id, 'edit', 'posts');
}
/**
* add_term_meta_boxes
*
* acfe/add_term_meta_boxes
*
* @param $taxonomy
* @param $term
*/
function add_term_meta_boxes($taxonomy, $term){
// post id
$post_id = "term_{$term->term_id}";
// add meta boxes
$this->add_meta_boxes($post_id, "edit-{$taxonomy}");
// action
do_action('acfe/dev/add_meta_boxes', $post_id, "edit-{$taxonomy}", 'term');
}
/**
* add_terms_meta_boxes
*
* acfe/add_terms_meta_boxes
*
* @param $taxonomy
*/
function add_terms_meta_boxes($taxonomy){
// post id
$post_id = "tax_{$taxonomy}_options";
// add meta boxes
$this->add_meta_boxes($post_id, 'edit');
// action
do_action('acfe/dev/add_meta_boxes', $post_id, 'edit', 'terms');
}
/**
* add_user_meta_boxes
*
* acfe/add_user_meta_boxes
*
* @param $user
*/
function add_user_meta_boxes($user){
// post id
$post_id = "user_{$user->ID}";
// add meta boxes
$this->add_meta_boxes($post_id, array('profile', 'user-edit'));
// action
do_action('acfe/dev/add_meta_boxes', $post_id, array('profile', 'user-edit'), 'user');
}
/**
* add_option_meta_boxes
*
* acfe/add_option_meta_boxes
*
* @param $page
*/
function add_option_meta_boxes($page){
// post id
$post_id = $page['post_id'];
// add meta boxes
$this->add_meta_boxes($post_id, 'acf_options_page');
// action
do_action('acfe/dev/add_meta_boxes', $post_id, 'acf_options_page', 'option');
}
/**
* add_settings_meta_boxes
*
* acfe/add_settings_meta_boxes
*
* @param $page
*/
function add_settings_meta_boxes($page){
// post id
$post_id = $page;
// add meta boxes
$this->add_meta_boxes($post_id, $page);
do_action('acfe/dev/add_meta_boxes', $post_id, $page, 'settings');
}
/**
* add_attachment_meta_boxes
*
* acfe/add_attachment_meta_boxes
*
* @param $post
*/
function add_attachment_meta_boxes($post){
// vars
$post_id = $post->ID;
$post_type = $post->post_type;
// add meta boxes
$this->add_meta_boxes($post_id, $post_type);
do_action('acfe/dev/add_meta_boxes', $post_id, $post_type, 'attachment');
}
/**
* add_attachments_meta_boxes
*
* acfe/add_attachments_meta_boxes
*/
function add_attachments_meta_boxes(){
// post id
$post_id = "attachment_options";
// add meta boxes
$this->add_meta_boxes($post_id, 'edit');
do_action('acfe/dev/add_meta_boxes', $post_id, 'edit', 'attachments');
}
/**
* add_users_meta_boxes
*
* acfe/add_users_meta_boxes
*/
function add_users_meta_boxes(){
// post id
$post_id = "user_options";
// add meta boxes
$this->add_meta_boxes($post_id, 'edit');
do_action('acfe/dev/add_meta_boxes', $post_id, 'edit', 'users');
}
/**
* add_meta_boxes
*
* @param $post_id
* @param $screen
*/
function add_meta_boxes($post_id, $screen){
// setup meta
$this->setup_meta($post_id);
// do action
// do_action('acfe/dev/add_meta_boxes', $post_id, $screen);
// vars
$bulk = false;
$context = 'normal';
$priority = 'low';
// wp meta
if(!empty($this->wp_meta)){
// display metabox on object lists screen
acf_set_filters(array(
'acfe/post_type_list' => true,
'acfe/taxonomy_list' => true,
'acfe/user_list' => true,
'acfe/attachment_list' => true,
));
if(empty($this->acf_meta)){
$bulk = true;
}
// vars
$id = 'acfe-wp-custom-fields';
$title = $this->type === 'option' ? __('WP Options Meta', 'acfe') : __('WP Custom Fields', 'acfe');
$title .= '<span class="acfe-dev-meta-count">' . count($this->wp_meta) . '</span>';
add_meta_box($id, $title, array($this, 'render_meta_box'), $screen, $context, $priority, array('table' => 'wp_meta', 'type' => $this->type, 'bulk' => $bulk));
}
// acf meta
if(!empty($this->acf_meta)){
// display metabox on object lists screen
acf_set_filters(array(
'acfe/post_type_list' => true,
'acfe/taxonomy_list' => true,
'acfe/user_list' => true,
'acfe/attachment_list' => true,
));
if(!$bulk){
$bulk = true;
}
$id = 'acfe-acf-custom-fields';
$title = $this->type === 'option' ? __('ACF Options Meta', 'acfe') : __('ACF Custom Fields', 'acfe');
$title .= '<span class="acfe-dev-meta-count">' . count($this->acf_meta) . '</span>';
add_meta_box($id, $title, array($this, 'render_meta_box'), $screen, $context, $priority, array('table' => 'acf_meta', 'type' => $this->type, 'bulk' => $bulk));
}
}
/**
* render_meta_box
*
* @param $post
* @param $metabox
*/
function render_meta_box($post, $metabox){
//vars
$args = $metabox['args'];
$columns = apply_filters('acfe/dev/meta/columns', array(), $args);
?>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<?php foreach($columns as $column_name => $column_label): ?>
<?php
$el = $column_name === 'checkbox' ? 'td' : 'th';
$class = $column_name === 'checkbox' ? 'check-column' : "col-{$column_name}";
echo "<{$el} scope='col' class='{$class}'>{$column_label}</{$el}>";
?>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach($this->{$args['table']} as $meta): ?>
<tr>
<?php foreach($columns as $column_name => $column_label): ?>
<?php
$el = $column_name === 'checkbox' ? 'th' : 'td';
$attrs = $column_name === 'checkbox' ? array('scope' => 'row', 'class' => 'check-column') : array('class' => "col-{$column_name}");
echo "<{$el} " . acf_esc_atts($attrs) . ">";
do_action('acfe/dev/meta/render_column', $column_name, $meta, $args);
echo "</{$el}>";
?>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php do_action('acfe/dev/meta/after_table', $args); ?>
<script type="text/javascript">
if(typeof acf !== 'undefined'){
acf.newPostbox(<?php echo json_encode(array('id' => $metabox['id'])); ?>);
}
</script>
<?php
}
/**
* meta_columns
*
* acfe/dev/meta/columns
*
* @param $columns
* @param $args
*
* @return array|string[]
*/
function meta_columns($columns, $args){
$columns = array(
'name' => __('Name', 'acfe'),
'value' => __('Value', 'acfe'),
);
if(current_user_can(acf_get_setting('capability'))){
$columns = array_merge(array('checkbox' => '<input type="checkbox" />'), $columns);
}
if($args['table'] === 'acf_meta'){
$columns['field-type'] = __('Field Type', 'acf');
$columns['field-group'] = __('Field Group', 'acf');
}
if($args['type'] === 'option'){
$columns['autoload'] = __('Autoload', 'acfe');
}
return $columns;
}
/**
* meta_render_column
*
* acfe/dev/meta/render_column
*
* @param $column_name
* @param $meta
* @param $args
*/
function meta_render_column($column_name, $meta, $args){
switch($column_name){
case 'checkbox': {
?>
<input type="checkbox" class="acfe-dev-bulk-checkbox" value="<?php echo $meta['id']; ?>" />
<?php
break;
}
case 'name': {
?>
<strong><?php echo esc_attr($meta['key']); ?></strong>
<?php
$row_actions = apply_filters('acfe/dev/meta/row_actions', array(), $meta, $args);
if($row_actions){
echo '<div class="row-actions">';
echo implode(' | ', array_map(function($action_name, $action){
return "<span class='{$action_name}'>{$action}</span>";
}, array_keys($row_actions), $row_actions));
echo '</div>';
}
break;
}
case 'value': {
echo $this->render_meta_value($meta['value']);
break;
}
case 'field-type': {
echo acf_maybe_get($meta, 'field_type');
break;
}
case 'field-group': {
echo acf_maybe_get($meta, 'field_group');
break;
}
case 'autoload': {
echo $meta['autoload'];
break;
}
}
}
/**
* render_meta_value
*
* @param $value
*
* @return string
*/
function render_meta_value($value){
// raw
$raw = map_deep($value, '_wp_specialchars');
// string (default)
$return = '<pre>' . print_r($raw, true) . '</pre>';
// empty value
if(acf_is_empty($value)){
$return = '<pre style="color:#aaa;">(' . __('empty', 'acf') . ')</pre>';
// serialized value
}elseif(is_serialized($value)){
$value = maybe_unserialize($value);
if(is_object($value) && is_a($value, '__PHP_Incomplete_Class')){
// do nothing
}else{
$value = @map_deep($value, '_wp_specialchars');
}
$return = '<pre>' . print_r($value, true) . '</pre>';
$return .= '<pre class="raw">' . print_r($raw, true) . '</pre>';
// html value
}elseif(acfe_is_html($value)){
$return = '<pre>' . print_r($raw, true) . '</pre>';
// json value
}elseif(acfe_is_json($value)){
$value = json_decode($value);
$value = @map_deep($value, '_wp_specialchars');
$return = '<pre>' . print_r($value, true) . '</pre>';
$return .= '<pre class="raw">' . print_r($raw, true) . '</pre>';
}
// return
return $return;
}
/**
* setup_meta
*
* @param $post_id
*/
function setup_meta($post_id = 0){
// validate
$post_id = acf_get_valid_post_id($post_id);
// bail early
if(empty($post_id)){
return;
}
// extract decoded post_id
// $id
// $type
extract(acf_decode_post_id($post_id));
// set global type
$this->type = $type;
// get meta
$all_meta = $this->get_meta($id, $type);
$wp_meta = $this->sort_meta($all_meta, $type);
// bail early
if(empty($wp_meta)){
return;
}
// vars
$acf_meta = array();
// loop to prepare acf_meta
foreach($wp_meta as $key => $meta){
$ref = false;
$ref_found = false;
// no prefix, so not acf meta
if(isset($wp_meta["_$key"])){
$ref = $wp_meta["_$key"];
$ref_found = true;
}
// filters
$ref = apply_filters('acfe/dev/meta_ref', $ref, $wp_meta, $type, $key, $id, $post_id);
if(!$ref){
continue;
}
// check if key is field_abcde123456
if(!acf_is_field_key($ref['value'])){
continue;
}
// vars
$field_key = $ref['value'];
$field_type = '<em>' . __('Undefined', 'acfe') . '</em>';
$field_group_title = '<em>' . __('Undefined', 'acfe') . '</em>';
// get field
$field = acf_get_field($field_key);
// check clone in sub field: field_123456abcdef_field_123456abcfed
if(!$field && substr_count($field_key, 'field_') > 1){
// get field key (last key)
$_field_key = substr($field_key, strrpos($field_key, 'field_'));
// get field
$field = acf_get_field($_field_key);
}
// found field
if($field){
// Field type
$field_type = acf_get_field_type($field['type']);
$field_type = acfe_maybe_get($field_type, 'label', '<em>Undefined</em>');
// Field Group
$field_group = acfe_get_field_group_from_field($field);
if($field_group){
$field_group_title = $field_group['title'];
// no id setting, try to get raw field group from db
if(!$field_group['ID']){
$field_group = acf_get_raw_field_group($field_group['key']);
}
// found db field group
if($field_group && $field_group['ID']){
$post_status = get_post_status($field_group['ID']);
if($post_status === 'publish' || $post_status === 'acf-disabled'){
$field_group_title = '<a href="' . admin_url('post.php?post=' . $field_group['ID'] . '&action=edit') . '">' . $field_group['title'] . '</a>';
}
}
}
}
// assign acf meta: prefix
if($ref_found){
unset($wp_meta["_$key"]);
$_meta = $ref;
$_meta['field_type'] = $field_type;
$_meta['field_group'] = $field_group_title;
$acf_meta[] = $_meta;
}
// assign acf meta: normal
$_meta = $wp_meta[ $key ];
$_meta['field_type'] = $field_type;
$_meta['field_group'] = $field_group_title;
$acf_meta[] = $_meta;
// unset wp meta
unset($wp_meta[ $key ]);
}
// assign global
$this->wp_meta = $wp_meta;
$this->acf_meta = $acf_meta;
}
/**
* get_meta
*
* @param $id
* @param $type
*
* @return array|object|stdClass|null
*/
function get_meta($id, $type){
global $wpdb;
$all_meta = null;
switch($type){
case 'post': {
$all_meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->postmeta} WHERE `post_id` = %d ", $id));
break;
}
case 'term': {
$all_meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->termmeta} WHERE `term_id` = %d ", $id));
break;
}
case 'user': {
$all_meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->usermeta} WHERE `user_id` = %d ", $id));
break;
}
case 'option': {
$search_ = $wpdb->esc_like("{$id}_") . '%';
$_search_ = $wpdb->esc_like("_{$id}_") . '%';
$all_meta = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$wpdb->options} WHERE `option_name` LIKE %s OR `option_name` LIKE %s OR `option_name` = %s", $search_, $_search_, $id));
break;
}
}
return $all_meta;
}
/**
* sort_meta
*
* @param $all_meta
* @param $type
*
* @return array|false
*/
function sort_meta($all_meta, $type){
if(empty($all_meta)){
return false;
}
$wp_meta = array();
// re-order
switch($type){
case 'post':
case 'term': {
usort($all_meta, function($a, $b){
return strcmp($a->meta_key, $b->meta_key);
});
foreach($all_meta as $meta){
$wp_meta[ $meta->meta_key ] = array(
'id' => $meta->meta_id,
'key' => $meta->meta_key,
'value' => $meta->meta_value,
'type' => $type,
);
}
break;
}
case 'user': {
usort($all_meta, function($a, $b){
return strcmp($a->meta_key, $b->meta_key);
});
foreach($all_meta as $meta){
$wp_meta[ $meta->meta_key ] = array(
'id' => $meta->umeta_id,
'key' => $meta->meta_key,
'value' => $meta->meta_value,
'type' => $type,
);
}
break;
}
case 'option': {
usort($all_meta, function($a, $b){
return strcmp($a->option_name, $b->option_name);
});
foreach($all_meta as $meta){
$wp_meta[$meta->option_name] = array(
'id' => $meta->option_id,
'key' => $meta->option_name,
'value' => $meta->option_value,
'autoload' => $meta->autoload,
'type' => $type,
);
}
break;
}
}
return $wp_meta;
}
}
acf_new_instance('acfe_dev');
endif;
/**
* acfe_dev_get_wp_meta
*
* @return mixed
*/
function acfe_dev_get_wp_meta(){
return acf_get_instance('acfe_dev')->wp_meta;
}
/**
* acfe_dev_get_acf_meta
*
* @return mixed
*/
function acfe_dev_get_acf_meta(){
return acf_get_instance('acfe_dev')->acf_meta;
}
/**
* acfe_dev_count_meta
*
* @return int
*/
function acfe_dev_count_meta(){
return count(acfe_dev_get_wp_meta()) + count(acfe_dev_get_acf_meta());
}