我正致力于为Wordpress安装创建设置系统,如果当前网站不需要,超级管理员可以禁用某些ACF灵活内容布局,而无需修改插件的结构。
我正在寻找一种方法,在新的管理页面中列出所有可用的ACF灵活内容布局。
查看插件的文件夹后,我在<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>
内找到了以下代码:
list(AgentPayLog.objects.values('agent__id', 'account').
distinct().values('agent__id').annotate(agent_count=Count(F('agent'))).
values('agent__id', 'agent_count'))
其中构建了客户端在创建新帖子/页面时使用的可用布局列表。
有没有人知道我可以在PHP中构建一个ACF布局数组的简单方法,我可以在WP Admin中的不同页面上显示它?
抱歉,我没有真正要显示的代码,这是一个独特的请求
答案 0 :(得分:2)
所以您正在寻找的是以下内容:
我对此的回答是使用ACF User Role Plugin并限制可以查看某些字段的帐户,即将字段限制为仅限您的用户角色,这样只有您可以访问此字段(可能需要创建新用户)角色,如果他们与你有相同的角色)。
然后,您需要为当前自定义字段添加每个布局的另一部分,该部分是显示“启用”和“禁用”之类的单选按钮。然后你想编辑你的布局字段,使其具有条件格式,检查该字段的值,如果它不等于启用,则不显示。
其他步骤 - 如果此方法共享相同的角色,则可能需要为此方法创建另一个用户角色。
您可以使用多个插件,只需在wordpress中搜索创建新的用户角色。您所要做的就是为它提供与您的角色完全相同的权限,但它允许您选择仅适用于您的角色,以便他们无法看到该字段。
我希望这有帮助,如果没有,我可以进一步澄清。
选项2:
由于你对其他答案感到满意,我不会通过代码来解决这个问题,它类似于减去json部分和成功消息。
答案 1 :(得分:2)
我提出了一个解决方案,在设置页面上,将显示所有灵活的内容布局名称以及一个复选框,您可以在按下“添加&”时取消选择从列表中删除哪些布局#39;尝试添加新布局时按钮。
作为简要介绍,我使用acf-json获取所有灵活的布局名称,然后创建另一个json文件,其中包含我要禁用的布局名称。然后我运行一个查看每个布局名称的函数,检查它是否不在禁用列表中,如果是,则将被删除。
首先,我在ACF中初始化了本地JSON。为此,请按照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文件中存在的每个禁用字段并尝试在data-layout属性中找到匹配项,如果匹配,则壁橱列表项(它的父项)将被删除。
然后我们必须在<script>
标签中添加回来并放回页面,以便使用新清理的列表而不是旧清单。
完成所有操作后,您应该在设置菜单中有一个区域,您可以在其中启用/禁用所有布局。然后,您应该能够添加/编辑页面并选择Add
按钮,并且您应该只能看到在设置页面中选择的布局。