在WordPress高级自定义字段PRO中添加行到嵌套的重复器

rjzwgtxy  于 2023-10-16  发布在  WordPress
关注(0)|答案(4)|浏览(144)

我正在运行ACF PRO 5.3.9.2,但我认为这适用于任何带有嵌套中继器的版本。我希望使用update_field()update_sub_field()函数向嵌套的repeater(即repeater内部的repeater)添加行。
update_field()函数适用于一级中继器行,即:

update_field( $field_key, $value, $postID );

但我不确定如何将其用于嵌套中继器。这是ACF字段结构:

CUSTOM POST TYPE
    Repeater Field - "Media"
         Repeater Field - "Notes"

下面是我正在尝试的代码:

$field_key = "field_xxxxxxxxxxxxx"; //NOTES FIELD KEY
$value = get_field($field_key, 12); //GET FIELDS OF POST ID 12, NOTES
$value[] = array("note" => "Here is a new note");
update_field( $field_key, $value, 12 );

但这没有任何作用。有没有办法确定 * 哪个 *“媒体”中继器我希望添加一个“注意”。
我可以使用update_sub_field()成功地“更新”嵌套的repeater字段,就像下面的代码IF和only如果在嵌套的repeater字段中有一行,但它只覆盖一行,不能添加到它。如果中继器中当前没有行,它也将不起作用。

update_sub_field( array('media', 1, 'notes', 2, 'note'), 'Here is a new note!', $postID );

我该怎么做才能向嵌套的repeater添加行,不管是否已经有行了?

c0vxltue

c0vxltue1#

我能够用ACF的函数和常规的好的老PHP的组合来完成这一点。我找不到其他方法,但我读过其他帖子,人们提到这个方法,尽管他们没有详细说明或显示代码,所以这里是我冗长的步骤来实现这一点:
1.获取父中继器的整个阵列
1.循环执行,直到找到要编辑的嵌套repeater所在的行
1.判断它是否是一个数组(如果不是,就把它变成一个数组)
1.使用array_push()追加子中继器行
1.使用update_field()再次保存整个父数组
为了帮助说明父/子关系,请记住我有一个名为media的repeater字段和一个名为notes的嵌套repeater,它只有一个子字段note。所以如果我使用get_field('media'),这是它将返回的数组:

Array
(
    [0] => Array
        (
          [media_title] => 'title 1',
          [notes] => Array
            (
                [0] => Array
                    (
                        [note] => 'HERE IS THE NOTE ADDED'
                    )

                [1] => Array
                    (
                        [note] => 'Here is another note added!'
                    )
            )
    )
    [1] => Array
        (
          [media_title] => 'title 2',
          [notes] => 
    )
 )

所以,在这个例子中,我在父中继器中有2个元素,其中一个在嵌套中继器中有2个元素,另一个在嵌套中继器中没有元素。这一点很重要,因为您需要确定嵌套中继器中是否已经建立了数组,然后才能向其添加。

//LOOP THROUGH PARENT REPEATER
if( have_rows('media_item', $postID) ): 

    //SET YOUR ROW COUNTER
    $i = 0;

    //MAKE YOUR NEW ARRAY
    $media_item = get_field('media_item', $postID); 

    while( have_rows('media_item', $postID) ) : the_row();          
        if($i == $arrayRowID) { //IF THIS IS THE ROW WE WANT TO EDIT IN PARENT REPEATER                 
            //FIND OUT IF IT IS AN ARRAY ALREADY OR NOT
            if( !is_array($media_item[$i]['notes']) ) {  //WE DONT HAVE ANY NOTES
                $media_item[$i]['notes'] = array();             
            }               
            $addRow = array( //SET YOUR NEW ROW HERE
                'note' => 'This is my new note added!';
            );                  
            //ADD TO ARRAY
            array_push($media_item[$i]['notes'], $addRow);              
        }           
    $i++;
    endwhile;
endif;

因此,我使用$i作为计数器来确定我需要父中继器中的哪一行。如果它是数组中的第二项$i = 1,因为数组从0开始。你还必须在这个函数中输入你的post ID,但希望这是有意义的。如果您的父中继器或子中继器有许多行,请小心,为了保存它,您必须用刚刚创建的新中继器覆盖整个父中继器阵列:

$field_key = "field_xxxxxxxxxxxxx" //FIELD KEY OF PARENT REPEATER 'media'
update_field($field_key, $media_item, $postID);

这将保存新数组,其中包含附加到子中继器的行。我希望这能帮助到一些人,因为我找不到任何涵盖这种方法的例子。我想添加一个功能到ACF像add_row()它的工程嵌套中继器!

a7qyws3x

a7qyws3x2#

这是我自己做的,希望对你们有用。
我做了一个函数,它接受参数并在特定的post(按id获取)中插入一个具有自己字段的repeater,并在此repeater中插入另一个或多个(因为它是repeater)具有自己字段的subrepeater。
如果我有这样的东西:
Spoiler(Repeater)

  • Nombre Spoiler(input)
  • Spoiler Tag(输入)
  • Enlaces(副中继器)
  • Nombre Enlace(输入)
    Enlace(input)
    有了这个功能,我可以插入X“扰流板“和X“鞋带“的
    这里的函数:
function insert_field_subfield($repeater_field, $repeater_subfield, $field_values, $subfield_values, $field_key, $postid){

if(get_field($field_key, $postid)){
    $value = get_field($field_key, $postid);
}else{
    $value = array();
}
$value[] = $field_values;

if(update_field( $field_key, $value, $postid)){

    $i = 0;

    if( have_rows($repeater_field, $postid) ){

        $spoiler_item = get_field($repeater_field, $postid);
        $total_rows = count(get_field($repeater_field, $postid)) -1;

        while( have_rows($repeater_field, $postid) ) : the_row(); 

            if($i == ($total_rows)){

                if( !is_array($spoiler_item[$i][$repeater_subfield]) ) {

                    $spoiler_item[$i][$repeater_subfield] = array();             
                }

                if (count($subfield_values) == count($subfield_values, COUNT_RECURSIVE)){ // subfield_values is not multidimensional

                    array_push($spoiler_item[$i][$repeater_subfield], $subfield_values);

                }else{ // subfield_values is multidimensional

                  foreach($subfield_values as $subfield_value){

                    array_push($spoiler_item[$i][$repeater_subfield], $subfield_value);

                  }

                } 
            }
            $i++;

        endwhile;

    if(update_field($field_key, $spoiler_item, $postid)){
        return true;
    }else{
        return false;
    }

}

}else{
    return false;
}}

拨打电话:

$addField = array("nombre_spoiler" => "Otro nombre", "spoiler_tag" => "Spoiler tag");

对于子中继器内的一个值:

$addSubField = array( 
'nombre_enlace' => 'Valor de un array no multidimensional',
'enlace' => 'Valor enlace');

对于多个值:

$addSubField[] = array( 
'nombre_enlace' => 'multidimensional',
'enlace' => 'Valor enlace');

$addSubField[] = array( 
'nombre_enlace' => '2 multidimensional',
'enlace' => 'Valor enlace 2');

现在的电话:

insert_field_subfield('spoiler', 'enlaces', $addField, $addSubField, 'field_586155ce49bf8', 21267);
insert_field_subfield('spoiler', 'enlaces', $addField, $addSubField, 'field_586155ce49bf8', 21267);

我希望这将是有用的人!
P.S.我它不是完美的,因为我不控制第二中继器,但这是没有ACF API的东西。
P.S. field_key是第一个中继器的字段密钥。

tkqqtvp1

tkqqtvp13#

当我有一个嵌套的repeater时,最终对我起作用的是使用add_row和父字段名作为前缀。例如,当我将字段documents嵌套在字段builtdocuments中时,我可以使用

$sub_fields = array(
    'current_document'   => "encrypted_file"
);  
  
add_row( 'builtdocuments_document', $sub_fields);

成功添加到嵌套中继器

h9a6wy2h

h9a6wy2h4#

我完全意识到这个答案晚了7年,但我认为这对每个尝试这个的人都有帮助。你不需要创建一个自定义函数(也许你7年前做过),ACF有添加和更新子字段的函数(甚至是嵌套的中继器)。
要更新一个嵌套的repeater,使用update_sub_field(),就像在最初的帖子中提到的那样。

update_sub_field( array('media', 1, 'notes', 2, 'note'), 'Here is a new note!', $postID );

要添加新行,请使用add_sub_row()

add_sub_row( array('media', 1, 'notes'), $note_vals, $postID );

$note_vals可以是一个字段数组,如果'notes'有sub_fields,如果没有sub_fields,则为一个值。
我花了很长时间才发现,所以我希望它能帮助你。

相关问题