Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 列出可用的ACF灵活布局选项_Php_Wordpress_Advanced Custom Fields_Acfpro - Fatal编程技术网

Php 列出可用的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

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


很抱歉,我没有任何代码要显示,这是一个有点独特的请求

,因此您似乎在寻找以下内容:

  • 客户网站有一个自定义字段,列出多个选项供他们选择,以改变页面布局(有点像模板)
  • 您希望能够禁用某些客户网站的某些布局,而无需编辑自定义字段和/或插件代码
对此,我的答案是使用并限制可以查看某些字段的帐户,即仅将字段限制为您的用户角色,以便只有您有权访问此字段(如果他们与您具有相同的角色,则可能必须创建新的用户角色)

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

  • 安装插件
  • 创建带有启用/禁用选项的单选按钮字段
  • 限制可以查看单选按钮字段的用户角色
  • 向布局添加条件,使其仅在匹配单选按钮等于“启用”时显示
  • 启用/禁用不希望显示的布局
  • 其他步骤-如果此方法的用户角色共享相同的角色,则可能需要为此方法创建另一个用户角色

    你可以使用多个插件,只需在wordpress中搜索并创建一个新的用户角色。你所要做的就是给它与你的角色完全相同的权限,但它允许你选择一个只适用于你的角色,这样他们就看不到该字段

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

    选项2:

  • 创建选项页,将其视图限制为超级管理员
  • 将复选框添加到禁用/启用选项页面
  • 连接到灵活字段下拉列表
  • 运行if语句以运行on复选框value=disable
  • 更新“灵活字段”下拉列表
  • 完成

  • 既然你对另一个答案很满意,我就不讨论这个问题的代码了,除了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);
    
    ?>