如何通过PHP修改Advanced Custom Fields Post Object字段的值


How can I modify the value of an Advanced Custom Fields Post Object field via PHP?

我正在创建一个导入脚本,从客户端提供的Excel电子表格中迁移数据,并将每一行转换为WordPress帖子。到目前为止,我已经创建了帖子,并正确填写了所有自定义字段。。。除了一个。

其中一个字段是"关联零件"。我想为这个字段使用Post对象,但我似乎找不到任何关于格式的文档,无法通过我的PHP脚本将一个Post对象(最好是多个对象)分配给这个字段的值。

下面是我用来填充"规范"中继器字段的一些代码的示例,该字段有两个子字段,标签和值。

$field_key = 'field_53ef95cead820';
$value = get_field($field_key, $postID);
foreach($specs as $spec):
    $specArray = explode(':',$spec);
    if($specArray[0] && $specArray[1]):
        $value[] = array("label" => $specArray[0], "value" => $specArray[1]);
    endif;
    ++$i;
endforeach;
update_field( $field_key, $value, $postID );

要修改关联的零件字段,我应该像这样将其设置为中继器,然后创建某种数组来填充它,还是应该使用多选选项,仍然向它传递某种数组。我很乐意选择其中一种方法,我只需要一些方法来将这些字段放入其中。

在初始导入过程中不可能添加关联产品(其他帖子),因为当您将第一个产品导入WordPress时,它的关联部分尚未创建。出于这个原因,我不得不将两个电子表格导入WordPress。

在第一次导入时,它创建了所有的post,并添加了所有出现在电子表格中的非关系自定义字段。我设置了脚本,以表格格式打印导入产品的发布ID,这使我可以轻松地将脚本输出中的所有ID一次复制并粘贴回电子表格中的"产品ID"字段。脚本检查产品ID的存在,该字段将确定它是在创建新的帖子/产品还是在更新现有帖子/产品。

导入所有产品并将其相关ID添加到电子表格后,我们开始第二次导入。我们使用了完全相同的电子表格,唯一的区别是现在它在一列中添加了WordPress ID。

        1. if($product['Associated Parts']):
        2.      $assParts = explode('|',$product['Associated Parts']);
        3.      unset($assIDs);
        4.      foreach($assParts as $assPart):
        5.          unset($assID);
        6.          if($assPart):
        7.              $assID = get_page_by_title( $assPart , 'OBJECT' , 'product' );
        8.              $assIDs[] = $assID->ID;
        9.          endif;
        10.     endforeach;
        11.     $assIDs = array_filter($assIDs);
        12.     update_field( 'field_542c5dc44272e' , $assIDs , $product['Page ID'] );
        13. endif;

代码逐行分解:

  1. 我检查一下这个产品是否分配了任何相关的零件
  2. 我将关联零件的管道分隔列表转换为数组
  3. 我取消设置将用于存储post ID的数组的数组。我这样做是为了在我们开始处理第二个产品时,第一个产品的相关零件不会仍然存储在阵列中
  4. 我开始循环浏览相关部分的数组。此数组中的每个项目都包含关联零件的标题。为了做到这一点,标题必须拼写、格式化,并在所有其他方面与WordPress帖子的标题相同
  5. 与3相同,只是现在它适用于这个特定的关联零件
  6. 添加这一行是为了确保如果数组的项是空字符串,我不会搜索关联的部分
  7. 我检索与这个特定关联项目的标题匹配的WordPress帖子项目
  8. 我将关联产品的ID添加到一个数字数组中
  9. 关闭第6行的if语句
  10. 结束关联的产品循环
  11. 从我们的post ID数组中筛选出任何空字符串或null值
  12. 我们将包含post ID的数字数组传递到Advanced Custom Fields"update_field()"函数中。第一个参数是Post Object自定义字段的唯一字段键。第二个参数是关联产品ID的数组。第三个参数是我们正在编辑的产品的ID
  13. 关闭第1行的if语句

我不得不猜测字段值需要使用的格式。起初,我尝试传入一个Post对象数组,但没有成功。在WordPress帖子编辑器中,我检查了代码,发现他们的输入字段(当选择另一个帖子时)的值就是帖子ID。在切换到包含帖子ID的数字数组后,update_field()函数完美地接受了它们,没有发生任何意外。

我们完了。