File "admin-field-groups.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/advanced-custom-fields/includes/admin/admin-field-groups.php
File
size: 21.16 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
if (!defined('ABSPATH')) {
exit;
}
if (!class_exists('ACF_Admin_Field_Groups')) {
class ACF_Admin_Field_Groups
{
public $sync = array();
public $view = '';
public function __construct()
{
add_action('load-edit.php', array($this, 'handle_redirection'));
add_action('current_screen', array($this, 'current_screen'));
add_action('trashed_post', array($this, 'trashed_post'));
add_action('untrashed_post', array($this, 'untrashed_post'));
add_action('deleted_post', array($this, 'deleted_post'));
}
public function get_admin_url($params = '')
{
return admin_url("edit.php?post_type=acf-field-group{$params}");
}
public function get_current_admin_url($params = '')
{
return $this->get_admin_url(($this->view ? '&post_status=' . $this->view : '') . $params);
}
public function handle_redirection()
{
if (isset($_GET['post_type']) && $_GET['post_type'] === 'acf') {
wp_redirect($this->get_admin_url());
exit;
}
}
public function current_screen()
{
if (!acf_is_screen('edit-acf-field-group')) {
return;
}
$this->view = isset($_GET['post_status']) ? sanitize_text_field($_GET['post_status']) : '';
$this->setup_sync();
$this->check_sync();
$this->check_duplicate();
global $wp_post_statuses;
$wp_post_statuses['publish']->label_count = _n_noop('Active <span class="count">(%s)</span>', 'Active <span class="count">(%s)</span>', 'acf');
$wp_post_statuses['trash'] = acf_extract_var($wp_post_statuses, 'trash');
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'));
add_action('admin_body_class', array($this, 'admin_body_class'));
add_filter('views_edit-acf-field-group', array($this, 'admin_table_views'), 10, 1);
add_filter('manage_acf-field-group_posts_columns', array($this, 'admin_table_columns'), 10, 1);
add_action('manage_acf-field-group_posts_custom_column', array($this, 'admin_table_columns_html'), 10, 2);
add_filter('display_post_states', array($this, 'display_post_states'), 10, 2);
add_filter('bulk_actions-edit-acf-field-group', array($this, 'admin_table_bulk_actions'), 10, 1);
add_action('admin_footer', array($this, 'admin_footer'), 1);
if ($this->view !== 'trash') {
add_filter('page_row_actions', array($this, 'page_row_actions'), 10, 2);
}
if ($this->view === 'sync') {
add_action('admin_footer', array($this, 'admin_footer__sync'), 1);
}
}
public function setup_sync()
{
if (acf_get_local_json_files()) {
$all_field_groups = acf_get_field_groups();
foreach ($all_field_groups as $field_group) {
$local = acf_maybe_get($field_group, 'local');
$modified = acf_maybe_get($field_group, 'modified');
$private = acf_maybe_get($field_group, 'private');
if ($private) {
continue;
} elseif ($local !== 'json') {
continue;
} elseif (!$field_group['ID']) {
$this->sync[$field_group['key']] = $field_group;
} elseif ($modified && $modified > get_post_modified_time('U', true, $field_group['ID'])) {
$this->sync[$field_group['key']] = $field_group;
}
}
}
}
public function admin_enqueue_scripts()
{
acf_enqueue_script('acf');
acf_localize_text(array('Review local JSON changes' => __('Review local JSON changes', 'acf'), 'Loading diff' => __('Loading diff', 'acf'), 'Sync changes' => __('Sync changes', 'acf')));
}
public function admin_body_class($classes)
{
$classes .= ' acf-admin-field-groups';
if ($this->view) {
$classes .= " view-{$this->view}";
}
return $classes;
}
public function get_disabled_post_state()
{
return '<span class="dashicons dashicons-hidden"></span> ' . _x('Disabled', 'post status', 'acf');
}
public function display_post_states($post_states, $post)
{
if ($post->post_status === 'acf-disabled') {
$post_states['acf-disabled'] = $this->get_disabled_post_state();
}
return $post_states;
}
public function admin_table_columns($_columns)
{
$columns = array('cb' => $_columns['cb'], 'title' => $_columns['title'], 'acf-description' => __('Description', 'acf'), 'acf-key' => __('Key', 'acf'), 'acf-location' => __('Location', 'acf'), 'acf-count' => __('Fields', 'acf'));
if (acf_get_local_json_files()) {
$columns['acf-json'] = __('Local JSON', 'acf');
}
return $columns;
}
public function admin_table_columns_html($column_name, $post_id)
{
$field_group = acf_get_field_group($post_id);
if ($field_group) {
$this->render_admin_table_column($column_name, $field_group);
}
}
public function render_admin_table_column($column_name, $field_group)
{
switch ($column_name) {
case 'acf-key':
echo esc_html($field_group['key']);
break;
case 'acf-description':
if ($field_group['description']) {
echo '<span class="acf-description">' . acf_esc_html($field_group['description']) . '</span>';
}
break;
case 'acf-location':
$this->render_admin_table_column_locations($field_group);
break;
case 'acf-count':
echo esc_html(acf_get_field_count($field_group));
break;
case 'acf-json':
$this->render_admin_table_column_local_status($field_group);
break;
}
}
public function render_admin_table_column_locations($field_group)
{
$objects = array();
if ($field_group['location']) {
foreach ($field_group['location'] as $i => $rules) {
foreach ($rules as $j => $rule) {
$location = acf_get_location_rule($rule['param']);
$location_object_type = '';
$location_object_subtype = '';
if ($location) {
$location_object_type = $location->get_object_type($rule);
$location_object_subtype = $location->get_object_subtype($rule);
}
$rules[$j]['object_type'] = $location_object_type;
$rules[$j]['object_subtype'] = $location_object_subtype;
}
$object_types = array_column($rules, 'object_type');
$object_types = array_filter($object_types);
$object_types = array_values($object_types);
if ($object_types) {
$object_type = $object_types[0];
} else {
continue;
}
$object_subtypes = array_column($rules, 'object_subtype');
$object_subtypes = array_filter($object_subtypes);
$object_subtypes = array_values($object_subtypes);
$object_subtypes = array_map('acf_array', $object_subtypes);
if (count($object_subtypes) > 1) {
$object_subtypes = call_user_func_array('array_intersect', $object_subtypes);
$object_subtypes = array_values($object_subtypes);
} elseif ($object_subtypes) {
$object_subtypes = $object_subtypes[0];
} else {
$object_subtypes = array('');
}
foreach ($object_subtypes as $object_subtype) {
$object = acf_get_object_type($object_type, $object_subtype);
if ($object) {
$objects[$object->name] = $object;
}
}
}
}
$objects = array_values($objects);
$html = '';
if ($objects) {
$limit = 3;
$total = count($objects);
$html .= '<span class="dashicons ' . $objects[0]->icon . ($total > 1 ? ' acf-multi-dashicon' : '') . '"></span> ';
$labels = array_column($objects, 'label');
$labels = array_slice($labels, 0, 3);
$html .= implode(', ', $labels);
if ($total > $limit) {
$html .= ', ...';
}
} else {
$html = '<span class="dashicons dashicons-businesswoman"></span> ' . __('Various', 'acf');
}
echo acf_esc_html($html);
}
public function get_human_readable_file_location($file)
{
$theme_path = get_stylesheet_directory();
if (strpos($file, $theme_path) !== false) {
$rel_file = str_replace($theme_path, '', $file);
$located = sprintf(__('Located in theme: %s', 'acf'), $rel_file);
} elseif (strpos($file, WP_PLUGIN_DIR) !== false) {
$rel_file = str_replace(WP_PLUGIN_DIR, '', $file);
$located = sprintf(__('Located in plugin: %s', 'acf'), $rel_file);
} else {
$rel_file = str_replace(ABSPATH, '', $file);
$located = sprintf(__('Located in: %s', 'acf'), $rel_file);
}
return $located;
}
public function render_admin_table_column_local_status($field_group)
{
$json = acf_get_local_json_files();
if (isset($json[$field_group['key']])) {
$file = $json[$field_group['key']];
if (isset($this->sync[$field_group['key']])) {
$url = $this->get_admin_url('&acfsync=' . $field_group['key'] . '&_wpnonce=' . wp_create_nonce('bulk-posts'));
echo '<strong>' . __('Sync available', 'acf') . '</strong>';
if ($field_group['ID']) {
echo '<div class="row-actions">
<span class="sync"><a href="' . esc_url($url) . '">' . __('Sync', 'acf') . '</a> | </span>
<span class="review"><a href="#" data-event="review-sync" data-id="' . esc_attr($field_group['ID']) . '" data-href="' . esc_url($url) . '">' . __('Review changes', 'acf') . '</a></span>
</div>';
} else {
echo '<div class="row-actions">
<span class="sync"><a href="' . esc_url($url) . '">' . __('Import', 'acf') . '</a></span>
</div>';
}
} else {
echo __('Saved', 'acf');
}
} else {
echo '<span class="acf-secondary-text">' . __('Awaiting save', 'acf') . '</span>';
}
}
public function page_row_actions($actions, $post)
{
unset($actions['inline'], $actions['inline hide-if-no-js']);
$duplicate_action_url = $this->get_admin_url('&acfduplicate=' . $post->ID . '&_wpnonce=' . wp_create_nonce('bulk-posts'));
$actions['acfduplicate'] = '<a href="' . esc_url($duplicate_action_url) . '" aria-label="' . esc_attr__('Duplicate this item', 'acf') . '">' . __('Duplicate', 'acf') . '</a>';
$order = array('edit', 'acfduplicate', 'trash');
return array_merge(array_flip($order), $actions);
}
public function admin_table_bulk_actions($actions)
{
if ($this->view !== 'sync') {
$actions['acfduplicate'] = __('Duplicate', 'acf');
}
if ($this->sync) {
if ($this->view === 'sync') {
$actions = array();
}
$actions['acfsync'] = __('Sync changes', 'acf');
}
return $actions;
}
public function check_duplicate()
{
if (isset($_GET['acfduplicatecomplete'])) {
$ids = array_map('intval', explode(',', $_GET['acfduplicatecomplete']));
$text = sprintf(_n('Field group duplicated.', '%s field groups duplicated.', count($ids), 'acf'), count($ids));
$links = array();
foreach ($ids as $id) {
$links[] = '<a href="' . get_edit_post_link($id) . '">' . get_the_title($id) . '</a>';
}
$text .= ' ' . implode(', ', $links);
acf_add_admin_notice($text, 'success');
return;
}
$ids = array();
if (isset($_GET['acfduplicate'])) {
$ids[] = intval($_GET['acfduplicate']);
} elseif (isset($_GET['post'], $_GET['action2']) && $_GET['action2'] === 'acfduplicate') {
$ids = array_map('intval', $_GET['post']);
}
if ($ids) {
check_admin_referer('bulk-posts');
$new_ids = array();
foreach ($ids as $id) {
$field_group = acf_duplicate_field_group($id);
$new_ids[] = $field_group['ID'];
}
wp_redirect($this->get_admin_url('&acfduplicatecomplete=' . implode(',', $new_ids)));
exit;
}
}
public function check_sync()
{
if (isset($_GET['acfsynccomplete'])) {
$ids = array_map('intval', explode(',', $_GET['acfsynccomplete']));
$text = sprintf(_n('Field group synchronised.', '%s field groups synchronised.', count($ids), 'acf'), count($ids));
$links = array();
foreach ($ids as $id) {
$links[] = '<a href="' . get_edit_post_link($id) . '">' . get_the_title($id) . '</a>';
}
$text .= ' ' . implode(', ', $links);
acf_add_admin_notice($text, 'success');
return;
}
$keys = array();
if (isset($_GET['acfsync'])) {
$keys[] = sanitize_text_field($_GET['acfsync']);
} elseif (isset($_GET['post'], $_GET['action2']) && $_GET['action2'] === 'acfsync') {
$keys = array_map('sanitize_text_field', $_GET['post']);
}
if ($keys && $this->sync) {
check_admin_referer('bulk-posts');
acf_update_setting('json', false);
$files = acf_get_local_json_files();
$new_ids = array();
foreach ($this->sync as $key => $field_group) {
if ($field_group['key'] && in_array($field_group['key'], $keys)) {
} elseif ($field_group['ID'] && in_array($field_group['ID'], $keys)) {
} else {
continue;
}
$local_field_group = json_decode(file_get_contents($files[$key]), true);
$local_field_group['ID'] = $field_group['ID'];
$result = acf_import_field_group($local_field_group);
$new_ids[] = $result['ID'];
}
wp_redirect($this->get_current_admin_url('&acfsynccomplete=' . implode(',', $new_ids)));
exit;
}
}
public function admin_table_views($views)
{
global $wp_list_table, $wp_query;
$count = count($this->sync);
if ($count) {
$views['sync'] = sprintf('<a %s href="%s">%s <span class="count">(%s)</span></a>', $this->view === 'sync' ? 'class="current"' : '', esc_url($this->get_admin_url('&post_status=sync')), esc_html(__('Sync available', 'acf')), $count);
}
if ($this->view === 'sync') {
$wp_list_table->set_pagination_args(array('total_items' => $count, 'total_pages' => 1, 'per_page' => $count));
$wp_query->post_count = 1;
}
return $views;
}
function admin_footer()
{
?>
<script type="text/javascript">
(function($){
// Displays a modal comparing local changes.
function reviewSync( props ) {
var modal = acf.newModal({
title: acf.__('Review local JSON changes'),
content: '<p class="acf-modal-feedback"><i class="acf-loading"></i> ' + acf.__('Loading diff') + '</p>',
toolbar: '<a href="' + props.href + '" class="button button-primary button-sync-changes disabled">' + acf.__('Sync changes') + '</a>',
});
// Call AJAX.
var xhr = $.ajax({
url: acf.get('ajaxurl'),
method: 'POST',
dataType: 'json',
data: acf.prepareForAjax({
action: 'acf/ajax/local_json_diff',
id: props.id
})
})
.done(function( data, textStatus, jqXHR ) {
modal.content( data.html );
modal.$('.button-sync-changes').removeClass('disabled');
})
.fail(function( jqXHR, textStatus, errorThrown ) {
if( error = acf.getXhrError(jqXHR) ) {
modal.content( '<p class="acf-modal-feedback error">' + error + '</p>' );
}
});
}
// Add event listener.
$(document).on('click', 'a[data-event="review-sync"]', function( e ){
e.preventDefault();
reviewSync( $(this).data() );
});
})(jQuery);
</script>
<?php
}
public function admin_footer__sync()
{
global $wp_list_table;
$columns = $wp_list_table->get_columns();
$hidden = get_hidden_columns($wp_list_table->screen);
?>
<div style="display: none;">
<table>
<tbody id="acf-the-list">
<?php
foreach ($this->sync as $k => $field_group) {
echo '<tr>';
foreach ($columns as $column_name => $column_label) {
$el = 'td';
if ($column_name === 'cb') {
$el = 'th';
$classes = 'check-column';
$column_label = '';
} elseif ($column_name === 'title') {
$classes = "{$column_name} column-{$column_name} column-primary";
} else {
$classes = "{$column_name} column-{$column_name}";
}
if (in_array($column_name, $hidden, true)) {
$classes .= ' hidden';
}
echo "<{$el} class=\"{$classes}\" data-colname=\"{$column_label}\">";
switch ($column_name) {
case 'cb':
echo '<label for="cb-select-' . esc_attr($k) . '" class="screen-reader-text">' . esc_html(sprintf(__('Select %s', 'acf'), $field_group['title'])) . '</label>';
echo '<input id="cb-select-' . esc_attr($k) . '" type="checkbox" value="' . esc_attr($k) . '" name="post[]">';
break;
case 'title':
$post_state = '';
if (!$field_group['active']) {
$post_state = ' — <span class="post-state">' . $this->get_disabled_post_state() . '</span>';
}
echo '<strong><span class="row-title">' . esc_html($field_group['title']) . '</span>' . $post_state . '</strong>';
echo '<div class="row-actions"><span class="file acf-secondary-text">' . $this->get_human_readable_file_location($field_group['local_file']) . '</span></div>';
echo '<button type="button" class="toggle-row"><span class="screen-reader-text">Show more details</span></button>';
break;
default:
$this->render_admin_table_column($column_name, $field_group);
break;
}
echo "</{$el}>";
}
echo '</tr>';
}
?>
</tbody>
</table>
</div>
<script type="text/javascript">
(function($){
$('#the-list').html( $('#acf-the-list').children() );
})(jQuery);
</script>
<?php
}
public function trashed_post($post_id)
{
if (get_post_type($post_id) === 'acf-field-group') {
acf_trash_field_group($post_id);
}
}
public function untrashed_post($post_id)
{
if (get_post_type($post_id) === 'acf-field-group') {
acf_untrash_field_group($post_id);
}
}
public function deleted_post($post_id)
{
if (get_post_type($post_id) === 'acf-field-group') {
acf_delete_field_group($post_id);
}
}
}
acf_new_instance('ACF_Admin_Field_Groups');
}