2016-07-14 85 views
1

我正在运行ACF PRO 5.3.9.2,但我认为这适用于带嵌套中继器的任何版本。我希望使用update_field()update_sub_field()函数将行添加到嵌套中继器(即中继器内的中继器)。在Wordpress高级自定义字段中添加行到嵌套中继器PRO

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

但这没什么。没有办法确定WHICH“媒体”中继器我希望添加一个“注释”。

我可以使用update_sub_field()像下面的IF代码一样成功地“更新”嵌套的中继器字段,并且只有在嵌套的中继器字段中存在一行时,它才会覆盖一行而无法添加。如果转发器中没有一行,它也不会工作。

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

我能做些什么来添加行到嵌套的中继器是否有一行已经或没有?

回答

1

我能够通过ACF的功能和常规的旧版PHP的结合来实现这一点。我无法找到另一种方法,但我读其他职位,人们暗示这种方法,虽然他们不详细或不显示代码,所以这里是我的啰嗦的步骤来实现:

  1. 获得整个你的父母中继
  2. 环路的阵列通过,直到你打你要编辑
  3. 图,如果它是一个数组或没有嵌套转发行(如果不是,让一个数组)
  4. 使用array_push()附加儿童中继器行
  5. 保存整个父数组ag艾因使用update_field()

为了帮助说明的父/子关系,记得我有一个名为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

这是我为我制作的,我希望它对你们有用。

我做了一个函数,它接受参数并在特定帖子(由id提取)中插入一个带有自己字段的中继器,并且在此中继器中插入另一个或多个带有自己的字段的一个或多个(因为它是中继器)subrepeater。

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

扰流器(Repeater)

------------农布雷扰流板(输入)

----- -------扰流板标签(输入)

------------ ENLACES(副中继器)

------------ ------------- 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是第一个中继器的字段密钥。

相关问题