簡體   English   中英

WordPress:無法在wp_insert_post之后設置帖子的ACF轉發器字段

[英]Wordpress: Cannot set ACF repeater field of a post after wp_insert_post

我現在正在使用WordPress高級自定義字段插件: http : //www.advancedcustomfields.com/

然后在自定義的post_type sales_order上設置中繼器字段rows

然后,現在使用腳本插入帖子:

$post_id = wp_insert_post(array(
    'post_title' => $title,
    'post_name' => $slug,
    'post_content' => $content,
    'post_type' => 'sales_order',
    'post_status' => 'publish',
));

但是當我這樣做時:

update_field('rows', array(), $post_id);

沒有作用。

但是,如果我先手動將帖子保存在管理面板中,然后調用update_field方法,則它可以工作。


因此,我嘗試監視wp_postmeta數據庫表,發現如果我使用腳本調用wp_insert_post ,則該帖子不會生成元

| meta_key | meta_value          |
|----------|---------------------|
| _rows    | field_568e7aeb22714 |

正確地。

但是我必須使用純腳本來執行導入工作流,如何解決這個問題?

您正在傳遞field_nameupdate_field需要field_key如文檔所述update_field

考慮這個例子

update_field('field_568e7aeb22714', array(), $post_id);

最后,我根據來源提出了解決方案。


原因:

為什么以下操作失敗?

update_field('rows', array(), $post_id);

現在我們使用的是字段名 ,而不是字段鍵

在這種情況下,ACF將執行以下操作:

  1. 嘗試找到具有meta_key_rows的當前帖子元,該元后在字段名之前加一個反斜杠。
  2. 之后,獲取該meta_value ,它應該是具有像field_XXXXXXX這樣的格式的字段鍵
  3. 使用已建立的field_key更新該字段。

現在我們知道,如果我們以這種方式執行wp_insert_post ,則_rows meta不會生成正確的meta_value

因此,如果我們在管理面板中更新帖子,則將提交字段鍵並生成正確的meta_value

結論: 只有 meta值的問題。


解:

因此,實際上,我們要做的唯一的事情就是設置在ACF字段集中定義的meta_values綁定到指定的post_type

下面的例程可以解決此問題:

// The current post_type to search
$post_type = 'sales_order';

$post_id = wp_insert_post(array(
    'post_title' => $title,
    'post_name' => $slug,
    'post_content' => $content,
    'post_type' => $post_type,
    'post_status' => 'publish',
));

foreach (get_posts(array('post_type' => 'acf', 'posts_per_page' => -1)) as $acf) {
    $meta = get_post_meta($acf->ID);
    $rule = unserialize($meta['rule'][0]);
    if($rule['param'] == 'post_type' &&
        $rule['operator'] == '==' &&
        $rule['value'] == $post_type) {
        foreach($meta as $key => $field) {
            if(substr($key, 0, 6) == 'field_') {
                $field = unserialize($field[0]);
                update_post_meta($post_id, '_'.$field['name'], $key);
            }
        }
    }
}

注意,我們遍歷所有定義的ACF帖子,並檢查rule meta,以確認它是否限制在指定的post_type

如果是這樣,循環所有ACF元數據以field_開頭,並在當前帖子上設置元數據。

全部做完。

$i = 0; //for metakey
$j=0; //files Count

foreach($files as $fileid){
    $j++;
    $meta_key = 'files_'.$i.'_file';
    //"files" repeater main name and "file" subname ;
    update_post_meta($post_id,$meta_key,$fileid);
    $i++;

}
update_post_meta($post_id,'files',$j);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM