Список доступных опций ACF Flexible Layout

Я работаю над созданием системы настроек для установки WordPress, где супер-администраторы могут отключить некоторые макеты ACF Flexible Content, если они не нужны для текущего сайта, без изменения структуры плагина.

Я ищу способ перечислить все доступные гибкие макеты содержимого ACF на новой странице администратора.

Просмотрев папки плагина, я нашел следующий код внутри class-acf-field-flexible-content.php:

<script type="text-html" class="tmpl-popup"><?php
?><div class="acf-fc-popup"><ul><?php foreach( $layouts as $layout ):

$atts = array(
'href'            => '#',
'data-layout'    => $layout['name'],
'data-min'         => $layout['min'],
'data-max'         => $layout['max'],
);

?><li><a <?php acf_esc_attr_e( $atts ); ?>><?php echo $layout['label']; ?></a></li><?php

endforeach; ?></ul></div>
</script>

Который создает список доступных макетов для клиента для использования при создании новых сообщений / страниц.

Кто-нибудь знает простой способ, которым я могу создать массив макетов ACF в PHP, который я могу просто отобразить на другой странице внутри WP Admin?

Извините, у меня нет кода для показа, это немного уникальный запрос

5

Решение

Я нашел решение, которое на странице настроек будет отображать все имена гибких макетов контента вместе с флажком, где вы можете отменить выбор, какие макеты удаляются из списка, когда вы нажимаете кнопку «Добавить», когда пытаетесь добавить новый макет.

В качестве краткого введения я использовал acf-json, чтобы получить все имена гибких макетов, а затем создал другой файл json, который содержит имена макетов, которые я хочу отключить. Затем я запускаю функцию, которая просматривает каждое имя макета, проверяет, нет ли его в списке отключенных, и если оно есть, оно будет удалено.

Для начала я инициализировал локальный JSON в ACF. Для этого следуйте инструкциям на https://www.advancedcustomfields.com/resources/local-json/.

Затем я создал новую страницу настроек в functions.php:

<?php
function add_theme_menu_item()
{
add_options_page("Flexible Layouts", "Flexible Layouts", "manage_options", "flexible-layouts", "theme_settings_page", null, 99);
}

add_action("admin_menu", "add_theme_menu_item");
?>

В пределах theme_settings_page функция, вам нужно будет декодировать JSON для гибкой группы содержимого:

<?php
$jsonURL = get_template_directory_uri(). "/acf-json/flexible_content_group.json";
$contents = file_get_contents("{$jsonURL}");
$data =  json_decode($contents);
?>

Затем я проделал то же самое с файлом JSON, который содержал бы все отключенные поля (я вскоре объясню, как этот файл создается):

<?php
$jsonDisabledFieldsURL = get_template_directory_uri(). "/acf-json/disabledFields.json";
$disabledFieldsContents = file_get_contents("{$jsonDisabledFieldsURL}");
$disabledFieldsData =  json_decode($disabledFieldsContents);
?>

Затем я поместил все имена макетов в массив $availableOptions:

<?php
$availableOptions = [];
foreach($data->fields as $field) {
foreach($field->layouts as $layout) {
array_push($availableOptions, $layout->name);
}
}
?>

Поэтому нам нужен список всех полей с флажками и кнопкой отправки. С помощью кнопки отправки я использовал ajax для публикации отключенных полей, которые я поместил в массив:

<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/js/lib/sweetalert2.js"></script>
<script>
jQuery('.submit_json_handler').click(function(e){
e.preventDefault();
var self = jQuery(this);
var array = [];

jQuery('input:checkbox:not(:checked)').each(function() {
array.push(jQuery(this).val());
});

jQuery.ajax({
type:'POST',
url:'<?php echo get_template_directory_uri(); ?>/acf-json/custom_json_handler.php',
data: {
'disabled_fields' : array
},
success:function(data){
console.log(data);
swal(
'Success!',
'The active layouts have now been updated.',
'success'
)
}
});
});
</script>

Я использовал плагин SweetAlert2 (https://sweetalert2.github.io/) для обработки сообщения об успехе, когда поля были изменены.

Мой код для custom_json_handler.php получает опубликованные отключенные поля и помещает их в массив. Затем массив кодируется в файл JSON, о котором говорилось ранее (disabledFields.json):

<?php
$disabledFields = $_POST['disabled_fields'];
$disabledFieldsArray = [];

try {

foreach($disabledFields as $field) {
array_push($disabledFieldsArray, $field);
}

$fp = fopen($_SERVER['DOCUMENT_ROOT']."/wp-content/themes/pblite-theme/acf-json/disabledFields.json","wb");
fwrite($fp,json_encode($disabledFieldsArray));
fclose($fp);

}
catch(Exception $e) {
return $e;
}

echo "Success!";
?>

Последняя часть головоломки в функции theme_settings_page — это создание формы, которая будет показывать все макеты с флажками рядом с ними, которые можно проверять / снимать с проверки на основе выбранных отключенных полей:

<?php
$activeLayouts = array_diff($availableOptions, $disabledFieldsData);

echo "<form action=\"post\">";
echo "<table>";
foreach($data->fields as $field) {

foreach($field->layouts as $layout) {

if(in_array($layout->name, $activeLayouts)) {
$checked = "checked";
} else {
$checked = "";
}

echo "<tr><td><input type=\"checkbox\" {$checked} name=\"disabled_flexible_layouts[]\" value=\"{$layout->name}\" /></td><td>{$layout->label}</td></tr>";

}

}

echo "</table>";
echo "<p class=\"submit\"><input type=\"button\" value=\"Submit\" name=\"submit\" class=\"button button-primary submit_json_handler\" /></p>";
echo "</form>";
?>

Это даст вам список макетов, где отключенные поля будут не отмечены.

Наконец, мне нужно было использовать отключенные поля JSON, чтобы удалить элементы списка в кнопке «Добавить» на странице, где вы выбираете макет. Для этого я создал еще одну функцию внутри functions.php который зацепляет acf/input/admin_head (поэтому функция будет забавной, когда присутствует ACF):

<?php

function acf_admin_head_layout( $field ) {

?>

<script type="text/javascript">

(function($) {

$(document).ready(function(){

$.get('<?php echo get_template_directory_uri(); ?>/acf-json/disabledFields.json', function(data) {

// alert(data);
$.each(data, function(i, item) {

tmpl = $('.tmpl-popup').html();

//Create jQuery object
tmplDiv = $('<div>', {html : tmpl});

//Target element and remove it
tmplDiv.find('a[data-layout="'+item+'"]').closest('li').remove();

tmpl = tmplDiv.html();

$('.tmpl-popup').replaceWith('<script type="text-html" class="tmpl-popup">'+tmpl+'</sc'+'ript>');

});

});

});

})(jQuery);

</script>

<?php

}

add_action('acf/input/admin_head', 'acf_admin_head_layout', 10, 1);

?>

Это найдет класс на странице, где находится строка, содержащая параметры макета, преобразует это в HTML, чтобы мы могли манипулировать содержимым и сохранять его во временной переменной. Затем мы перебираем каждое из отключенных полей, присутствующих в файле JSON, и пытаемся найти совпадение в атрибуте компоновки данных, и, если есть совпадение, то элемент списка шкафов (его родитель) будет удален.

Затем мы должны добавить обратно в <script> теги и поместите обратно на страницу, чтобы использовался только что очищенный список, а не старый.

Как только все это будет сделано, у вас должна появиться область в вашем меню настроек, где у вас есть все ваши макеты, которые вы можете включить / отключить. После этого вы сможете добавить / отредактировать страницу и выбрать Add кнопку, и вы должны увидеть только макеты, которые вы выбрали на странице настроек.

2

Другие решения

Итак, похоже, что вы ищете, это ниже:

  • На веб-сайте клиентов есть настраиваемое поле, в котором перечислены несколько вариантов, которые можно выбрать, чтобы изменить макет страницы (вроде шаблона).
  • Вы хотите иметь возможность отключить определенные макеты для определенного сайта клиента без редактирования настраиваемого поля и / или кода плагина.

Мой ответ на это будет использовать Плагин роли пользователя ACF и ограничьте учетные записи, которые могут видеть определенные поля, т.е. ограничьте поля только вашей ролью пользователя, так что только у вас есть доступ к ней (возможно, придется создать новую роль пользователя, если они имеют ту же роль, что и вы).

Затем вы захотите добавить к вашим текущим настраиваемым полям еще один раздел для каждого макета, который представляет собой переключатель, отображающий что-то вроде «Включить» и «Отключить». И затем вы хотите отредактировать поля макета, чтобы иметь условное форматирование, где он проверяет значение этого поля и, если оно не равно включению, то он не отображается.

  1. Установите плагин
  2. Создайте поле переключателя с опциями включения / выключения
  3. Ограничьте роль пользователя, которая может видеть поле переключателя
  4. Добавьте кондиционирование к макетам, чтобы отображать их только тогда, когда соответствующий переключатель включен
  5. Включить / отключить макеты, которые вы не хотите появляться

Дополнительные шаги — вам может понадобиться создать другую роль пользователя для этого метода, если они имеют одинаковую роль.

Существует множество плагинов, которые вы можете использовать, просто выполните поиск, чтобы создать новую роль пользователя в WordPress. Все, что вам нужно сделать, это дать ему те же разрешения, что и вашей роли, но это позволяет вам выбрать роль, которая относится только к вам, чтобы они не могли видеть поле.

Надеюсь, это поможет, если не смогу уточнить дальше.

ВАРИАНТ 2:

  1. Создайте страницу настроек, ограничьте ее просмотр супер администратором
  2. Добавить флажки на страницу параметров для отключения / включения
  3. Подключиться к выпадающему списку гибких полей
  4. Запустите оператор if для запуска удалить из массива php на флажок значение = отключить
  5. Обновите выпадающий список гибких полей
  6. Законченный

Поскольку вы довольны другим ответом, я не буду проходить через код для этого, он будет похож только на часть json и сообщение об успехе.

2

По вопросам рекламы [email protected]