Я работаю над созданием системы настроек для установки 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?
Извините, у меня нет кода для показа, это немного уникальный запрос
Я нашел решение, которое на странице настроек будет отображать все имена гибких макетов контента вместе с флажком, где вы можете отменить выбор, какие макеты удаляются из списка, когда вы нажимаете кнопку «Добавить», когда пытаетесь добавить новый макет.
В качестве краткого введения я использовал 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
кнопку, и вы должны увидеть только макеты, которые вы выбрали на странице настроек.
Итак, похоже, что вы ищете, это ниже:
Мой ответ на это будет использовать Плагин роли пользователя ACF и ограничьте учетные записи, которые могут видеть определенные поля, т.е. ограничьте поля только вашей ролью пользователя, так что только у вас есть доступ к ней (возможно, придется создать новую роль пользователя, если они имеют ту же роль, что и вы).
Затем вы захотите добавить к вашим текущим настраиваемым полям еще один раздел для каждого макета, который представляет собой переключатель, отображающий что-то вроде «Включить» и «Отключить». И затем вы хотите отредактировать поля макета, чтобы иметь условное форматирование, где он проверяет значение этого поля и, если оно не равно включению, то он не отображается.
Дополнительные шаги — вам может понадобиться создать другую роль пользователя для этого метода, если они имеют одинаковую роль.
Существует множество плагинов, которые вы можете использовать, просто выполните поиск, чтобы создать новую роль пользователя в WordPress. Все, что вам нужно сделать, это дать ему те же разрешения, что и вашей роли, но это позволяет вам выбрать роль, которая относится только к вам, чтобы они не могли видеть поле.
Надеюсь, это поможет, если не смогу уточнить дальше.
ВАРИАНТ 2:
Поскольку вы довольны другим ответом, я не буду проходить через код для этого, он будет похож только на часть json и сообщение об успехе.