WP_INSERT_POST删除以前发布的自定义元数据

时间:2019-11-22 作者:Tristan Glaw

我创建了一个名为“工资存根”的自定义帖子类型,以及两个自定义元字段“净工资”和“链接”(指向工资存根文件的链接),以及两个自定义分类法“状态”和“员工”。

我在admin中设置自定义字段,然后单击save。然后,前端的其他人检查工资存根并单击approved,此时,仅当“net pay”自定义元不为空时,才会触发wp\\u set\\u post\\u terms以将“status”从“pending”更改为“approved”,也会触发wp\\u mail以发送电子邮件。单击该批准按钮,wp\\U insert\\U post也将被触发,并为下周创建两个新的工资存根帖子,其“状态”为“待定”(ID=46),“员工”设置为与当前员工相关,并且未设置自定义元。

//Create next week\'s pay stub.
function create_next_pay_stub( $employee ) {
if ( !get_last_pay_stub( \'\', $employee, \'\' ) ) {
    $next_pay_stub = array(
    \'post_type\'    => \'pay-stub\',
    \'post_title\'   => next_pay_period(),
    \'post_status\'  => \'publish\',
    \'post_author\'  => 1,
    \'tax_input\'    => array(
        \'status\'   => 46,
        \'employee\' => $employee,
    ),
);
    $next_pay_stub_id = wp_insert_post( $next_pay_stub );
    return $next_pay_stub_id;
}
}
除了wp\\U insert\\U post功能外,所有功能都工作正常。它成功地创建了新的工资存根,并正确设置了所有内容,但删除了最新(上周)工资存根的所有自定义元,因此,“净工资”变为空,“状态”无法设置为“已批准”,因为“净工资”为空。它还创建了一个没有设置“状态”或“员工”的额外工资存根。

我知道wp\\u insert\\u post是个问题,因为如果我直接启动上面的函数,那么我刚才描述的问题也会发生。有什么想法吗?

EDIT 1 (回应WebElaine的评论):

它被连接到wp\\u error的if/else语句中,该语句在wp\\u set\\u post\\u terms被触发时检查错误。如果出现错误(条款未更改为“已批准”),则回显错误消息,否则创建\\u next\\u pay\\u stub()(以及发送通知电子邮件等其他操作)

if ( is_wp_error( $term_taxonomy_ids ) || empty( $pay_amount ) ) { // There was an error somewhere and the terms couldn\'t be set. ?>
<span class="alert-danger pay-stub-alert loop-pay-stub-alert">ERROR!</span>
<?php $success = 0; }
else { // Success! The terms were set. echo \'APPROVED!\';
$success = 1;
send_email_on_approval ( $employee_data->user_email, $employee_data->first_name, $title, $pay_amount );
}

EDIT 2 (缩小罪魁祸首):

我一直在做大量测试,只有在工资单循环中运行此函数时,问题才会出现:

function publish_announcement_on_approval () {
    $announcement_id = get_last_announcement( \'\' );
    $announcement_publish = array(
      \'ID\'           => $announcement_id,
      \'post_status\'   => \'publish\',
  );
    wp_update_post( $announcement_publish );
}
(公告只是来自WP HR Manager plugin)

这个publish_announcement_on_approval () 正在上述中调用函数wp_error 上述功能,仅在send_email_on_approval.

我原来有publish_announcement_on_approval () 包含在send_email_on_approval 作用但现在我把他们分开了,这让我意识到create_next_pay_stubnot 罪魁祸首。

我目前正在测试publish_announcement_on_approval () 超出工资存根循环。目前,该函数在循环外不起作用,但这可能是我的编码错误。因此,我目前正在研究这一问题,并将报告我的发现。

谢谢

EDIT 3 (SOLVED... 目前)

我认为这段代码是我的问题:

// use reset postdata to restore orginal query
    wp_reset_postdata();

    if ( $current_slug == $approve_slug && $success === 1 && isset ($success)  ) {
        $next_pay_stub_id = create_next_pay_stub( $term->term_id );
    }
} //this is the closing bracket of my foreach statement
我改成了

if ( $current_slug == $approve_slug && $success === 1 && isset ($success)  ) {
        $next_pay_stub_id = create_next_pay_stub( $term->term_id );
    }
} //this is the closing bracket of my foreach statement
    // use reset postdata to restore orginal query
    wp_reset_postdata();
所以我认为自从create_next_pay_stub(); 函数在之后wp_reset_postdata();, 它不在循环中,但某种程度上是。。。?当我将reset postdata放在foreach语句的右括号后时,它就可以工作了,这也解释了为什么它现在可以工作,而不是以前。

我不是WP或PHP专家,我将许多教程和google搜索结合在一起,编译了整个pay stub功能。

感谢WebElaine的帮助性评论!

1 个回复
最合适的回答,由SO网友:Tristan Glaw 整理而成

SOLVED... 目前,我认为这段代码是我的问题:

// use reset postdata to restore orginal query
    wp_reset_postdata();

    if ( $current_slug == $approve_slug && $success === 1 && isset ($success)  ) {
        $next_pay_stub_id = create_next_pay_stub( $term->term_id );
    }
} //this is the closing bracket of my foreach statement
我改成了

if ( $current_slug == $approve_slug && $success === 1 && isset ($success)  ) {
        $next_pay_stub_id = create_next_pay_stub( $term->term_id );
    }
} //this is the closing bracket of my foreach statement
    // use reset postdata to restore orginal query
    wp_reset_postdata();
所以我认为自从create_next_pay_stub(); 函数在之后wp_reset_postdata();, 它不在循环中,但某种程度上是。。。?当我将reset postdata放在foreach语句的右括号后时,它就可以工作了,这也解释了为什么它现在可以工作,而不是以前。

我不是WP或PHP专家,我将许多教程和google搜索结合在一起,编译了整个pay stub功能。

感谢WebElaine的帮助性评论!

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: