在Wordpress高级自定义字段PRO中向嵌套转发器添加行

时间:2016-07-14 21:23:16

标签: php wordpress advanced-custom-fields

我正在运行ACF PRO 5.3.9.2,但我认为这适用于具有嵌套转发器的任何版本。我希望使用ZFupdate_field()函数将行添加到嵌套转发器(转发器内的转发器)。

update_sub_field()函数适用于第一级转发器行,即:

update_field()

但我不确定如何将它用于嵌套转发器。这是ACF Fields结构:

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

所以,这是我正在尝试的代码:

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

但这没有任何作用。无法确定 WHICH “媒体”中继器,我希望添加“注释”。

我可以使用update_sub_field()成功“更新”嵌套的转发器字段,就像IF下面的代码一样,只有在嵌套的转发器字段中有一行,但它只会覆盖一行而不能添加到它。如果转发器中当前没有行,它也将无法工作。

$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 );

无论是否已存在行,我该如何向嵌套转发器添加行?

2 个答案:

答案 0 :(得分:2)

我能够通过ACF的功能和常规的旧PHP完成此任务。我找不到另一种方法,但我读了人们提到这种方法的其他帖子,虽然他们没有详细说明或显示代码,所以这是我啰嗦的步骤来实现这个目标:

  1. 获取父转发器的整个阵列
  2. 循环直到您使用要编辑的嵌套转发器点击行
  3. 弄清楚它是否是数组(如果不是,请将其作为数组)
  4. 使用array_push()
  5. 附加子转发器行
  6. 使用update_field()
  7. 再次保存整个父数组

    为了帮助说明父/子关系,请记住我有一个名为media的转发器字段和一个名为notes的嵌套转发器,它只有1个子字段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开始。你还必须在这个函数中提供你的帖子ID,但希望它有意义。如果你的父或子中继器有很多行,要小心,为了保存它,你必须用你刚刚创建的新的中继器数组覆盖整个父中继器数组:

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

    这将使用您附加到子转发器的行保存新数组。我希望这有助于某人,因为我找不到任何涵盖此方法的示例。我希望添加到ACF的函数,如add_row(),适用于嵌套转发器!

答案 1 :(得分:1)

这就是我为我所做的,我希望它对你们有用。

我创建了一个函数,它接受参数并在特定的帖子(由id中删除)中插入一个带有自己字段的转发器,并在这个转发器中插入另一个或多个(因为它是一个转发器)subrepeater和他自己的字段。 / p>

所以,如果我有这样的事情:

扰流板(中继器)

------------ Nombre Spoiler(输入)

------------ Spoiler Tag(输入)

------------ Enlaces(Sub-Repeater)

------------------------- Nombre Enlace(输入)

------------------------- Enlace(输入)

使用此功能我可以插入X“剧透”和x“Enlaces”s

这里的功能:

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");

对于subrepeater中的一个值:

$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是第一个转发器的字段键。