我正在创建一个导入脚本,从客户端提供的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;
代码逐行分解:
- 我检查一下这个产品是否分配了任何相关的零件
- 我将关联零件的管道分隔列表转换为数组
- 我取消设置将用于存储post ID的数组的数组。我这样做是为了在我们开始处理第二个产品时,第一个产品的相关零件不会仍然存储在阵列中
- 我开始循环浏览相关部分的数组。此数组中的每个项目都包含关联零件的标题。为了做到这一点,标题必须拼写、格式化,并在所有其他方面与WordPress帖子的标题相同
- 与3相同,只是现在它适用于这个特定的关联零件
- 添加这一行是为了确保如果数组的项是空字符串,我不会搜索关联的部分
- 我检索与这个特定关联项目的标题匹配的WordPress帖子项目
- 我将关联产品的ID添加到一个数字数组中
- 关闭第6行的if语句
- 结束关联的产品循环
- 从我们的post ID数组中筛选出任何空字符串或null值
- 我们将包含post ID的数字数组传递到Advanced Custom Fields"update_field()"函数中。第一个参数是Post Object自定义字段的唯一字段键。第二个参数是关联产品ID的数组。第三个参数是我们正在编辑的产品的ID
- 关闭第1行的if语句
我不得不猜测字段值需要使用的格式。起初,我尝试传入一个Post对象数组,但没有成功。在WordPress帖子编辑器中,我检查了代码,发现他们的输入字段(当选择另一个帖子时)的值就是帖子ID。在切换到包含帖子ID的数字数组后,update_field()函数完美地接受了它们,没有发生任何意外。
我们完了。