【问题标题】:ACF - get all fields of a page or post (including sub fields)ACF - 获取页面或帖子的所有字段(包括子字段)
【发布时间】:2017-08-06 17:21:36
【问题描述】:

我使用 ACF pro 并且对于搜索循环,我需要将页面或帖子的所有字段(包括子字段(repeaterfield))放入数组中进行处理,这样我就可以从数组中提取“名称”和“值”之类的数据-对象。

我正在尝试“get_field_objects(mypageid);”这看起来很整洁,但它只获得第一级字段。我也需要获取子字段。

我环顾四周,现在似乎没有任何可用的 ACF 功能,但获取这些数据的最佳方法是什么?特别是因为每个子字段本身都可以有子字段。为此,我无法将头绕在循环函数上。有没有人为此写过一个循环?

任何帮助将不胜感激!

提前致谢, ANB_Seth

【问题讨论】:

  • get_fields() 将所有字段和子字段作为数组返回,然后您应该可以循环遍历它
  • 尝试在你的代码中写这个,这样你就可以正确地看到它 - "); ?>
  • 谢谢,但是……我就是不明白。 get_fields 可能会给我第一级字段,但不是子级字段,以及那些的子级字段等。我的意思是,是的,它可能会给我包装在多级数组中的那些值,但是我如何循环遍历它没有子组的“键”,因为 get_fields 似乎只给了我“名称”和“价值”,我该如何一遍又一遍地做到这一点......我很抱歉它可能非常简单,但我只是未能构建一个简单的功能来收集页面/帖子中的所有字段。这可能是我无法理解的问题:-S
  • 个人 - 当我使用 get_fields() 时,我也会得到中继器的子级字段。
  • else : 这家伙基本上有同样的问题,他想检查子字段是否有转发器:support.advancedcustomfields.com/forums/topic/…

标签: php wordpress advanced-custom-fields


【解决方案1】:

如何获取 ACF 中继字段?

在您的页面或帖子中添加以下代码

例子:

主 ACF 文件名:homepage_slider

子字段名称:slider_title、slider_description

<?php 
    if( have_rows('homepage_slider') ):
        // loop through the rows of data
        while ( have_rows('homepage_slider') ) : the_row(); 
?>
        <h3><?php the_sub_field('slider_title'); ?></h3>
        <p><?php the_sub_field('slider_description'); ?></p>
<?php
        endwhile;       
    else :      
        // no rows found        
    endif;
?>

【讨论】:

  • 感谢您的帖子...我尝试过类似的东西。但问题是:如果我这样做,我必须知道字段名称(在您的示例中为“slider_title”和“slider_description”)。但我不认识他们。事实上,我需要找到它们,以及每个字段的所有其他数据,如值、类型等,无论是普通字段还是子字段。我需要一个循环,将页面/帖子的每个字段和子字段作为对象(“id”、“type”、“name”、“value”等)放入数组中
【解决方案2】:

好的,所以我自己研究了这个似乎可以解决问题的函数:

function abGetAllFields($pro_num){
    $tmpArr = get_field_objects($pro_num);
    $fillArray = array();
    foreach( $tmpArr as $tmpFieldObject ) {
        $fillArray = abGetAllFieldsCycle($fillArray, $tmpFieldObject["name"], $tmpFieldObject["value"]);
    }
    return $fillArray;
}

function abGetAllFieldsCycle($fillArray, $name, $value) {
    if (is_array($value)) {
        foreach( $value as $key => $value ) {
            $fillArray = abGetAllFieldsCycle($fillArray, $key, $value);
        }
    } else {
        array_push($fillArray, [$name, $value]);
    }
    return $fillArray;
}

$myFieldArray = abGetAllFields($pageId);

可能有更好或更简单的方法来做到这一点,但见鬼,它满足了我的需要,所以我会停在那里并想我会分享我的结果 :-)

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2021-07-10
    • 2019-11-17
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多