Php 列出可用的ACF灵活布局选项
我正在为Wordpress安装创建一个设置系统,超级管理员可以在当前网站不需要的情况下禁用一些ACF灵活的内容布局,而无需修改插件的结构 我正在寻找一种方法,以列出所有可用的ACF灵活的内容布局在一个新的管理页面 查看插件文件夹后,我在Php 列出可用的ACF灵活布局选项,php,wordpress,advanced-custom-fields,acfpro,Php,Wordpress,Advanced Custom Fields,Acfpro,我正在为Wordpress安装创建一个设置系统,超级管理员可以在当前网站不需要的情况下禁用一些ACF灵活的内容布局,而无需修改插件的结构 我正在寻找一种方法,以列出所有可用的ACF灵活的内容布局在一个新的管理页面 查看插件文件夹后,我在class acf field flexible content.php中找到了以下代码: <script type="text-html" class="tmpl-popup"><?php ?><div class="ac
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
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");
?>
它构建了一个可用布局列表,供客户端在创建新帖子/页面时使用
有没有人知道一种简单的方法,我可以用PHP构建一个ACF布局数组,我可以在WP Admin中的不同页面上显示它
很抱歉,我没有任何代码要显示,这是一个有点独特的请求,因此您似乎在寻找以下内容:
- 客户网站有一个自定义字段,列出多个选项供他们选择,以改变页面布局(有点像模板)
- 您希望能够禁用某些客户网站的某些布局,而无需编辑自定义字段和/或插件代码
既然你对另一个答案很满意,我就不讨论这个问题的代码了,除了json部分和成功消息,情况会很相似。我在设置页面上提出了一个解决方案,将在复选框旁边显示所有灵活内容版面名称,当您尝试添加新版面时,按下“添加”按钮时,您可以取消选择从列表中删除哪些版面 作为一个简短的介绍,我使用acf json获取所有灵活的布局名称,然后创建了另一个json文件,其中保存了我希望禁用的布局名称。然后我运行一个函数,查看每个布局名称,检查它是否不在禁用列表中,如果在禁用列表中,它将被删除 首先,我在ACF中初始化了本地JSON。要执行此操作,请按照上的步骤操作 然后,我在
functions.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
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");
?>
然后,我对一个JSON文件做了同样的操作,该文件将保存所有禁用的字段(我将在稍后解释如何创建此文件):
因此,我们需要一个带有复选框和提交按钮的所有字段的列表。通过“提交”按钮,我使用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>
这将在页面中找到包含布局选项的字符串所在的类,将其转换为HTML,以便我们能够操作内容并将其存储在临时变量中。然后,我们循环遍历JSON文件中存在的每个禁用字段,并尝试在data layout属性中查找匹配项,如果存在匹配项,则壁橱列表项(其父项)将被删除
然后,我们必须重新添加
标记并放回页面,以便使用新清理的列表而不是旧列表
一旦这些都完成了,您应该在设置菜单中有一个区域,您可以在其中启用/禁用所有布局。然后,您应该能够添加/编辑页面,并选择
add
按钮,您应该只看到在设置页面中选择的布局。这是一种明智的方法,当我周一回到办公室时,我们将对此进行一次尝试,我会让您知道结果。干杯,谢谢@Daniel。我创建了一个布局,其中所有字段都是有条件的,基于启用/禁用单选按钮。我已经为单选按钮设置为disabled(禁用)时创建了一个消息字段,因此如果选择了layout(布局),编辑器只会显示一条消息,说明layout(布局)已禁用。问题是,当您从编辑器中隐藏单选按钮时,它看起来像是有条件的工作中断,因为我看不到设置为disabled(禁用)时应显示的字段(我已将此测试的默认值设置为disabled)。谢谢。您好,请您为我提供一个映像,以便我检查您的字段以确保它们都正确配置(有时我们会忽略一些小问题)。您可以在此处下载我的映像的压缩包:。您将看到我已向您显示了启用/禁用单选按钮,my mess
<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>
<?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!";
?>
<?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>";
?>
<?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);
?>