php – 列出可用的ACF Flexible Layout选项
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 列出可用的ACF Flexible Layout选项,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5722字,纯文字阅读大概需要9分钟。
内容图文
![php – 列出可用的ACF Flexible Layout选项](/upload/InfoBanner/zyjiaocheng/822/8158d9df5f564d83a8d418c9a5c1130c.jpg)
我正在为Wordpress安装创建一个设置系统,如果当前网站不需要,超级管理员可以禁用某些ACF灵活内容布局,而无需修改插件的结构.
我正在寻找一种方法来列出新管理页面中所有可用的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>
其中构建了客户端在创建新帖子/页面时使用的可用布局列表.
有没有人知道一种简单的方法,我可以在PHP中构建一个ACF布局数组,我可以只在WP管理器内的不同页面上显示?
对不起,我没有任何代码可以显示,这是一个独特的请求
解决方法:
我想出了一个解决方案,在设置页面上,将显示所有灵活的内容布局名称以及一个复选框,当您尝试按下“添加”按钮时,可以取消选择从列表中删除哪些布局添加新布局.
作为简要介绍,我使用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>中添加回来.标记并放回页面,以便使用新清除的列表而不是旧清单.
完成所有操作后,您应该在设置菜单中有一个区域,您可以在其中启用/禁用所有布局.然后,您应该能够添加/编辑页面并选择“添加”按钮,您应该只能看到在设置页面中选择的布局.
内容总结
以上是互联网集市为您收集整理的php – 列出可用的ACF Flexible Layout选项全部内容,希望文章能够帮你解决php – 列出可用的ACF Flexible Layout选项所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。