列出可用的ACF灵活布局选项

时间:2018-01-10 10:41:21

标签: php wordpress advanced-custom-fields acfpro

我正致力于为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中的不同页面上显示它?

抱歉,我没有真正要显示的代码,这是一个独特的请求

2 个答案:

答案 0 :(得分:2)

所以您正在寻找的是以下内容:

  • 客户网站有一个自定义字段,列出了多个选项供他们选择,以便更改页面布局(有点像模板)。
  • 您希望能够禁用某些客户网站的某些布局,而无需编辑自定义字段和/或插件代码。

我对此的回答是使用ACF User Role Plugin并限制可以查看某些字段的帐户,即将字段限制为仅限您的用户角色,这样只有您可以访问此字段(可能需要创建新用户)角色,如果他们与你有相同的角色)。

然后,您需要为当前自定义字段添加每个布局的另一部分,该部分是显示“启用”和“禁用”之类的单选按钮。然后你想编辑你的布局字段,使其具有条件格式,检查该字段的值,如果它不等于启用,则不显示。

  1. 安装插件
  2. 使用选项enable / disable
  3. 创建单选按钮字段
  4. 限制可以看到单选按钮字段的用户角色
  5. 在布局中添加条件仅在匹配的单选按钮等于启用
  6. 时显示
  7. 启用/禁用您不希望显示的布局
  8. 其他步骤 - 如果此方法共享相同的角色,则可能需要为此方法创建另一个用户角色。

    您可以使用多个插件,只需在wordpress中搜索创建新的用户角色。您所要做的就是为它提供与您的角色完全相同的权限,但它允许您选择仅适用于您的角色,以便他们无法看到该字段。

    我希望这有帮助,如果没有,我可以进一步澄清。

    选项2:

    1. 创建选项页面,将其视图限制为超级管理员
    2. 添加复选框到选项页面以禁用/启用
    3. 连接到灵活字段下拉列表
    4. 运行if语句以在复选框值=禁用
    5. 上运行remove from array php
    6. 更新弹性字段下拉列表
    7. 完成
    8. 由于你对其他答案感到满意,我不会通过代码来解决这个问题,它类似于减去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按钮,并且您应该只能看到在设置页面中选择的布局。